Je cherchais une idée pour introduire MicroPython sur M5Stack, et il se trouve que je me suis heurté au même moment à un besoin : mon fils se réveille la nuit, et viens nous voir en demandant si c'est le matin.

Bon, rien de bien méchant, mais il existe des petits appareils (fort chers d'ailleurs) qui allument une petite case s'il fait nuit et une autre (avec des petits bonhommes dedans) s'il fait jour. Je me suis dit : pourquoi ne pas faire un de ces appareils, en plus beau, connecté et customizable avec un M5Stack ?

M5Stack

Le M5Stack est un kit de développement complet comprenant un ESP32 (micro-controleur avec wifi et bluetooth), une toute petite batterie, un écran LCD de 320x240 pixels et trois boutons. L'ESP32 supporte par chance micropython (une version pour micro-contrôleurs du fameux langage).

Le kit inclut aussi un cable usb A vers C, donc nous aurons uniquement besoin d'un alimentation USB en supplément (si vous en avez déjà une d'un ancien téléphone qui traîne, cela fait aussi l'affaire).

Les images

Pour commencer, il nous faut deux images, une image à afficher sur l'écran du M5Stack lorsqu'il fait jour, et une lorsqu'il fait nuit.

J'ai utilisé des illustrations venant de banques d'images vectorielles libres (créés par Freepik) que j'ai modifié pour mes besoins dans Inkscape, c'est à dire des compositions de 320x240, une pour le jour et une pour la nuit.

ps: On m'a fait remarquer qu'une chouette les yeux ouverts le jour était une erreur, en effet, mea culpa. N'hésitez par à proposer de meilleures illustrations :-)

Le code

Je pars du principe que vous avez un M5Stack avec M5Cloud installé et mis en place ou sa version "offline", c'est à dire sans connexion vers leur IDE installée (et donc que vous utilisez un outil type ampy pour envoyer les fichiers vers le m5stack). La mise en place de cet environnement fera l'office d'un autre tutoriel en français très prochainement :-)

Dans le fichier main.py, nous allons tout d'abord faire les imports dont nous arons besoin : les librairies du m5stack, lcd et machine, et les librairies de gestion du temps (utime/time).

from m5stack import machine
from m5stack import lcd
from time import strftime
import utime​ 

Nous itinialisons l'horloge temps réel avec le bon faisceau horaire (ici pour la France, à vous de l'ajuster si vous habitez ailleurs) :

# initialiser le RTC
rtc = machine.RTC()
print("Synchronize time from NTP server with TZ=France ...")
rtc.ntp_sync(server="hr.pool.ntp.org", tz="CET-1CEST,M3.5.0,M10.5.0/3")​ 

Nous créons une fonction watch() qui contiendra notre boucle infinie (pas une bonne méthode si vous voulez faire d'autres choses avec votre m5stack. dans notre exemple c'est ok) :

def watch():
    # on boucle...
    while True:
        if 7 <= utime.localtime()[3] < 21:
            lcd.image(0,0,"awake0.jpg")
        else:
            lcd.image(0,0,"night0.jpg")​ 

On remarque que nous vérifions d'abord si la partie de l'information horaire contenant l'heure sous forme d'entier (voir la doc, c'est donc en position 4, soit 3 en partant de 0) eest comprise entre 7 (inclusif) et 21 (exclusif) pour afficher soit "awake0.jpg" soit "night0.jpg", nos deux images. En gros, la journée est  comprise entre 7h00 et 20h59 (c'est ici que vous pourrez changer les valeurs pour votre rythme).

Ensuite, on va essayer d'afficher l'heure en tout petit en bas à droite, soit en rouge, soit en vert pour indiquer si on est synchro au serveur NTP:

# si l'horloge n'est pas synchro... on affiche l'heure en rouge, sinon en vert.
        if not rtc.synced():                                                            # set color to sync status    
            lcd.setColor(lcd.RED)
        else: 
            lcd.setColor(lcd.GREEN)
        lcd.setCursor(243, 227)
        lcd.print(utime.strftime('%H:%M:%S', utime.localtime()), lcd.RIGHT, lcd.BOTTOM, transparent=True)​ 

La dernière ligne contient, pour le premier argument du lcd.print, un appel à strftime, pour afficher les heures, minutes et secondes séparés par ":".

Enfin, on apelle utime.sleep(1) pour dormir pendant une seconde avant de recommencer la boucle.

Voici le code en entier :

J'ai préparé une archive zip contenant tous les fichiers prets à être envoyés sur le m5stack (ignorez le boot.py et le fichier de configuration si vous utilisez l'ide m5cloud, sinon, modifiez le yaml de configuration pour vos infos de connexion wifi et vous pouvez tout envoyer via ampy sur un m5stack fraichement flashé), à télécharger ici. Vous pouvez aussi modifier/forker le bout de code (gist) sur github.

La suite ?

On peut imaginer que le m5stack envoie son état en mqtt et envoie les boutons appuyés etc... pour contrôler par exemple les lampes dans la chambre. Ou encore afficher le niveau de pollution de l'air intérieur ou la temperature, voire même ajuster l'image affichée en fonction de la météo (on a accès à internet après tout). N'hésitez pas à faire part de vos propositions, idées et améliorations.