Faire clignoter une LED sans delay() avec un timer

Pour comprendre

L'inconvénient de la fonction delay() pour temporiser un programme est son caractère bloquant : on ne peut rien faire d'autre pendant la pause.

Nous avons vu comment utiliser la fonction millis() pour contourner cela. Une autre solution, peut-être encore plus élégante est l'utilisation d'un timer de la carte.

! Pour info, sur la pyboard : ! * T2 et T3 sont utilisés par PWM des LEDS onboard ! * T5 est utilisé pour les servomoteurs ! * T6 est utilisé pour les conversion ADC/DAC ! * les timers T1, T4, T8, T9, T10, T11, T12, T13, T14 utilisables sans soucis à priori.

Le montage :

Connecter une LED via une résistance de 270 Ohms sur la broche 0 (=X1) de la pyboard :

Le code

La fonction .init() initialise le timer et la fonction .callback() reçoit la fonction à appeler à intervalle régulier. Ici, on utilise la forme "inline" avec lambda.

# faire clignoter une LED sans delay() avec un timer

from upyduino import *

LED=0
timerLED=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():

    pinMode(LED, OUTPUT)

    timerLED.init(freq=10) # fréquence timer est 2 fois celle clignotement
    timerLED.callback(lambda t: toggle(LED)) # la LED est inversée

def loop():
    pass # si vide

    # placer ici le reste du code sans avoir à se soucier du clignotement !

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

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

Variante

Voici la variante qui appelle une fonction dédiée où se trouve le code à exécuter lors de l'appel :

from upyduino import *

LED=0
timerLED=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():

    pinMode(LED, OUTPUT)

    timerLED.init(freq=10) # fréquence timer est 2 fois celle clignotement
    timerLED.callback(gestionLED) # appelle la fonction

def loop():
    pass # si vide

    # placer ici le reste du code sans avoir à se soucier du clignotement !

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

# fonction appelée par le timer
def gestionLED(t): # attention la fonction doit recevoir un argument
    toggle(LED)

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