Utiliser les timers de l’ESP32 avec MicroPython
(Mis à jour le 23/01/2023)
Dans cet article, nous allons explorer l’utilisation des timers sur l’ESP32 avec du MicroPython. Nous découvrirons les étapes nécessaires pour configurer un timer sur l’ESP32, ainsi que les paramètres importants pour un fonctionnement optimal. Allons-y ! 😊
Le fonctionnement d’un timer sur l’ESP32
Le fonctionnement théorique du timer n’est pas abordé dans cet article afin de le garder le plus clair possible. Si vous êtes débutant et que vous ne connaissez pas le fonctionnement interne d’un timer, je vous invite vivement à lire l’article théorique sur le fonctionnement d’un timer . Cela vous permettra de mieux comprendre comment sélectionner les bonnes valeurs des paramètres pour l’utiliser dans vos scripts Micro Python.
Configurer et utiliser un timer de l’ESP32 en MicroPython
Avec MicroPython, toute la complexité du timer est cachée : on a juste à rentrer la période du timer voulue. C’est-à-dire la durée d’attente du compteur avant qu’une interruption se déclenche.
Note
C’est encore plus simple qu’avec du code Arduino, car on n’a pas à se préoccuper des valeurs du prescaler
et de l’autoreload
, pour avoir la bonne période voulue. C’est MicroPython qui s’en charge.
Script squellete minimal
Voici un script Python squelette minimal pour utiliser un timer de l’ESP32. Il permet de déclencher l’interruption interruption_handler()
à la fin de chaque période du timer.
from machine import Timer
timer_0 = Timer(0) # Between 0-3 for ESP32
def interruption_handler(timer):
...
if __name__ == "__main__":
timer_0.init(mode=Timer.PERIODIC, period=1000, callback=interruption_handler)
Dans notre exemple, la période du timer est fixée à 1000ms soit 1 seconde. Pour utiliser un timer, on doit :
Choisir le timer hardware que l’on utilise avec
Timer(id)
. En général on crée l’objet au début du script.-
Paramétrer le timer lors de son initialisation avec la fonction
timer_0.init(mode=, period=, callback=)
qui contient les arguments suivants :Le mode
Timer.PERIODIC
pour que l’interruption se déclenche chaque fois que la période du timer est atteinte ouTimer.ONE_SHOT
pour avoir un seul déclenchementLa période du timer voulue en millisecondes
La routine d’interruption (la fonction) qui sera invoquée via l’interruption déclenchée par le timer, ici
interruption_handler
Avertissement
La période minimale du timer est d’une milliseconde en MicroPython alors qu’avec du code Arduino, on peut facilement descendre à la microseconde. Les performances des timers sont bridées pour que MicroPython puisse suivre la cadence…
Exemple : Script Blink uniquement avec un timer
Avec ce script, la LED bleue intégrée de l’ESP32 se met à clignoter toutes les secondes, sans utiliser de boucles : on peut écrire d’autres fonctions sans que le clignotement soit perturbé.
from machine import Timer, Pin
pin_led = Pin(2, mode=Pin.OUT)
timer_0 = Timer(0) # Between 0-3 for ESP32
def interruption_handler(timer):
pin_led.value(not pin_led.value())
if __name__ == "__main__":
timer_0.init(mode=Timer.PERIODIC, period=1000, callback=interruption_handler)
Ici, j’utilise une petite astuce pour inverser l’état de la LED. On récupère l’état actuel de la LED avec pin_led.value()
, soit 0 ou 1, on inverse la valeur avec l’opérateur not
. On utilise la même fonction pin_led.value()
pour actualiser la nouvelle valeur.
Exemple : Incrémenter une variable
Voici un script Python qui incrémente une variable à chaque fois que le timer déclenche une interruption. Dans la boucle principale, quand la variable vaut 10, on effectue une tâche précise.
from machine import Timer, Pin
timer_0 = Timer(0) # Between 0-3 for ESP32
timer_count = 0 # global variable
def interruption_handler(pin):
global timer_count
timer_count += 1
if __name__ == "__main__":
timer_count_old = 0
timer_0.init(mode=Timer.PERIODIC, period=100, callback=interruption_handler)
while True:
if timer_count > 10:
timer_count = 0
print("10x")
# heavy task here