Objectif
Réalisation d’une sonde de détection de fuite ou intrusion d’eau. J’utilise le montage afin de surveiller l’étanchéité de mon chauffe-eau ainsi que la présence d’eau dans mon garage à la suite de fortes pluies.
Les caractéristiques :
- Détection rapide de la présence d’eau
- Surveillance du niveau de la batterie.
- Très faible consommation de courant pour une grande autonomie de la batterie.
- Utilisation de fonctions natives de l’ESP12F (mémoire non volatile, tension alimentation)
- Choix entre deux programmes pour remonter les informations.
- Connexion à un serveur MQTT pour traitement par un serveur domotique du type « openHAB », « homeassistant » ou autre.
- Envoi d’un message
Description du montage
L’ensemble des fichiers du projet (programmes Arduino et schémas) sont téléchargeables ici.
Le cœur du système est constitué d’un module ESP12F. Il s’occupe de la lecture des capteurs et de la communication au travers de son interface Wifi.
Sont contrôlés la présence d’eau et le niveau de charge de la batterie.
O => interrupteur pour mise sous tension
A => détecteur de présence d’eau. En présence d’eau la Gate devient positive et le transistor CMOS bascule. La tension en (A) est également transmise au travers d’une diode au port GPIO05 pour être prise en compte par le contrôleur.
C => lorsque le circuit 2N7000 bascule la tension passe à zéro et une impulsion négative est transmise, par un condensateur, au port RESET (D) et l’ESP12F démarre.
B => Le bouton poussoir permet de faire basculer le circuit CMOS et de la même manière à faire démarrer l’ESP12F.
E => le port GPIO01 est relié au port RESET au travers d’une diode. La fonction « deep sleep » du contrôleur actionne le port en fin de période de sommeil pour redémarrer le contrôleur (par une impulsion négative).
H => la platine du contrôleur est équipée de résistances indispensables pour les fonctions de programmation et de « deep sleep ». Si en envisage de ne pas utiliser la platine les deux résistances de 10k mentionnées devront être ajoutées.
G, F => La connexion du convertisseur USB-TTL est très simple. On utilise uniquement les liaisons GND, RX et TX. Le mode programmation s’effectue de la manière suivante : On coupe l’alimentation (O), on actionne l’interrupteur (F) et on remet l’alimentation. Le contrôleur attend alors le déversement du nouveau programme. En mode production le convertisseur est inutile.
Le contrôle du niveau de la batterie s’effectue par une fonction interne du contrôleur (voir programme).
Particularités du montage
Le montage est simple à réaliser.
Dans le cas de l’utilisation d’une platine d’essais avec des connecteurs à enficher il est important de veiller à la qualité des contacts et à l’emploi de liaisons courtes. Il peut arriver que le contrôleur ne démarre pas ou tombe dans un état instable. Ceci provient généralement du câblage. Alors pas de panique – vérifiez la qualité des liaisons.
En fonctionnement le programme est lancé par la présence d’eau ou après la période de « deep-sleep « qui est fixée à 1 heure.
Le programme vérifie alors la présence d’eau (pin 5) et/ou la tension de l’alimentation et/ou le dépassement du compteur d’heures (24 heures dans notre cas).
Dans ces trois cas le programme, si une limite est atteinte, envoi les informations en activant la liaison Wifi.
Programmes
J’ai développé deux programmes avec des cibles différentes :
- Envoi des informations à un serveur MQTT pour utilisation par un serveur domotique.
- Envoi des informations à un utilisateur courriel.
Consommation électrique
En « deep-sleep » la consommation électrique est de 6µA.
La consommation passe à 18mA sur 3s lorsque le programme est lancé et ne détecte pas d’anomalie.
Lorsque le programme se connecte en Wifi la consommation passe à 80mA pour 10s.
Deep sleep et compteur horaire
La durée maximale d’un état « deep sleep » de l’ESP12F est de 71 minutes. Pour le programme elle est réglée à 60 minutes (légèrement plus).
Un compteur (hourcounter) est incrémenté à chaque réveil du contrôleur c’est-à-dire toutes les heures. La valeur est ensuite stockée dans la mémoire non volatile du contrôleur pour être relue au prochain réveil.
Lorsque le compteur atteint la valeur 24 la connexion Wifi est démarrée et les informations sont envoyées.
Par cette remontée quotidienne on s’assure que l’appareil fonctionne toujours.
Vitesse du port série
Elle est fixée à 74880 (ainsi que le port de la console Arduino) afin de s’accorder à la vitesse par défaut au démarrage du contrôleur. Les erreurs de démarrage système sont alors lisibles (messages avant le démarrage du programme).
Programme Arduino pour MQTT
Le programme (répertoire « ESP12F_water_alarm_cop ») est composé de deux parties : le programme principale et l’ensemble des fonctions.
Les fonctions proviennent de Github (https://github.com/256dpi/arduino-mqtt ) ou se trouve également des explications détaillées.
Le programme principal, avec ses annotations, est simple et lisible.
Les fonctions ajoutées
TestCurrentTime interroge un site du net pour trouver la date et l’heure.
WriteCounter écrit en mémoire non volatile la valeur du compteur d’heures.
ReadCounter lit la valeur du compteur d’heures de la mémoire non volatile.
ESP API spécifiques : ESP.rtcUserMemoryWrite, ESP.rtcUserMemoryRead, ESP.getVcc sont utilisés pour mémoriser le compteur horaire et lire la tension de la batterie.
Ces informations envoyées
ProbeWaterStatus indique la présence d’eau
ProbeBattery indique la tension de la batterie
ProbeTimeOne indique l’heure (hhmm)
ProbeDate indique la date du jour (yyyymmdd)
ProbeWifiLevel indique le niveau du signal Wif (en Db)
ProbeWifiTime indique le temps pour se connecter au Wifi (en s)
Intégration openHAB
J’utilise un serveur domotique openHAB. Il est connecté au serveur MQTT et récupère les informations pour les traiter par des règles (rules).
Sur arrivée d’informations j’utilise les règles suivantes :
Détection d’eau ou batterie faible avec envoi d’un message.
Fichier rulestest.rules
Vérification si la sonde est toujours opérationnelle (langage Jruby) : on compare la date du jour avec la dernière date reçue. Si les dates diffèrent alors la sonde a un problème car elle devrait envoyer la date une fois par jour.
Fichier chauffeeau1.rb
Programme Arduino pour email
Le programme (répertoire « ESP12F_water_alarm_email_cop ») est composé de deux parties : le programme principal et l’ensemble des fonctions.
Les fonctions proviennent de Github (https://github.com/mobizt/ESP-Mail-Client ) ou se trouve également des explications détaillées.
Le programme principal avec ses annotations devient plus lisible.
Conclusion
Dans ce projet simple j’ai voulu mettre en avant quelques idées de programmation peu connues (mémoire non volatile, mesure niveau batterie) ainsi que la manipulation de la fonction « deep sleep » et la relation avec un serveur domotique au travers d’un serveur MQTT.
Si cela peut vous donner des idées j’en serais ravi. « Enjoy it ».
Sources d’inspiration :
https://docs.arduino.cc/tutorials/uno-wifi-rev2/uno-wifi-r2-mqtt-device-to-device
https://github.com/256dpi/arduino-mqtt
https://github.com/espressif/esp-idf/blob/master/components/nvs_flash/include/nvs.h
https://arduino-esp8266.readthedocs.io/en/latest/libraries.html#esp-specific-apis
Laisser un commentaire