Objectif

Construction d’un réveil avec le cahier de charge suivant :

  • Utilisation d’un afficheur TFT ST7789 en mode SPI
  • Utilisation du contrôleur Rapsberry pico W.
  • Affichage de la température intérieure et extérieure ainsi que des données météorologiques.
  • Utilisation de peu de composants.
  • Programmation en langage micropython.
  • Pouvoir accéder/modifier le programme facilement.
  • Sortir des sentiers battus avec des solutions moins connues (ntp, PWM, fichier, MF52, plices de caractères).

Tous les fichiers (applications et documentations) sont téléchargeables ICI.

Ce projet met en œuvre divers composants et techniques.
Pour aboutir au résultat on va progresser pas à pas. Les utilisateurs expérimentés peuvent passer directement à la partie 2.

Pour débuter la base hardware de travail est composée du contrôleur Raspberry pico W ainsi que l’afficheur LCD1602.

Partie 1 : Composant et Montage de base

Très peu de composants sont nécessaires. J’utilise des planches de prototypage pour démonstration de faisabilité.
A – La fonction thermomètre est assurée par le composant DHT11.
B – Un interrupteur et deux boutons poussoirs pour manipuler la fonction réveil.
C – L’afficheur LCD1602 est connecté en I2C
D – Un buzzer complète le montage.

Partie 1-a : test des composants logiciels

On utilisera plusieurs programmes afin de tester séparément les fonctions logicielles.

A – La fonction ntp qui se connecte à internet afin de récupérer l’heure GMT. Cette fonction est la base de notre réveil. On pourra travailler le logiciel pour se familiariser avec cette fonction. Ici l’écran LCD1602 n’est pas encore utilisé.  (dossier « Test ntp »)

B – La fonction scan pour détecter les matériels sur le bus I2C et en particulier l’afficheur LCD1602. (dossier « Test I2scan »)

C – La fonction requête http pour obtenir les informations météo. J’utilise les services de « api.openweathermap.org « pour récupérer des données météo concernant mon lieu d’habitation. (dossier « Test get request https»)

La souscription est l’utilisation est gratuite. Il suffit de s’inscrire, de définir ses coordonnées d’habitation pour récupérer une clé api que l’on utilisera dans la requête.

https://api.openweathermap.org/data/2.5/weather?lat=xx.xx&lon=yy.yy&appid=kkk…k&units=metric

xx.xx, yy.yy, kkk…k pour respectivement la latitude, longitude et le code api.

Le paramètre &units pourra être adapté en fonction du pays. On récupère une chaîne de caractère de laquelle on extrait la température.

{“coord”:{“lon”:xx.xx,”lat”:yy.yy},”weather”:[{“id”:804,”main”:”Clouds”,”description”:”overcast clouds”,”icon”:”04d”}],”base”:”stations”,”main”:{“temp”:10.89,”feels_like”:9.76,”temp_min”:9.93,”temp_max”:11.29,”pressure”:996,”humidity”:66},”visibility”:10000,”wind”:{“speed”:5.66,”deg”:220},”clouds”:{“all”:100},”dt”:1707663493,”sys”:{“type”:1,”id”:6595,”country”:”FR”,”sunrise”:1707633879,”sunset”:1707669718},”timezone”:3600,”id”:2973783,”name”:”S”,”cod”:200}

D’autres données peuvent également être extraites selon le besoin (pression atmosphérique, vitesse du vent, couverture nuageuse etc..).

Ce programme permet de se familiariser avec cette fonction.

Partie 1-b : La combinaison de ces composants pour programmer un réveil avec un écran LCD1602

Le programme est constitué, comme à mon habitude, de plusieurs modules dont les principaux main.py et functions.py. Le module functions.py regroupe les fonctions qui pilotent les composants (connexion Wifi, alarme, température, affichage). Le module main.py devient ainsi plus lisible.
Je laisse le lecteur découvrir cette application (dossier « pico LCD1602 ».
Ce projet est resté au stade de prototype.

Partie 1-c : Alternative avec programme sensiblement identique et un contrôleur 8266.

Mêmes commentaires que pour le paragraphe précédent.
Je laisse le lecteur découvrir cette application (dossier « esp8266 LCD1602 »).
La version micropython pour esp8266 est incluse.

Partie 2 : Le réveil avec afficheur en mode ST7789

Fort de l’expérience acquise nous allons passer au montage du réveil avec un écran TFT de 2,8 pouces.
Lors du montage diverses améliorations ont été opérées au niveau hardware et software.
Le détecteur de température a été remplacé par un thermistor MF52 moins encombrant.
L’application se trouve dans le dossier « pico ST7789 ».

Partie 2-a : Les composants, le schéma, la maquette et le montage

La mise en œuvre de l’affichage a été difficile par manque de documentation voire des documents non conformes à mon projet.

L’afficheur est piloté par une interface SPI. La dénomination des ports est différente d’un afficheur à l’autre. On trouvera sur le schéma les diverses dénominations.

Pour les polices de caractère mon choix s’est porté sur deux polices sans licences de droits (« digital » et « louis »). La taille par défaut de ces polices étant petite il a fallu trouver un moyen de les agrandir afin de bien remplir l’écran.

En téléchargement se trouve un document explicatif pour trouver et changer la taille des polices ainsi que leur conversion au format micropython (dossier « Fonts »).

Utilisation de la fonction PWM pour piloter la luminosité de l’écran.


Gestion de fichiers pour mémoriser la luminosité de l’écran (dossier “JSON” pour les tests).

Partie 2-b : Le programme

L’application comporte plusieurs modules. Le programme principal main.py se focalise sur la partie affichage. Les autres fonctions se trouvent regroupées dans le module function.py. Le module st7789.py gère les primitives de l’afficheur. Les autres modules comportent les polices de caractères.

La définition de l’écran est 240×320 et s’applique à différentes tailles d’écrans. 

Quelques détails :

Pour le contrôle de l’affichage des copies d’écrans expliquent certaines commandes. Pour obtenir d’autres fonctions il suffit d’explorer le fichier st7789.py.

La fonction alarme et la fonction « couverture nageuse » se partagent la même zone.

En cas de problème majeur (wifi non disponible, requête https en erreur) le programme effectue un « reset ». Cela évite un blocage du réveil.

Il arrive lors de la mise sous tension que l’affichage ne démarre pas tout de suite. Cela provient de la connexion wifi qui ne se fait pas. Le programme redémarre alors au bout de 80 secondes pour une nouvelle tentative qui d’avère généralement concluante !

L’alimentation du réveil se fait par un cordon USB connecté directement au Pico. Un branchement à un PC permet alors d’affiner le programme, apporter des améliorations.

Le réveil fonctionne en mode jour/nuit en alternant la couleur des informations afin d’être plus discret la nuit. Vous pourrez découvrir comment changer la luminosité dans le programme et mémoriser la valeur associée qui sera récupérée lors du redémarrage du réveil.

Le programme micropython « RPI-PICO-xxx-.uf2 » est également fourni afin d’assurer la cohérence avec l’application.

Conclusion

Ce projet ne comporte pas beaucoup de composants. Le montage est simple à réaliser. L’approche pas a pas permet de maitriser les diverses technologies utilisées. Finalement on obtient un petit réveil assez sympathique qui nous indique en plus de l’heure la température extérieure et la couverture nuageuse. Comme on peut brancher directement le réveil sur un PC on pourra adapter le programme selon ses envies. Enjoy it !

Références

Appel https

https://makeblock-micropython-api.readthedocs.io/en/latest/public_library/Third-party-libraries/urequests.html

Pilotage ST7789

https://github.com/russhughes/st7789py_mpy

Thermistor calculs

https://www.luisllamas.es/en/measure-temperature-arduino-mf52-thermistor/  et en fichier en téléchargement

Micropython fonction format

https://www.w3schools.com/python/ref_string_format.asp

https://learnpython.com/blog/python-string-formatting/

PWM pour luminosité

https://how2electronics.com/pwm-usage-in-raspberry-pi-pico-breathing-led-example/

Lire et écrire dans un fichier

https://electrocredible.com/rpi-pico-save-data-permanently-flash-micropython/

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *