Logger de température et d’humidité

Dans le précédent article, j’illustrais la technique de gravure à l’anglaise pour réaliser des circuits imprimés avec un cas pratique : un logger (enregistreur) de température et d’humidité. Ce nouveau billet est l’occasion de revenir plus en détails sur ce petit projet (et de le finir 😉 ).

L’objectif est d’enregistrer à intervalles réguliers la température et l’humidité d’un environnement donné pour pouvoir les étudier, les analyser. Ça peut-être intéressant pour optimiser son chauffage, vérifier le bon fonctionnement d’un réfrigérateur, analyser un environnement naturel etc.

Nous aurons donc besoin de :

  • Un capteur de température et d’humidité, le DHT22
  • Un module de temps (sur bus I2C) qui servira de référentiel pour la date et l’heure, avec sa propre pile pour rester autonome et ne pas se désynchroniser lorsque que l’appareil sera éteint
  • Un lecteur de carte SD (sur bus SPI), pour sauvegarder les relevés et pouvoir les analyser plus tard
  • Un écran OLED (sur bus I2C), pour afficher l’ensemble des informations utiles
  • Un Arduino Nano pour piloter le tout

J’ai ajouté un triple switch pour pouvoir paramétrer l’intervalle de mesure (1, 15, 30 ou 60 minutes) et définir si l’écran doit être allumé ou éteint. J’ai également prévu un connecteur d’alimentation (entre 7 et 18 V). L’ensemble des modules consomme très peu, je me suis donc contenté du régulateur 5V embarqué sur le Nano. Du coup, le montage peut être alimenté au choix via l’alimentation ou via l’entrée USB du Nano. Ce qui permet d’utiliser une batterie USB externe (comme pour les téléphones) comme source d’énergie 🙂

Voici le schéma électrique de tout ça. Rien de bien particulier. J’ai tout de même ajouté une résistance de tirage (pull-up) de 4.7 KOhms sur les 2 lignes de l’I2C (SDA et SDL), ça semble être une bonne pratique, les résistances internes aux microcontrôleurs étant parfois trop juste. Pour le reste, j’ai suivi les datasheets des fabricants ou les exemples dans les tutoriaux du site Arduino.

Cliquer pour agrandir

Après la conception dans DipTrace et la gravure avec ma CNC, j’ai mon PCB fin prêt, il ne reste plus qu’à souder les composants

Je m’assure que tout fonctionne comme prévu, et je passe une couche de vernis pour circuits électroniques (en bombe). A défaut d’avoir fait un étamage, ça protégera quand même le circuit.

Il n’y a pas autant de résistances que la photo peut le laisser penser, 5 d’entre elles sont en fait des straps (résistances de 0 Ohm = des fils).

J’ai décidé de passer par un connecteur pour relier le capteur de température, au lieu de le souder directement sur la carte, pour 2 raisons :

  • Je voulais qu’il soit à l’extérieur de l’appareil, pour ne pas être perturbé par les conditions de température internes
  • Mais surtout, ça me laisse la possibilité d’utiliser une rallonge pour atteindre les endroits difficiles d’accès et de garder le reste de l’électronique a un endroit plus accessible. Par exemple, si je place le capteur dans le réfrigérateur, je peux visualiser les températures depuis l’extérieur, sans l’ouvrir. De plus, ça permet d’éviter l’exposition de l’appareil à des environnements trop rudes.

La photo suivante est un zoom sur l’affichage, un certain nombre d’informations sont affichées :

  • L’heure
  • La date du jour
  • La dernière température relevée
  • Le dernier taux d’humidité relevé
  • En haut à droite, l’intervalle paramétré entre 2 relevés (1 minutes, 15 minutes, 30 minutes ou 1 heure)
  • En haut à gauche, un symbole d’erreur (/!\) si un problème survient lors de l’enregistrement des relevés sur la carte SD

La dernière étape a consisté à réaliser un « boitier » pour ce circuit. J’ai utilisé du bois (pin) et un peu de Lexan (polycarbonate) de 3 mm d’épaisseur. J’ai voulu faire quelque chose de rapide et de pas trop moche.

Je tenais aussi à garder les pistes visibles, comme c’était le premier PCB réalisé avec la CNC 😉

Le code source est toujours disponible sur mon Github. Sans entrer dans le détail de chaque librairie utilisée (tout est dans le code), j’ai eu des soucis avec la librairie U8glib que j’utilisais par le passé pour piloter l’écran OLED. Seule elle fonctionnait, mais avec un autre périphérique I2C, plus rien ne marchait. J’ai vu que d’autres personnes remontaient ce problème. Je suis simplement passé sur une autre librairie (SSD1306Ascii) qui elle ne pose pas de problème et qui est beaucoup plus légère (j’était un peu juste en mémoire avec toutes ces librairies).

En parlant de U8glib que j’affectionnais beaucoup, il faut savoir que son développement a été arrêté, elle est remplacée par U8g2. Quand je l’ai essayée, je l’ai trouvée très lente. En fait je l’ai utilisée dans son mode par défaut, à savoir le mode « I2C software » et non « I2C hardware » (sensé être beaucoup plus rapide qu’une émulation logicielle). Le mode émulation permet de supporter toutes les cartes Arduino. Pour forcer le mode matériel, il suffit de le spécifier lors de l’initialisation, par exemple :

U8G2_SSD1306_128X64_NONAME_F_HW_I2C screen1(U8G2_R0, U8X8_PIN_NONE);

L’utilisation de la librairie pour le module de temps (RTC) m’a un peu étonné aussi, à aucun moment je n’ai manuellement spécifié la date et l’heure. En fait, c’est un cas un petit peu particulier, la ligne suivante récupère la date et l’heure sur le système hôte au moment de la compilation et du téléversement du programme :

RTC.adjust(DateTime(__DATE__, __TIME__));

Je garde cette ligne commentée dans le code source et je la décommente uniquement lorsque je veux régler l’heure.

Il y aurait encore quelques points à améliorer, par exemple :

  • Rafraîchir l’affichage de l’heure indépendamment des relevés
  • Prendre en compte à la volée les changements de configuration (intervalle et écran)
  • Optimiser la consommation au maximum (leds embarquées, paramétrage, veille…)

Mais je vais m’arrêter là pour le moment, cela répond déjà bien au besoin 🙂

Pour finir, voici, à quoi ressemble le fichier de log (vue depuis un éditeur de texte et un tableur) :

Laisser un commentaire

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