Lecture sur un port

Deux possibilités : le polling et le callback

La grande force de Pymata4 consiste à gérer intelligemment les lectures.

Le polling (sondage) est la méthode classique : dans la boucle infinie, on va lire à intervalles réguliers les valeurs sur une patte donnée.

Le callback est souvent plus efficace. Une patte initialisée en lecture va surveiller les valeurs. En cas de variation suffisante des mesures, une fonction (callback) sera exécutée. La fonction aura comme paramètres la valeur lue et la date de modification.

On retrouvera ces deux possibilités (que l’on peut coupler), que soit une lecture logique ou analogique.

Lecture logique (0 ou 1)

On utilise les méthodes set_digital_input(pin,callback) et set_digital_read(pin).

Un exemple avec un callback uniquement

from pymata4 import pymata4
import sys
import time

carte = pymata4.Pymata4()

print("--------------- Début --------------")
# Constantes
Switch = 2 # port du switch

#------------------ fonction callback appelée lors d'un changement du switch
def rapporter(data):
    pin = data[1]
    val= data[2]
    temp = data[3]
    #date = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(temp))
    date = time.strftime("%H:%M:%S", time.localtime(temp))
    if (val==1):
        print(f"Mise à ON à {date}")
    else :
        print(f"Mise à OFF à {date}")


#----------------  programme principal
try :
    carte.set_pin_mode_digital_input(Switch,callback=rapporter)
    time.sleep(1)
    while True:
        time.sleep(0.1)

except KeyboardInterrupt : # si on tape Ctl+C
    print("--------------- Fin --------------")
    carte.shutdown()
    sys.exit(0)

Un exemple par sondage

from pymata4 import pymata4
import sys
import time

carte = pymata4.Pymata4()

print("--------------- Début --------------")
# Constantes
Delai=5    # délai entre deux lectures
Switch = 2 # port du switch


#----------------  programme principal
try :
    carte.set_pin_mode_digital_input(Switch)
    time.sleep(1)
    while True:
        (val,temp) = carte.digital_read(Switch)
        #date = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(temp))
        date = time.strftime("%H:%M:%S", time.localtime(temp))
        if (val==1):
            print(f"ON depuis {date}")
        else :
            print(f"OFF depuis {date}")
        time.sleep(Delai)
except KeyboardInterrupt : # si on tape Ctl+C
    print("--------------- Fin --------------")
    carte.shutdown()
    sys.exit(0)

Lecture analogique : entre 0 et 1023

La lecture se fera sur une patte analogique A_i (Analog input) avec Pymata4.

On utilise ici les méthode set_pin_mode_analog_input(pin) et analog_read(pin).

Pour le déclenchement du callback, on utilisera le paramètre differential qui écart l’écart minimum requis entre les mesures.

Exemple avec callback

from pymata4 import pymata4
import sys
import time

carte = pymata4.Pymata4()

print("--------------- Début --------------")
# Constantes
Delai=5    # délai entre deux lectures
Light = 1 # port du capteur analogique
Sensibilite = 50 #écart entre deux valeurs mesurées pour déclencher le callback

#------------------ fonction callback appelée lors d'un changement de valeur
def rapporter(data):
    pin = data[1]
    val= data[2]
    temp = data[3]
    date = time.strftime("%H:%M:%S", time.localtime(temp))
    print(f"Nouvelle val = {val} à {date}")

#----------------  programme principal
try :
    carte.set_pin_mode_analog_input(Light,callback=rapporter,differential=Sensibilite)
    time.sleep(1)
    while True:
        time.sleep(0.1)
except KeyboardInterrupt : # si on tape Ctl+C
    print("--------------- Fin --------------")
    carte.shutdown()
    sys.exit(0)

Exemple avec sondage

from pymata4 import pymata4
import sys
import time

carte = pymata4.Pymata4()

print("--------------- Début --------------")
# Constantes
Delai=5    # délai entre deux lectures
Light = 1 # port du capteur analogique

#----------------  programme principal
try :
    carte.set_pin_mode_analog_input(Light)
    time.sleep(1)
    while True:
        (val,temp) = carte.analog_read(Light)
        date = time.strftime("%H:%M:%S", time.localtime())
        print(f"val = {val} à {date}")
        time.sleep(Delai)
except KeyboardInterrupt : # si on tape Ctl+C
    print("--------------- Fin --------------")
    carte.shutdown()
    sys.exit(0)

Retour à la rubrique