Comme vous voyez, le système est constitué de 2 écrans e-paper et d'un boîtier imprimé en 3D. Mais il y a plein de choses dedans :
- Un ESP32
- Un accéléromètre MPU6050
- Un capteur DHT22
- Une batterie LiPo
- Un PCB pour connecter le tout
- Des fils duPont faits maison
et une connexion Wi-Fi. En fait 3 réseaux sont déclarés, le système les teste un par un jusqu'à réussir à se connecter. On peut en ajouter ou en ôter, c'est codé en dur dans le code.
L'idée c'est d'afficher diverses informations sur les deux écrans selon l'orientation du boîtier. Le boîtier est en forme de boîte parallélépipédique, un pavé quoi, avec une sorte de ceinture qui tient lieu de pied. Je posterai une vue 3D du boîtier bientôt.
L'accéléromètre détecte les mouvements et l'orientation et déclenche les affichages.
Pour économiser l'énergie, j'ai choisi les écrans e-paper (voir les références plus bas) qui conservent l'affichage même s'ils ne sont plus alimentés. De même pour l'ESP32, j'ai choisi le module Lolin32 (réputé pour sa frugalité) et j'ai dû apprendre la gestion du deep sleep,et le réveil sur interruption générée par l'accéléromètre.
Les écrans sont en SPI, j'ai ramé pas mal avant de trouver les bonnes pins pour les brancher sur l'ESP32, sachant que j'ai aussi besoin d'un I2C pour l'accéléromètre, d'une broche pour lire le DHT22 et de 2 autres pour la mesure de tension batterie. L'ESP32 est presque chargé à fond ! Sachant que certaines broches sont en lecture seule (utilisées pour le DHT), d'autres ne peuvent pas être utilisées avec le Wifi, ça a été un peu compliqué de trouver la bonne configuration.
La boîte peut être orientée dans 4 directions, plus posée à plat. En tout ça fait 4*2+2 = 10 types d'information possibles à afficher. Ça permet donc de faire pas mal de choses :
- La date, et le saint du jour
- L'heure
- La météo du jour
- Les prévisions météo des heures ou jours à venir
- Le niveau de charge de la batterie
- Et comme j'avais encore de la place, une citation prise au hasard sur un site Web spécialisé.
Ça fait pas mal de choses à aller chercher sur internet, et comme le dit al1fch : le WiFi c'est l'ennemi de l'économie d'énergie...
Donc il a fallu gérer la connexion, afin d'afficher des infos à jour mais sans passer trop de temps à se connecter. Un autre problème un peu complexe : conserver une heure assez précise.
Je n'ai pas besoin de RTC puisque je peux trouver l'heure sur internet, mais l'horloge interne de l' ESP32 dérive pas mal surtout pendant les périodes de sommeil. Il a fallu trouver un moyen de rester assez précis, en attendant de remettre l'horloge à l'heure par internet. Je le resynchronise sur internet toutes les heures.
Donc il y a un compromis à trouver entre l'autonomie (la fréquence des connexions internet) et la précision des informations affichées.
Autre problème a régler : la mémoire. Lorsque l'ESP32 est en sommeil profond, la mémoire est perdue, à l'exception de ce qui est appelé RTC RAM. Cette mémoire fait 4Mo, dont seulement 2 sont accessibles pour le programme. Dans cette mémoire, je dois stocker les diverses variables du programme qui doivent être conservées d'une exécution à l'autre, après une phase de sommeil : les prévisions météo, l'heure et la date, les noms des fichiers des icônes, les citations, etc. Il a fallu apprendre à gérer ça.
Parlant d'icônes, elles sont stockées dans la SPIFFS, le système de fichiers de l'ESP32. Suite à la fermeture de l'API météo gratuite de Wunderground, j'ai du chercher d'autres fournisseurs gratuits de données météo. J'en ai sélectionné deux, un pour la météo du jour, avec des prévisions à 12 heures, et un autre pour les prévisions à plusieurs jours. Les icônes n'étant pas les mêmes, ça m'a posé deux nouveaux problèmes.
- Choisir un jeu d'icône
- Établir une correspondance entre ces icônes et les codes des prévisions des 2 sites
Cette correspondance à été stockée aussi dans la RTC RAM afin de ne pas avoir à la recharger chaque fois.
Dernier problème avec les icônes. Impossible de toutes les stocker dans la SPIFFS. L'espace est trop petit pour tous mes fichiers. Il a fallu faire de la compression d'image. J'ai écrit un script en python qui lit mes fichiers d'icônes et les comprime en RLE, pour ensuite stocker les fichiers comprimés dans la SPIFFS. Là ça tenait.
Mais la bibliothèque d'affichage e-paper ne prend que des fichiers genre BMP, pas les images compressées. J'ai donc dû écrire une fonction supplémentaire pour pouvoir afficher mes icônes à partir de ces fichiers compressés.
Les données lues sur internet sont souvent au format json : données météo, Saint du jour. J'utilise la bibliothèque arduinoJson pour cela. Mais les citations ne sont pas comme ça. Je vais les chercher sur un site dédié, et il faut les lire en cherchant directement dans le contenu de la page Web. Il a fallu écrire un code spécifique pour ça. Chaque jour, vers minuit, le programme va sur ce site et lit une dizaine de citations prises au hasard, et les stocke dans la RTC RAM. On en affiche une au hasard parmi elles lorsque le boîtier est orienté grand écran vers le haut.
Je vous passe le problème de l'affichage des caractères accentués...
Lorsque c'est le petit écran qui est vers le haut, on affiche la tension de la batterie, avec un dessin pour mieux voir le niveau restant. Il a fallu faire un montage électronique pour lire la tension batterie. La mesure ne devant pas décharger la batterie, j'ai utilisé un schéma trouvé sur internet, qui utilise un transistor MOSFET comme interrupteur afin de ne consommer de courant que lorsque la mesure est faite.
C'est pour pouvoir faire ce circuit et tout rentrer dans le boîtier, que je voulais le plus petit possible, que j'ai donc dû faire un PCB pour connecter l'ensemble des composants du système. C'est mon premier PCB, formé avec une plaque à trous. J'ai eu de la chance car tout a bien fonctionné du premier coup de ce côté là...
Prévision d'implantation des composants sur le PCB : ça rentre tout juste...
La "zone interdite" est une zone réservée pour la connexion du câble USB. Le module Lolin32 permet de recharger la batterie via l'USB : la batterie se recharge si le câble USB est branché, et le module fonctionne en même temps.
Dernier point : les polices de caractères. De différentes tailles, bold ou pas, il a fallu les créer et les stocker. La bibliothèque Adafruit GFX s'occupe de ça très bien, une fois qu'on a installé les fichiers des polices dans le bon répertoire. Pour créer les fichiers, j'ai utilisé le site Font Converter, très pratique !
Donc pour résumer : gros projet, qui m'a permis d'apprendre beaucoup de choses.