Table des matières:
2025 Auteur: John Day | [email protected]. Dernière modifié: 2025-01-13 06:57
Notre maison dispose d'un réservoir d'eau alimenté par la pluie tombant sur le toit, et utilisé pour les toilettes, la machine à laver et l'arrosage des plantes dans le jardin. Au cours des trois dernières années, les étés ont été très secs, nous avons donc surveillé le niveau d'eau dans le réservoir. Jusqu'à présent, nous avons utilisé un bâton en bois, que nous avons mis dans le réservoir et marqué le niveau. Mais il doit sûrement être possible d'améliorer cela !
C'est là qu'intervient ce projet. L'idée est de fixer un capteur de distance à ultrasons au sommet du réservoir. Ce capteur fonctionne comme un sonar émettant des ondes sonores, qui sont ensuite réfléchies par la surface de l'eau. À partir du temps nécessaire au retour des vagues et de la vitesse du son, vous pouvez calculer la distance à la surface de l'eau et déterminer le niveau de remplissage du réservoir.
Comme je n'ai pas de branchement secteur à proximité du réservoir, il est essentiel que l'appareil complet fonctionne sur piles. Cela signifie que je devais être conscient de la consommation électrique de toutes les pièces. Pour renvoyer les données, j'ai décidé d'utiliser le Wifi intégré d'une puce ESP8266. Si le Wifi est assez gourmand en énergie, il a un avantage par rapport à un autre type de connexion radio: vous pouvez vous connecter directement au routeur sans fil de votre maison sans avoir à construire un autre appareil faisant office de relais.
Pour économiser de l'énergie, je mets l'ESP8266 en veille profonde la plupart du temps et prends une mesure toutes les heures. Pour mon objectif de suivi du niveau d'eau, cela suffit amplement. Les données seront envoyées à ThingSpeak et pourront ensuite être lues sur un smartphone via une application.
Encore un détail ! La vitesse du son, indispensable pour la mesure de distance, dépend de la température et dans une moindre mesure de l'humidité. Pour une mesure extérieure précise au fil des saisons, nous ajouterons un capteur BME280, qui mesure la température, l'humidité et la pression. En prime, cela fait de notre capteur de niveau d'eau également une mini station météo.
Les pièces:
- 1x ESP8266 ESP-12F.
- 1x plaque adaptatrice ESP-12F.
- 1x FT232RL FTDI: adaptateur USB vers série.
- 1x HC-SR04-P: module de mesure de distance par ultrasons. Notez que le P est important, car c'est la version qui a une faible tension de fonctionnement minimale de 3V.
- 1x version BME280 3.3V: capteur de température, pression et humidité.
- 1x IRL2203N: transistor MOSFET canal n.
- 1x MCP1700-3302E version 3.3V: régulateur de tension.
- 3 piles AA rechargeables, par ex. 2600mAh.
- 1x support de batterie pour 3 batteries.
- 1x planche à pain.
- Résistances: 1x 470K, 1x 100K, 4x 10K.
- Condensateurs: 2x céramique 1uF.
- 3x interrupteur à bascule.
- Fils de planche à pain en forme de U.
- Fils de cavalier.
- Pot à soupe en plastique 1l.
- Anneau de fixation pour le conteneur.
J'ai rendu le code disponible sur GitHub.
Étape 1: Se familiariser avec le capteur de distance à ultrasons
Nous mesurerons la distance à la surface de l'eau avec un capteur à ultrasons, le HC-SR04-P. Tout comme une chauve-souris, ce capteur utilise un sonar: il envoie une impulsion sonore avec une fréquence trop élevée pour l'oreille humaine, donc des ultrasons, et attend qu'elle heurte un objet, se réfléchisse et revienne. La distance peut alors être calculée à partir du temps qu'il faut pour recevoir l'écho et de la vitesse du son.
Concrètement, si la broche Trig est tirée vers le haut pendant au moins 10 s, le capteur envoie une rafale de 8 impulsions avec une fréquence de 40 Hz. La réponse est alors obtenue sur la broche Echo sous la forme d'une impulsion de durée égale au temps entre l'envoi et la réception de l'impulsion ultrasonore. Ensuite, nous devons diviser par 2, car l'impulsion ultrasonore va et vient et nous avons besoin du temps de trajet aller simple, et multiplier par la vitesse du son, qui est d'environ 340 m/s.
Mais attendez une minute ! En effet, la vitesse du son dépend de la température et dans une moindre mesure de l'humidité. Est-ce que je pinaille ou est-ce pertinent ? En utilisant un outil de calcul, nous trouvons qu'en hiver (en prenant -5 °C) nous pourrions avoir 328,5 m/s, et en été (en prenant 25 °C) 347,1 m/s. Supposons donc que nous trouvions un temps de trajet aller simple de 3 ms. En hiver, cela signifierait 98,55 cm et en été 104,13 cm. C'est toute une différence ! Donc, pour obtenir une précision suffisante au fil des saisons et même de jour comme de nuit, nous devons ajouter un thermomètre à notre configuration. J'ai décidé d'inclure le BME280, qui mesure la température, l'humidité et la pression. Dans le code, j'ai utilisé dans la fonction speedOfSound une formule qui calcule la vitesse du son en fonction des trois paramètres, bien que la température soit vraiment le facteur le plus important. L'humidité a toujours un effet plus faible, mais l'impact de la pression est négligeable. Nous pourrions utiliser une formule plus simple ne prenant en compte que la température que j'ai implémentée dans speedOfSoundSimple.
Il y a un autre point important sur le HC-SR04. Il existe deux versions disponibles: la version standard fonctionne à 5V, tandis que le HC-SR04-P peut fonctionner à une plage de tensions de 3V à 5V. Étant donné que les 3 piles AA rechargeables fournissent environ 3x1.25V = 3.75V, il est important d'obtenir la version P. Certains vendeurs peuvent envoyer le mauvais. Alors jetez un œil aux photos si vous en achetez un. Les deux versions sont différentes à l'arrière et à l'avant comme expliqué sur cette page. À l'arrière de la version P, les trois puces sont horizontales tandis que sur la version standard, une est verticale. À l'avant, la version standard a un composant supplémentaire en argent.
Dans le circuit électronique, nous utiliserons un transistor comme interrupteur pour couper l'alimentation du capteur à ultrasons lorsque notre configuration passe en veille profonde pour économiser la batterie. Sinon, il consommerait encore environ 2 mA. Le BME280 en revanche ne consomme qu'environ 5 μ lorsqu'il est inactif, il n'est donc pas nécessaire de l'éteindre avec le transistor.
Étape 2: Choix de la carte ESP8266
Pour faire fonctionner le capteur le plus longtemps possible sur batterie, nous devons économiser sur la consommation d'énergie. Si le Wifi de l'ESP8266 offre un moyen très pratique de connecter notre capteur au cloud, il est également assez gourmand en énergie. En fonctionnement l'ESP8266 consomme environ 80mA. Ainsi, avec des batteries de 2600 mAh, nous ne pourrions faire fonctionner notre appareil que pendant 32 heures maximum avant qu'elles ne soient vides. En pratique, ce sera moins puisque nous ne pourrons pas utiliser la pleine capacité de 2600 mAh avant que la tension ne tombe à un niveau trop bas.
Heureusement, l'ESP8266 dispose également d'un mode veille profonde, dans lequel presque tout est éteint. Le plan est donc de mettre l'ESP8266 en veille profonde la plupart du temps et de le réveiller très souvent pour effectuer une mesure et envoyer les données via le Wifi à ThingSpeak. Selon cette page, la durée maximale de sommeil profond était d'environ 71 minutes, mais depuis le noyau ESP8266 Arduino 2.4.1, elle est passée à environ 3,5 heures. Dans mon code, je me suis installé pendant une heure.
J'ai d'abord essayé la carte de développement NodeMCU pratique, mais dommage, en sommeil profond, elle consommait encore environ 9 mA, ce qui nous donne au plus 12 jours de sommeil profond pur sans même tenir compte des intervalles de réveil. Un coupable important est le régulateur de tension AMS1117, qui utilise de l'énergie même si vous essayez de la contourner en connectant la batterie directement à la broche 3.3V. Cette page explique comment retirer le régulateur de tension et l'UART USB. Cependant, je n'ai jamais réussi à le faire sans détruire ma planche. De plus, après avoir retiré l'UART USB, vous ne pouvez plus vous connecter à l'ESP8266 pour comprendre ce qui s'est mal passé.
La plupart des cartes de développement ESP8266 semblent utiliser le régulateur de tension AMS1117 inutile. Une exception est le WEMOS D1 mini (photo de gauche) qui est livré avec le ME6211 plus économique. En effet, j'ai trouvé que le WEMOS D1 mini utilise environ 150 μA en sommeil profond, ce qui lui ressemble plus. La majeure partie est probablement due à l'UART USB. Avec cette carte, vous devez cependant souder vous-même les en-têtes des broches.
Cependant, nous pouvons faire beaucoup mieux en utilisant une carte barebone comme l'ESP-12F (photo de droite), qui n'a pas d'UART USB ni de régulateur de tension. En alimentant la broche 3.3V, j'ai trouvé une consommation en veille profonde de seulement 22 A !
Mais pour faire fonctionner l'ESP-12F, préparez-vous à quelques soudures et à un peu plus de tracas pour le programmer ! De plus, à moins que les batteries ne fournissent directement la tension correcte, qui se situe entre 3V et 3,6V, nous devons fournir notre propre régulateur de tension. En pratique, il s'avère difficile de trouver un système de batterie qui fournisse une tension dans cette plage sur son cycle de décharge complet. N'oubliez pas que nous devons également alimenter le capteur HC-SR04-P, qui peut théoriquement fonctionner avec une tension aussi basse que 3V, mais fonctionne avec plus de précision si la tension est plus élevée. De plus dans mon schéma le HC-SR04-P est allumé par un transistor, ce qui induit une petite chute de tension supplémentaire. Nous utiliserons le régulateur de tension MCP1700-3302E. La tension d'entrée maximale est de 6 V, nous l'alimentons donc avec jusqu'à 4 piles AA. J'ai décidé d'utiliser 3 piles AA.
Étape 3: Créer une chaîne ThingSpeak
Nous utiliserons ThingSpeak, un service cloud IoT, pour stocker nos données. Allez sur https://thingspeak.com/ et créez un compte. Une fois connecté, cliquez sur le bouton Nouvelle chaîne pour créer une chaîne. Dans les paramètres de la chaîne, remplissez le nom et la description comme vous le souhaitez. Ensuite, nous nommons les champs du canal et les activons en cliquant sur les cases à cocher à droite. Si vous utilisez mon code inchangé les champs sont les suivants:
- Champ 1: niveau d'eau (cm)
- Champ 2: niveau de batterie (V)
- Champ 3: température (°C)
- Champ 4: humidité (%)
- Champ 5: pression (Pa)
Pour référence future, notez l'ID de canal, la clé API de lecture et la clé API d'écriture, qui se trouvent dans le menu Clés API.
Vous pouvez lire les données ThingSpeak sur votre smartphone à l'aide d'une application. Sur mon téléphone Android, j'utilise le widget IoT ThingSpeak Monitor. Vous devez le configurer avec le Channel ID et la Read API Key.
Étape 4: Comment programmer l'ESP-12F
Nous avons besoin d'une carte simple pour économiser la batterie, mais l'inconvénient est qu'elle est un peu plus difficile à programmer qu'une carte de développement avec UART USB intégré.
Nous utiliserons l'IDE Arduino. Il existe d'autres Instructables expliquant comment l'utiliser donc je serai bref ici. Les étapes pour le préparer pour l'ESP8266 sont:
- Téléchargez l'IDE Arduino.
- Installez le support pour la carte ESP8266. Dans le menu Fichier - Préférences - Paramètres, ajoutez l'URL https://arduino.esp8266.com/stable/package_esp8266com_index.json aux URL supplémentaires de Board Manager. Ensuite dans le menu Tools - Board - Boards Manager installez esp8266 par esp8266 community.
- Sélectionnez comme carte: Module générique ESP8266.
Pour manipuler l'ESP-12F, j'ai utilisé une plaque adaptatrice, couramment disponible dans les boutiques en ligne. J'ai soudé la puce à la plaque, puis les en-têtes à la plaque. Ce n'est qu'alors que j'ai découvert que la plaque adaptatrice est trop large pour une maquette standard ! Il ne laisse aucune broche libre sur le côté pour effectuer vos connexions.
La solution que j'ai choisie est d'utiliser des fils en forme de U et de les connecter comme sur l'image de droite avant de placer l'ESP8266 avec la plaque adaptatrice sur la planche à pain. Ainsi, GND et VCC sont connectés aux rails de la maquette et les broches restantes sont rendues disponibles plus loin dans la maquette. L'inconvénient est que votre maquette sera assez encombrée de fils une fois que vous aurez terminé le circuit complet. Une autre solution consiste à assembler deux maquettes comme le montre cette vidéo.
Ensuite, pour programmer l'ESP-12F via le port USB de votre ordinateur, nous avons besoin d'un adaptateur USB vers série. J'ai utilisé le programmeur FT232RL FTDI. Le programmeur a un cavalier pour choisir entre 3,3V ou 5V. Il doit être mis à 3.3V pour l'ESP8266. Ne l'oubliez pas car le 5V pourrait faire frire votre puce ! L'installation des pilotes devrait être automatique, mais si la programmation ne fonctionne pas, vous pouvez essayer de les installer manuellement à partir de cette page.
L'ESP8266 dispose d'un mode de programmation pour télécharger un nouveau firmware sur la mémoire flash et d'un mode flash pour exécuter le firmware actuel à partir de la mémoire flash. Pour choisir entre ces modes, certaines broches doivent prendre une certaine valeur au démarrage:
- Programmation: GPIO0: bas, CH-PD: haut, GPIO2: haut, GPIO15: bas
- Flash: GPIO0: élevé, CH-PD: élevé, GPIO2: élevé, GPIO15: faible
La plaque adaptatrice s'occupe déjà de tirer vers le haut CH-PD et vers le bas GPIO15 avec des résistances de 10K.
Donc, dans notre circuit électronique, nous devons encore tirer GPIO2. Nous fournissons également un interrupteur pour mettre l'ESP8266 en programmation ou en mode flash et un interrupteur pour le réinitialiser, ce qui se fait en connectant RST à la masse. Assurez-vous également de connecter la broche TX du FT232RL à la broche RXD de l'ESP8266 et vice-versa.
La séquence de programmation est la suivante:
- Réglez GPIO2 sur bas en fermant le commutateur de programmation.
- Réinitialisez l'ESP8266 en fermant puis en rouvrant l'interrupteur de réinitialisation. L'ESP8266 démarre maintenant en mode programmation.
- Remettez GPIO2 à l'état haut en ouvrant le commutateur de programmation.
- Téléchargez le nouveau firmware à partir de l'IDE Arduino.
- Réinitialisez à nouveau l'ESP8266 en fermant et en rouvrant l'interrupteur de réinitialisation. L'ESP8266 démarre maintenant en mode flash et exécute le nouveau firmware.
Vous pouvez maintenant tester si la programmation fonctionne en téléchargeant le célèbre sketch Blink.
Si tout cela fonctionne au moins les broches GND, VCC, GPIO2, RST, TXD et RXD sont correctement soudées et connectées. Quel soulagement! Mais avant de continuer, je recommanderais de tester également les autres broches avec votre multimètre. J'ai moi-même eu un problème avec l'une des broches. Vous pouvez utiliser ce croquis, qui règle toutes les broches une par une pendant 5 secondes, puis met l'ESP8266 en veille profonde pendant 20 secondes. Pour permettre à l'ESP8266 de se réveiller après un sommeil profond, vous devez connecter RST à GPIO16, qui donne le signal de réveil.
Étape 5: Téléchargement du croquis
J'ai rendu le code disponible sur GitHub, c'est juste un fichier: Level-Sensor-Deepsleep.ino. Il suffit de le télécharger et de l'ouvrir dans l'IDE Arduino. Ou vous pouvez sélectionner Fichier - Nouveau et simplement copier/coller le code.
Il y a quelques informations que vous devez remplir au début du fichier: le nom et le mot de passe du WLAN à utiliser, les détails IP statiques et l'ID de canal et la clé d'API d'écriture du canal ThingSpeak.
En suivant le conseil de ce blog, au lieu de DHCP où le routeur attribue dynamiquement une IP, nous utilisons une IP statique, où nous définissons nous-mêmes l'adresse IP de l'ESP8266. Cela s'avère beaucoup plus rapide, nous économisons donc sur le temps d'activité et donc sur l'énergie de la batterie. Nous devons donc fournir une adresse IP statique disponible ainsi que l'IP du routeur (passerelle), le masque de sous-réseau et un serveur DNS. Si vous ne savez pas quoi remplir, lisez la section sur la configuration d'une adresse IP statique dans le manuel de votre routeur. Sur un ordinateur Windows connecté via Wifi à votre routeur, démarrez un shell (Windows button-r, cmd) et entrez ipconfig /all. Vous trouverez la plupart des informations dont vous avez besoin dans la section Wi-Fi.
En examinant le code, vous constatez que, contrairement aux autres codes Arduino, la plupart des actions se déroulent dans la fonction de configuration au lieu de la fonction de boucle. En effet, l'ESP8266 passe en veille prolongée après avoir terminé la fonction de configuration (à moins que nous n'ayons démarré en mode OTA). Après son réveil, c'est comme un nouveau redémarrage et il exécute à nouveau la configuration.
Voici les principales caractéristiques du code:
- Après le réveil, le code définit switchPin (GPIO15 par défaut) sur high. Cela active le transistor, qui à son tour active le capteur HC-SR04-P. Avant d'aller en sommeil profond, il remet la broche à l'état bas, éteignant le transistor et le HC-SR04-P, s'assurant qu'il ne consomme plus la précieuse énergie de la batterie.
- Si le modePIN (GPIO14 par défaut) est bas, le code passe en mode OTA au lieu du mode mesure. Avec OTA (over-the-air update), nous pouvons mettre à jour le firmware via Wifi au lieu du port série. Dans notre cas, c'est très pratique car nous n'avons plus besoin de connecter l'adaptateur série à USB pour d'autres mises à jour. Réglez simplement GPIO14 sur bas (avec le commutateur OTA dans le circuit électronique), réinitialisez l'ESP8266 (avec le commutateur de réinitialisation) et il devrait devenir disponible dans l'IDE Arduino pour le téléchargement.
- Sur le PIN analogique (A0), on mesure la tension de la batterie. Cela nous permet d'éteindre notre appareil, c'est-à-dire le sommeil profond permanent, si la tension devient trop basse, en dessous de minVoltage, pour protéger les batteries d'une décharge excessive. La mesure analogique n'est pas très précise, nous effectuons des mesures numMeasuresBattery (10 par défaut) et prenons la moyenne pour améliorer la précision.
- La mesure de distance du capteur HC-SR04-P se fait dans la fonction DistanceMeasurement. Pour améliorer la précision, la mesure est répétée numMeasuresDistance (par défaut 3 fois).
- Il existe une fonction pour calculer le speedOfSound à partir de la mesure de la température, de l'humidité et de la pression par le capteur BME280. L'adresse I2C par défaut du BME280 est 0x76, mais si cela ne fonctionne pas, vous devrez peut-être la changer en 0x77: bool bme280Started=bme280.begin(0x77);
- Nous utiliserons le BME280 en mode forcé, ce qui signifie qu'il prend une mesure et se remet en veille pour économiser de l'énergie.
- Si vous définissez la capacité (l), la distance totale (cm) et la surface (m2), le code calcule le volume restant du réservoir d'eau à partir de la mesure de distance: double volume restant=capacité+10,0*(distance totale-distance)*surface; et téléchargez-le sur ThingSpeak. Si vous conservez les valeurs par défaut, il télécharge la distance à la surface de l'eau en cm.
Étape 6: Construire le circuit électronique
Ci-dessus, le schéma du circuit électronique. C'est assez grand pour une planche à pain, surtout avec la plaque adaptatrice surdimensionnée et l'astuce avec les fils en forme de U. À un moment donné, j'aurais certainement souhaité avoir utilisé l'alternative de connecter deux planches à pain, mais j'ai finalement réussi.
Voici les caractéristiques importantes du circuit:
- Il y a deux tensions qui jouent un rôle: la tension d'entrée de la batterie (environ 3,75V) et les 3,3V qui alimentent l'ESP8266 et le BME280. J'ai mis le 3.3V sur le rail gauche du breakboard et le 3.75V sur le rail droit. Le régulateur de tension convertit le 3.75V en 3.3V. En suivant les instructions de la fiche technique, j'ai ajouté des condensateurs de 1 F à l'entrée et à la sortie du régulateur de tension pour augmenter la stabilité.
- Le GPIO15 de l'ESP8266 est connecté à la grille du transistor. Cela permet à l'ESP8266 d'allumer le transistor et donc le capteur à ultrasons lorsqu'il est actif et de l'éteindre lorsqu'il passe en sommeil profond.
- GPIO14 est connecté à un commutateur, le commutateur OTA. La fermeture du commutateur donne le signal à l'ESP8266 que nous voulons commencer en mode OTA ensuite, c'est-à-dire après avoir appuyé (fermer et ouvrir) le commutateur RESET et télécharger un nouveau croquis en direct.
- Les broches RST et GPIO2 sont connectées comme dans le schéma de programmation. La broche RST est désormais également connectée à GPIO16 pour permettre à l'ESP8266 de se réveiller d'un sommeil profond.
- Les broches TRIG et ECHO du capteur à ultrasons sont connectées aux GPIO12 et GPIO13, tandis que les broches SCL et SDA du BME280 sont connectées aux GPIO5 et GPIO4.
- Enfin, la broche analogique ADC se fait via un diviseur de tension connecté à la tension d'entrée. Cela permet de mesurer la tension d'entrée pour vérifier la charge des batteries. La broche ADC peut mesurer des tensions entre 0V et 1V. Pour le diviseur de tension, nous avons choisi des résistances de 100K et 470K. Cela signifie que la tension à la broche ADC est donnée par: V_ADC = 100K/(100K+470K) V_in. En prenant V_ADC=1V, cela signifie que nous pouvons mesurer des tensions d'entrée jusqu'à V_in=570/100 V_ADC = 5.7V. En ce qui concerne la consommation d'énergie, il existe également une fuite de courant à travers le diviseur de tension. Avec V_in=3.75V des batteries on trouve I_leak = 3.75V/570K=6.6 μA.
Même lorsque le circuit fonctionne à partir de batteries, il est possible de connecter l'adaptateur USB à série. Assurez-vous simplement de débrancher le VCC de l'adaptateur et de connecter GND, RX et TX comme dans le schéma de programmation. Cela permet d'ouvrir le moniteur série dans l'IDE Arduino pour lire les messages de débogage et s'assurer que tout fonctionne comme prévu.
Pour le circuit complet, j'ai mesuré une consommation de courant de 50 A en sommeil profond en fonctionnant sur piles. Cela inclut l'ESP8266, le BME280, le capteur à ultrasons (désactivé par le transistor) et les fuites à travers le diviseur de tension et peut-être d'autres fuites. Alors ce n'est pas trop mal !
J'ai trouvé que le temps actif total est d'environ 7 secondes, dont 4,25 secondes pour se connecter au Wifi et 1,25 secondes pour envoyer les données à ThingSpeak. Donc avec un courant actif de 80mA j'ai trouvé 160 μAh par heure pour le temps actif. En ajoutant 50 Ah par heure pour l'état de sommeil profond, nous avons au total 210 μAh par heure. Cela signifie que les batteries 2600 mAh durent théoriquement 12400 heures = 515 jours. C'est le maximum absolu si on pouvait utiliser la pleine capacité des batteries (ce qui n'est pas le cas) et il n'y a pas de fuites que je n'ai pas trouvées avec mes mesures actuelles. Je n'ai donc pas encore vu si cela fonctionne vraiment.
Étape 7: Finition du capteur
J'ai mis le capteur dans un récipient en plastique de 1 litre, qui contenait autrefois de la soupe. En bas, j'ai fait deux trous pour s'adapter aux "yeux" du capteur HC-SR04-P. En dehors des trous, le conteneur doit être étanche. Il est ensuite fixé à la paroi du réservoir d'eau avec un anneau circulaire qui est normalement utilisé pour un tuyau d'évacuation des eaux de pluie.
Amusez-vous avec le projet!