Pivert's Blog

Mesure de la hauteur d’eau par la pression – M5Stack avec capteur TL-136


Reading Time: 5 minutes

Contexte

Surveillance de la hauteur d’eau dans une citerne utilisée pour l’eau des WC et arrosage.

Essai n°1

J’avais déjà fait une mesure assez précise avec un émetteur/récepteur ultrasons placé à 15 cm de la surface de l’eau au niveau maxi. Contrôlé par une platine ESP8266 sous Micropython (D1 Mini Pro 16 Mo).
La visualisation se faisait à l’aide de l’application mobile Blynk. Je recommande vivement, génial pour développer de petites applications IoT et les piloter ou les visualiser depuis son mobile. Il y a juste une librairie à ajouter au projet (BlynkLib.py), s’enregistrer sur le service pour avoir sa clef, et l’instancier avec cette clef.
Mais ce fut un échec, car après un mois de fonctionnement, les capteurs à ultrasons bon marché ne résistent pas à l’humidité à la surface de l’eau.

Matériel

SR-04 (1 €)

Avantages

  • Facilité de mise en œuvre du capteur
  • Précision (à distance < 1 m)

Inconvénients

  • Le capteur SR-04 ne supporte pas l’humidité – il existe des capteurs étanches, mais beaucoup plus chers.
  • Impossible d’avoir une mesure au-delà de 1 m, probablement à cause de la résonance des ultrasons dans la cuve, et du faible diamètre de la cuve (1 m).

Essai n°2 – La solution actuelle

Je me suis orienté vers un capteur TL-136 pour une plage de 0-3 m de hauteur de colonne d’eau, étanche, et à mettre au fond de la citerne.

Avantages

  • Matériel robuste, étanche, et à l’épreuve du temps
  • Signal 4-20 mA (~4 mA à pression atmosphérique), indépendant de la longueur et de la résistance du câble vers la sonde

Inconvénients

  • Le capteur TL-136 a besoin d’une alimentation d’au moins 20 à 24 V
  • Plus coûteux (25,47 € en 2020)
  • Essayer de maintenir la sonde à 10 cm du fond, pour éviter d’encrasser les petites ouvertures vers le capteur
  • Moins précis : ±0.2 % de 3000 mm (full range) – 6 mm
  • Mesure légèrement influencée par la pression atmosphérique ou la pression au-dessus de la citerne – mais on peut la déduire avec un capteur supplémentaire

Mise en œuvre

  • Il existe sur Amazon, des alimentations 24 V DC, avec en plus une sortie USB 5 V pour alimenter le microcontrôleur. L’idéal pour ce projet : SoulBay 24 V + USB 5 V
  • J’avais un M5Stack Basic sous la main
  • J’avais déjà un Prometheus + Grafana dans un LXC Proxmox et un Docker Swarm pour accueillir une stack Eclipse-Mosquitto comme serveur MQTT.
  • Avant d’immerger la sonde, mettre des repères. J’ai opté pour des colliers de serrage blancs de type Colson/Serflex tous les 50 cm.

Expérience

J’ai utilisé le Firmware Micropython et UIFlow. En général je préfère programmer directement en C ou en Python, mais il faut reconnaître que ce UIFlow a beaucoup d’avantages.

Sur l’alimentation SoulBay 24 V + USB 5 V, la masse est commune. Ce n’est pas un problème si on alimente la sonde en 24 V au travers d’une résistance de 330 Ω par la masse. Il suffit de connecter le CAN à la borne négative de la sonde pour mesurer la chute de tension dans la résistance, et en déduire le courant. (4-20 mA). 330 Ω peuvent paraître élevés, mais dans mon cas, je ne mesure des pressions de hauteur de colonne d’eau inférieures à 1.8 m, je n’attends donc pas des courants de sondes supérieurs à 16 mA.

On peut entre autre construire et modifier

  • l’interface graphique
  • les actions asynchrones telles que des pressions sur les boutons
  • les connexions externes telles qu’une connexion MQTT

Avec quelques widgets et du drag&drop.

Autres avantages du M5Stack + UIFlow:

  • On peut recharger un nouveau code via le Wifi. Juste faire un reset et le mettre en mode attente. Il affiche un code qu’il suffit de recopier dans UIFlow.
  • Le M5Stack avec ce firmware peut avoir plusieurs versions ou plusieurs applications, on peut changer l’application par défaut via la touche “App”.
  • À part pour lui charger le firmware Micropython UIFlow, je n’ai plus jamais eu besoin de le connecter au port USB.

Inconvénient :

  • On peut vérifier le code python généré par UIFlow, mais si on le modifie directement on ne peut plus utiliser l’éditeur graphique.
  • La batterie interne est limitée à 15 minutes de fonctionnement environ (avec écran allumé). – Pas un problème dans ce cas d’utilisation avec alimentation externe.
  • La formule de transformation de la pression en hauteur de la colonne d’eau doit être créée en fonction de la résistance, puis ajustée en fonction des mesures réelles.

Essayez vous-mêmes

En quelques secondes, vous pouvez le visualiser dans l’éditeur UIFlow  :

Bref, je recommande vivement le M5Stack, plus cher, mais ça vous fait économiser tellement de temps sur les petits projets.

L’UIFlow est encore un peu limité, mais permet au moins d’avoir un résultat graphique appréciable directement, et de ne pas avoir à relire la documentation de pas mal de fonctions.

Résultats

Grafana

Une fois les valeurs poussées dans une base de données Prometheus avec Grafana, on peut analyser et visualiser les valeurs à souhait. Et éventuellement y mettre des alertes. Le graphe de “variation” permet de voir à chaque fois qu’on prend de l’eau. Le graphe en dessous recherche des plages de croissance continue pour en déduire le débit d’eau de la source, semaine par semaine.

Pour pousser les valeurs dans Prometheus, j’utilise le file exporter de Prometheus, un script pour souscrire au «topic» «M5Stack» du MQTT qui réécrit le fichier /var/lib/prometheus/node-exporter/water_level.prom et un service systemd pour le démarrer. Tout est dans le repo GitLab.

Améliorations

La solution fonctionne bien depuis quelques mois, mais pas mal de petites améliorations sont possibles :

  • Le CAN de l’ESP32 du M5Stack n’est pas réputé pour sa précision. Un module voltmètre ou ampèremètre externe de précision serait plus précis. Ou bien ajouter un module pour donner une valeur de référence externe stable au CAN.
  • Une sonde 0-2 m aurait permis des mesures plus précises que la sonde 0-3 m pour des valeurs inférieures à 1,70 m.
  • Mesure et soustraction de la pression atmosphérique pour annuler son influence sur les mesures. Une variation de 1 mbar correspond à une erreur de 1 cm (WolframAlpha).
  • L’utilisation du file exporter Prometheus n’est pas adaptée à ce cas d’utilisation. Car même si la sonde ne renvoi pas de valeur, c’est l’ancienne valeur qui est réenregistrée en DB. La PushGateway de Prometheus a le même problème. La solution serait d’implémenter un node exporter en MicroPython.

Essai n°3 (vers la version définitive)

  • Migration du code sur le D1 Mini Pro (ESP8266) car j’ai besoin du M5Stack pour un projet de régulation de poêle, et surtout parce qu’avec la visualisation Grafana je n’utilise plus l’écran.
  • Ajout d’un capteur BME280 que j’ai en stock pour la mesure de pression atmosphérique, sinon prendre la pression depuis une API comme celle de DarkSky

Annexes

  • Plages de mesure du CAN de l’ESP32
  • En écrivant cet article, je me suis rendu compte que je n’étais pas le seul. J’apprécie particulièrement son idée d’utiliser des capteurs de reculs de voiture comme capteur à ultrasons. En anglais, mais très intéressant. Article

Like it ?

Get notified on new posts (max 1 / month)
Soyez informés lors des prochains articles

Leave a Reply

Your email address will not be published. Required fields are marked *