Réaliser une mesure à intervalles régulier, sans delay avec un timer

Le montage :

Connecter la sortie d'une résistance variable linéaire sur la broche 2 (=X3 sur la pyboard). La résistance variable est connectée entre le 0V et le 3.3V.

Le code

Une mesure est réalisée à la fréquence voulue par utilisation d'un timer et la mesure convertie en millivolts est affichée simplement dans le terminal. Cette technique permet de libérer le microcontrôleur entre 2 mesures.

Attention !

La difficulté consiste à ne faire aucune allocation de mémoire dans la routine d'interruption : utiliser variable globale dans la routine d'interruption et limiter le code à la mesure. La gestion du calcul et affichage se faisant dans le code principal par mémorisation de la dernière mesure et comparaison avec la mesure actuelle.

# réaliser une mesure à intervalle régulier sans delay avec un timer

from upyduino import *

# creation des variables globales
mesure=0 # variable pour la mesure analogique
mesure0=0 # dernière mesure prise en compte

timerADC=timer(1) # création d'un timer
# Les timers de la pyboard sont numérotés : T1, T4, T8, T9, T10, T11, T12, T13, T14 utilisables sans soucis

def setup():

    global mesure
    timerADC.init(freq=10) # fréquence timer est 2 fois celle clignotement
    timerADC.callback(gestionADC) # appelle la fonction

    """
    # tests
    print(mesure)
    mesure=int(10).to_bytes(4)
    print(mesure)
    """
    mesure=analogRead(A2) # pour que appel soit possible depuis interruption ensuite

def loop():
    global mesure0, mesure, tension

    # gestion d'une nouvelle mesure
    if mesure0!=mesure: # si difference = si nouvelle mesure

        tension=rescale(mesure,0,4095,0,3300) # changement échelle - équiv map Arduino
        #tension=mesure*3300/4095 # calcul équivalent

        print(str(mesure)+" soit ", "{:.2f}".format(tension), " mV. ")

        mesure0=mesure # RAZ mesure0

    # placer ici le reste du code sans avoir à se soucier de la mesure !

    #timerADC.callback(None) # désactive le timer à tout moment

# fonction appelée par le timer
def gestionADC(t): # attention la fonction doit recevoir un argument
   # print("Gestion ADC") # debug

    global mesure # les variables doivent être globales pour ne pas allouer de mémoire pendant interruption

    mesure=analogRead(A2) # réalisation de la mesure brute et c'est tout ici... pas de calcul, etc. 

    # Faire le minimum = l'essentiel dans la fonction appelée par l'interruption

# exécution 
setup()
while True:loop()

Résultat

Ce qui donne :