Ignorer et passer au contenu

Livraison offerte à partir de 50€ d'achats, livrée sous 48h !

Livraison à partir de seulement 2.50€ !

Contents Menu Expand Light mode Dark mode Auto light/dark mode

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 ou Timer.ONE_SHOT pour avoir un seul déclenchement

    • La 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 : 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