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 :