Il y a quelques temps, j’ai remis la main sur mon petit stock d’écrans LCD du même type que ceux du téléphone portable Nokia 3310 et 5110. Je n’y avait pas touché depuis un moment et je me suis dit que ça serait bien de faire un nouveau bidule avec.
Puis je me suis rappelé que l’hiver dernier, j’avais eu des problèmes de VMC entraînant de l’humidité chez moi et donc une sensation de froid assez importante jusqu’à qu’elle soit réparée.
En plus, c’était le premier hiver où j’avais décidé de ne pas utiliser de chauffage et juste m’habiller mieux parce que les prix de l’électricité avaient beaucoup augmenté et ma précédente facture avec.
Même avec une température de 20-21°C maintenue grâce au matos électronique qui tourne chez moi (incluant le serveur de ce site web) et une bonne couverture, je me les gelais pas mal.
C’est à ce moment là que je me suis dit que ça serait bien un truc pour connaître la température et surtout aussi le taux d’humidité chez moi.
Je me suis déjà fait par le passé une station météo toute simple à base de LM35 qui me donnait la température mais elle ne pouvait donner que la température et pas le taux d’humidité.
En fouillant sur Aliexpress pour voir ce qui se faisant comme capteur pouvant mensurer le taux d’humidité, j’ai trouvé des modules à base de BME280, un capteur qui fourni le taux d’humidité ainsi que la température et la pression atmosphérique via une liaison numérique I2C.
Lien Aliexpress : https://fr.aliexpress.com/item/1005005967725350.html
Le module est disponible en version 3,3V ou 5V.
J’ai pris celui en 5V vu que les signaux logiques du microcontrôleur que je vais détailler par la suite sont en 5V.
Autre information intéressante à son sujet : lorsqu’un microcontrôleur veut communiquer avec un périphérique en I2C, il utilise une adresse propre à chaque périphérique, car tous les périphériques sont connectables en parallèle.
Par défaut, les BME280 vendus tel quel répondent à l’adresse 0x76.
Mais il est possible de configurer matériellement le capteur pour qu’il réponde à une autre adresse qui est 0x77.
Ce qui fait que je peux utiliser 2 capteurs BME280, un pour la température/humidité intérieure et un autre pour la température/humidité extérieur, avec deux adresses différentes et reliés en même temps à un microcontrôleur !
Comme microcontrôleur qui va récupérer les informations des capteurs, j’ai voulu, dans un premier temps pour commencer mes expérimentations, utiliser un Arduino Uno, basé sur le microcontrôleur Atmel ATMEGA328P, à cause de la simplicité de programmation de la plateforme et toutes librairies logicielles qui existent déjà pour manipuler les capteurs BME280 et les afficheurs LCD 3310/5110.
Sur les modules BME280, il y a 3 petits points de soudure qui permettent de définir l’adresse I2C à laquelle chaque capteur va répondre.
Les deux points de gauche sont déjà reliés par une piste (difficilement visible) et définissent l’adresse 0x76.
Pour passer le capteur à l’adresse 0x77, il faut relier les deux points de droite avec un peu de soudure et couper la piste qui relie les deux points de gauche.
Couper la piste est une opération irréversible mais on peut très bien mettre de la soudure sur les deux points de gauche pour rétablir le contact.
Il ne faut pas laisser la piste à gauche en ayant appliqué de la soudure à droite car les points tout à gauche et tout à droite sont reliés directement au +5V et à la masse. Si l’un ou l’autre ne sont pas déconnectés, il y aura un court-circuit et vous ne comprendrez pas pourquoi votre capteur chauffe à fond ! Je suis passé par là avant de voir qu’il y avait une piste entre les deux points de gauche.
Le point central est l’entrée du signal logique 1 à +5V ou 0 à 0V qui va au capteur pour déterminer l’adresse.
Pour ce qui est de l’afficheur LCD 3310/5110, j’ai fait avec ceux que j’avais en stock mais on en trouve assez facilement sur AliExpress en cherchant « LCD 5110 ».
Lien AliExpress (non testé) : https://fr.aliexpress.com/item/32614334972.html
L’afficheur LCD 3310/5110 utilise un contrôleur PCD8544 qui fonctionne sur la plus part des modules vendues avec du 3,3V.
Pour avoir une source de tension 3,3V, c’est facile, l’Arduino en fournie une directement.
Par contre, les signaux logiques qui sortent de l’Arduino sont au format TTL donc en 5V et pas en 3,3V.
Il faut donc adapter les signaux logiques 5V en 3,3V.
Une méthode ultra simple pour cela consiste à utiliser des portes buffer CMOS d’une puce CD4050 alimentée en 3,3V. Les portes buffer prennent le signal logique 5V en entrée et le ressortent en 3,3V.
Une autre méthode assez simple aussi consiste à utiliser des résistances pour abaisser la tension.
Il faut faire la conversion de tension uniquement dans le sens 5V vers 3,3V car le module LCD ne fait que recevoir des informations.
Après tout cela, j’ai réalisé un premier prototype entièrement fonctionnel !
Pour communiquer les capteurs BME280 au niveau logiciel, j’ai utilisé la librairie « Adafruit BME280 » en version 2.2.4.
Pour gérer la communication avec l’afficheur LCD utilisant le contrôleur PCD8544, j’ai utilisé la librairie « Adafruit PCD8544 » en version 2.0.3.
Les valeurs de températures et d’humidité relative sont affichés à l’écran.
La valeur de pression atmosphérique, issue du capteur extérieur uniquement, est affichée qu’une fois à l’écran. Inutile d’afficher les deux pressions atmosphériques vu qu’elles sont normalement identiques ou très proches.
J’ai mis des barres de progression horizontales en dessous de chaque valeurs avec des valeurs minimales et maximales différentes suivant le cas.
La barre de température intérieure va de 15°C à 30°C car je trouve qu’il fait vraiment froid avec 15°C en intérieur et à 30°C chez moi je suis un légume.
La barre de température extérieure va de 0°C à 40°C car il fait vraiment froid dehors en dessous de 0°C même si on s’habille et quand la température dépasse 40°C, il vaut mieux rester chez soi.
En intérieur comme en extérieur, les barres de l’humidité relative vont de 0 à 100 %.
La barre de pression atmosphérique va de 970 à 1056 hPa avec un milieu à 1013 hPa.
On remarquera que, malgré le fait que les deux capteurs soient juste à côté, les mesures de données météorologiques sont légèrement différentes. Peut-être est-ce dû à une tolérance lors de la fabrication des capteurs.
J’avais pensé un temps rajouter la valeur calculée de l’indice de chaleur (Heat Index) mais finalement je me suis dit que les données que j’avais déjà l’écran me suffisaient pour savoir s’il faisait trop chaud dehors pour sortir.
Si vous êtes curieux, plus d’infos là : https://fr.wikipedia.org/wiki/Indice_de_chaleur
Vu que l’Arduino possède une interface série-USB, j’ai souhaité envoyer les données météorologiques sur la sortie série. Je me suis dit que ça pourrait servir pour une utilisation future. Ça ne coûte rien de rajouter cette fonctionnalité.
Exemple de la sortie série un soir d’octobre vers 23h :
Durant un jour d’été très chaud, j’ai posé le prototype sur ma terrasse à l’ombre. Je pouvais voir les valeurs mesurées sur mon PC.
Ça marchait bien mais avec le prototype en l’état, j’avais les deux capteurs pour les informations intérieures et extérieur juste à côté. Donc en fait j’avais les informations intérieures en double.
C’était donc désormais le moment d’installer les capteurs à leurs emplacements définitifs : un en intérieur et un autre en extérieur.
Vu que les périphériques I2C nécessitent 2 fils pour l’alimentation, 1 fil de données et 1 fil pour l’horloge des données et que je voulais pouvoir brancher et débrancher facilement les capteurs de la station météo, j’ai décidé d’utiliser des câbles USB peu couteux possédant un connecteur facile à brancher/débrancher, 2 fils (parfois plus gros) pour l’alimentation et 2 fils pour les données.
J’ai utilisé un câble de 2 mètres pour le capteur intérieur. Ce qui me laisse assez de longueur de câble pour positionner la station où je veux sur mon bureau et le capteur dans une zone sans source de chaleur parasite même minime.
Lien AliExpress : https://fr.aliexpress.com/item/4000295357359.html
Pour le capteur extérieur, il me fallait entre 6 et 8 mètres de câble donc j’ai pris un câble USB de 12m histoire d’être large et d’avoir du rab si je souhaite installer le capteur ailleurs.
Lien AliExpress : https://fr.aliexpress.com/item/1005005986402348.html
Pour info : l’annonce du câble indiquait qu’il pouvait supporter 6A mais vu la largeur des fils de cuivre, il ne supporte pas plus de 1 ampère. Mais bon pour du I2C ça suffit largement et il était pas cher.
J’ai vérifié les résistances internes des câblés juste pour voir. Ça va.
Par contre, j’ai eu une drôle de surprise avec le câble de 12m. Les fils d’alimentations ont été inversés à la fabrication ! Pareil pour ses fils de data !
Je n’ai pas demandé de retour pour ça. J’ai juste noté l’info dans un coin pour au moment de connecter la sonde extérieure.
Et pour finir, qui dit câbles USB dit aussi des ports USB pour le PCB où on va y brancher les câbles. J’ai pris des ports doubles car j’aurai 2 câbles à connecter.
Lien AliExpress : https://fr.aliexpress.com/item/32834931416.html
Les contacts des deux ports sont reliées en parallèle vu que les deux sondes partages la même alimentation 5V et les mêmes liaisons I2C de données/horloge.
Pour faire tenir les sondes en place, j’ai fabriqué des supports muraux en impression 3D.
Les supports sont composés d’une pièce principale où le capteur tient en place et un cache pour empêcher la sonde et les câbles de partir. Ce cache tient par friction.
Le premier en PETG pour la sonde extérieure :
Fichiers STL :
- Base du support : Support_sonde_exterieur.stl
- Cache : Support_sonde_cache.stl
Il est installé avec du ruban adhésif double-face trouvable en magasin de bricolage.
Je l'ai installé dans un coin de ma baie vitrée.
Une nappe de 4 fils d’environ 15cm a été utilisée pour la connexion entre la sonde et le câble USB de 12m pour pouvoir fermer la fenêtre coulissante de la baie vitrée sur la nappe.
Le second support pour la sonde intérieur a été imprimé en PLA.
Celui-ci possède des emplacements avec des trous afin de visser le support sur une surface.
En l'occurrence ici, du bois.
- Base du support : Support_sonde_interieur.stl
- Cache : Support_sonde_cache.stl
J’ai commandé des clones d’Arduino Nano pour la version finale de ma station météo.
Petite info à savoir : Certains vendeurs AliExpress vendent des bons clones d’Arduino Nano avec le bon microcontrôleur « Atmel ATMEGA328P ». Mais d’autres en vendent avec des « Atmel ATMEGA328PB » (avec un B à la fin).
Ces derniers sont légèrement différents et le compilateur Atmel inclus dans l’IDE Arduino peut les refuser car il est configuré par défaut pour le « ATMEGA328P » et non le « ATMEGA328PB ».
Il est possible cependant d’arriver à programmer ces derniers en utilisant les boards « MiniCore Atmega328 » et le paramètre « Variant » à « 328PB » :
Lien pour des Arduino Nano « Atmel ATMEGA328P » : https://fr.aliexpress.com/item/1005002976480289.html
Lien pour des Arduino Nano « Atmel ATMEGA328PB » : https://fr.aliexpress.com/item/1005004802890160.html
A part ce détail, les deux marchent très bien. :)
J’ai mis à jour le prototype avec cet Arduino Nano et tout marche très bien !
Par contre, le retro-éclairage me donnait de la fatigue oculaire le soir donc je l’ai désactivé.
Puis plus tard en faisant des essais d'impression 3D de l'emplacement de l'écran, j'ai remarqué que c'était surtout les LEDs du rétro-éclairage que je voyais directement avant qui me dérangeaient le plus.
Du coup, j'ai mis un très léger rétro-éclairage et là ça le fait bien !
Avant de m’occuper de la réalisation du reste du boîtier en impression 3D, j’ai fait la version finale du circuit sur plaque d’essais en époxy.
L’écran LCD tiendra sur une façade à part du reste du boîtier. Du coup, ce dernier est connecté au circuit avec une nappe de 8 fils.
J’ai récupéré la nappe sur une vielle nappe de disque dur IDE ou de lecteur de disquettes de PC.
J’avais ainsi une idée des dimensions à utiliser pour faire mon boîtier sur Fusion360.
Le boîtier est composé de 2 parties :
- La façade où tient l’afficheur LCD avec des vis M3 de 12mm et des écrous du même type.
- Le reste du boîtier qui contient le reste de l’électronique avec l’Arduino et les connecteurs.
2 vis et 2 écrous M3 sont à utiliser pour faire tenir le PCB.
Les deux pièces sont à imprimer comme ceci sans supports :
Fichiers STL :
- Pièce principale : Station meteo - Piece principale.stl
- Façade : Station meteo - Facade.stl
J’ai imprimé le tout en PLA noir pour l’arrière et bleu-violet pour la façade.
Il y a plus qu’à tout monter, emboîter la façade dans l’autre pièce :
Petit truc amusant :
J’ai installé le capteur en été dans une zone ombragée toute la journée.
Avec la position du soleil qui se retrouve de plus en plus basse avec l’automne, la sonde extérieure de ma station météo se retrouve en plein soleil pendant une demi-heure ce qui donne parfois des valeurs élevées.
Je ne suis pas allé jusqu’à monter un abri Stevenson pour héberger mon capteur et éviter ces problèmes de soleil qui arrive sur le capteur car je n’ai pas la place pour ça sur ma terrasse et je n’ai pas de jardin.
Je ne peux me contenter que de choisir l’endroit le plus ombragé pour positionner mon capteur.
L'alimentation cette station météo se fait via le port USB-C de l’Arduino Nano qui est relié à mon PC qui fournit constamment une tension sur ses ports USB.
J’ai utilisé un câble de 1m pour cela.
Lien AliExpress : https://fr.aliexpress.com/item/4000295357359.html
On trouve des câbles USB avec uniquement sur AliExpress mais ils sont généralement plus cher que des câbles "normaux". Cela est probablement dû à leur plus faible demande.
Vu que l’Arduino de ma station météo est relié à mon PC, je n’ai pas envie de le reprogrammer par inadvertance lorsque je serai sur un autre projet utilisant un Arduino. Oui c’est arrivé avant que je ne prépare ce câble.
Voici le schéma électronique de ma mini-station météo :
Version PDF : Schéma mini-station météo Arduino.pdf
Il est également disponible sur mon serveur Gitlab : https://gitlab.gargantia.fr/jelora/Mini_station_meteo_Arduino
Le chat n’était évidemment pas très loin pour surveiller l’avancement de ce projet.