Sonde de mesure de cuve d’eau de pluie à base d’ESP8266

Apres avoir installé des cuves de récupération d’eau de pluie sur les gouttières de ma maison (3 en tout), je me suis rapidement aperçu que je ne les utilisais pas correctement. Celles ci ressemblent un peu à ca :

Cuve eau de pluie

Faible encombrement mais complètement opaque et pas de moyen de voir à l’intérieur. Il est alors difficile de savoir si elle est 1/3 ou 3/4 pleine par exemple. J’ai tendance à trop vider certaine alors que d’autres débordent… L’idée est donc de savoir le niveau de chacune des 3 cuves.

Solutions candidates

Pour cela, plusieurs solutions étaient possibles :

  • à l’aide de capteur de niveau positionnés à hauteurs régulières
    assez difficile à mettre en place, il faudrait tronçonner le haut de la cuve pour pouvoir installer. La mesure manque de précision.
  • à l’aide d’un capteur de pression coulé au fond de la cuve
    plus il y a d’eau, plus la pression est forte. Cependant, un tel capteur est tres cher, et les calculs sont tres compliqués
  • à l’aide d’un capteur ultrasonic posé sur le dessus de la cuve
    2 petits trous sont seulement à faire. Le capteur mesure sa distance par rapport à la surface de l’eau. Un petit calcul permet ensuite de calculer avec une précision correcte la quantité de litres d’eau dans la cuve. (si si rappelez vous, la formule avec π :p)

Solution retenue

Il n’est pas très propre de câbler toutes les cuves, ça ferait beaucoup de câbles, la nécessiter de creuser des tranchées pour y mettre les gaines ICTA, percer les murs extérieurs de la maisons … J’ai donc cherché le moyen de produire un capteur sans fil faible consommation qui tiendrait sur batterie. Le module ESP8266-07 correspond parfaitement à mon besoin !

Le capteur ultra sonic US-100

Capteur UltraSonic US-100. Le jumper est haut dessus des pins I/O
Capteur UltraSonic US-100. Le jumper est haut dessus des pins I/O

Le module ESP8266 ne fonctionne qu’en 3.3V, il me faut donc un capteur ultrasonic qui fonctionne dans cette plage de tension. Le module US-100 répond à cette exigence. Cependant, celui ci procède à une remontée de tension à 5V et répond donc en 5V. Il faut donc faire un pont diviseur de tension afin de ramener ce signal sur 3.3V

Ce module permet 2 modes d’interrogation que l’on choisit à l’aide d’un jumper à l’arriere :

  • jumper présent : en UART, le composant dialogue sur une liaison série
  • sans jumper : avec un principe trigger / echo

J’ai retenu pour sa simplicité la solution trigger/echo. Quelques lignes de codes sont plus claires qu’un long discours :

Le setup est le suivant :

La mesure se fait ainsi (dans le loop) :

Le principe est simple: comme une chauve souris, on envoie un son (un ultra son pour être précis 🙂 ) puis on attend son écho. La surface de l’eau reflétant le son, cela permet de mesurer à quelle distance on est de la surface de l’eau. Vous trouverez facilement sur internet pourquoi diviser par 58, ce n’est pas une valeur prise au hasard 😉

Le circuit

Apres un prototypage sur breadboard, je suis parvenu au circuit suivant :

Circuit capteur de niveau de cuve
Circuit capteur de niveau de cuve

Le voici également en couleur 🙂 :

Fritzing capteur de niveau de cuve
Fritzing capteur de niveau de cuve

Détaillons un peu :

  • Le circuit est alimenté par 2 piles AA de 1.5 qui sortent un peu plus de 3V
  • Le capteur ultrasonic est branché via des pins headers de la facon suivante :
    • VCC sur GPIO 12 (12 est un choix plus ou moins arbitraire)
      brancher VCC sur une GPIO permet d’alimenter le capteur à la demande, sinon celui ci consommerait en permanence dans le vide.
    • trigger sur GPIO4
    • echo sur GPIO 5 via un pont diviseur 5v->3v
    • GND sur GND 🙂
  • GPIO0 est branché sur un switch qui va :
    • sur GND lorsque l’on veut uploader un nouveau programme sur le microcontroleur
    • sur un resistance de pull up VCC en mode exécution normale
  • GPIO16 et relié à RESET et les deux sont en pull up VCC
    GPIO16 va réveiller l’ESP8266 périodiquement en faisant un reset. On pull up pour éviter les reset intempestifs
  • Des pins headers sont présents afin de pouvoir updater plus tard en cas de besoin le système :
    • reset
    • TXD
    • RXD
  • Des pins headers pour brancher ce qu’il faut sur le système :
    • VCC
    • GND
    • I/O pour le capteur ultrasonic

Le montage

Voici quelques photos du montage final :

Système autonome sous tension
Système autonome sous tension
Zoom sur le PCB
Zoom sur le PCB
Zoom sur le PCB arrière
Zoom sur le PCB arrière

Il faudra bien sur le mettre dans une jolie boite étanche. Une boite de dérivation fera très bien l’affaire.

Fonctionnement

A chaque démarrage, le capteur :

  1. se connecte au réseau wifi
  2. alimente le capteur ultrasonic
  3. patiente un peu le temps que celui ci s’initialise bien
  4. fait la mesure et calcule le résultat
  5. envoie le résultat via un appel HTTP en GET à un serveur
  6. s’endort pendant un temps défini (ici un peu plus d’une heure)

Le système faible consommation consomme si peu  car seul le circuit RTC fonctionne (je ne suis pas sur que ce soit exactement un RTC, mais le principe est le même).
On indique au système de s’éteindre et de se rallumer dans x microseconde (MICRO seconde ! c’est tres tres court). Lorsqu’il se réveille, il ne retrouve pas l’état dans lequel il était, il fait un RESET. Cela ne pose pas de problème dans le cas d’une sonde car on a pas d’informations à retenir d’un reveil à l’autre. Si vous souhaitez garder des informations dans le système entre chaque réveil, il faudra jouer avec l’EEPROM.

Le code

Pour information, ma sonde est interfacée avec un serveur jeedom et donc prévu pour faire un appel HTTP GET vers l’API de Jeedom. Libre à vous d’adapter ce script à votre système de monitoring 😉

Vous constaterez que j’ai laissé les informations de débug commentées dans le code. Cela permet de débuguer en cas de besoin.

J’ai également positionné ma sonde en IP fixe, afin de raccourcir le temps de connexion et ne pas faire appel au serveur DHCP  local.

Voici le code source du système :

Consommation

D’apres mes mesures au multimètre, ce circuit consomme 0.15mA en veille et un peu moins de 70mA en fonction.

Il s’allume toute les heure environ pendant quelques secondes. Disons 10s pour etre vraiment pessimiste.

Cela fait :

  • 0.15mA * 24 = 3.6mAh par jour de « perdu » en idle
  • 70mA / 3600 * 10s * 24 = 4.7mAh par jour de fonctionnement
  • (3.6 + 4.7) * 365 = 3029 mAh par an au total

D’apres wikipedia, une pile alkaline classique contient 1800 à 2600mAh. Ainsi, avec 4 piles AA, cette sonde devrait pouvoir tenir au moins un an, moyennant la perte normale de la pile et les variations de température.

36 réponses à “Sonde de mesure de cuve d’eau de pluie à base d’ESP8266

  1. Hello,

    J’essaie de faire quelque chose de similaire mais je m’arrache les cheveux avec un ESP-01 qui est assez capricieux au niveau de la tension qu’il reçoit, du courant qu’il peut tirer à un moment T (mitigé avec un gros condensateur) et un HC-SR04 que je dois être alimenté en 5V alors que l’ESP veut du 3.3V.

    Bref, ton explication tombe du ciel comme un gros steak devant un affamé 🙂 Merci.

    Pour le moment je me pose une question. 2 x 1.5V suffisent à alimenter l’ESP-07 et l’US-100 sans problème sachant que l’ESP-07 attend 3.3V (ou peut-il recevoir un peu moins?)

    Merci

    1. Salut dynek,

      Je n’ai pas fait de mesures particulières, mais avec mon ESP, j’ai pu tenir plusieurs semaines sur 2 piles AA (et donc 2 fois plus longtemps avec 2 couples de AA montés en parallèle). En fait les piles délivrent une tensions un peu supérieure à 1.5V qui sied très bien à l’esp8266 ;p

  2. J’ai reçu les pièces pour faire le montage et mon doute sur l’alimentation est levé je crois.. L’ESP accepte entre 3V et 3.6V donc on est tout bon avec deux AA. On verra combien de temps ça tient avec le deep sleep.

    Sur ton dessin du circuit je crois qu’il y a un couac sur la connexion GPIO5 Echo. Le fontionnement est logique bien entendu mais on dirait que GPIO5 va droit au GND de la batterie et que le GND de l’ESP va sur l’echo de l’US-100 par R1.

    Merci d’avoir mis en ligne ces infos!

  3. Super intéressant ! Pensez vous qu’il possible de faire la même chose sur un base module ESP8266 ESP-12 ? Où y a t il une contrainte à choisir un module ESP8266 ESP-07 ?

    1. Pas de contraintes pour utiliser un ESP-12. J’avais choisit la version 07 pour son antenne déportée qui est orientable et permet une meilleure portée 🙂

  4. Bonjour, pardonnez mon ignorance, mais d’où sortent les 5v ? je ne vois sur le montage que 2 piles de 1.5V chacune.

    « echo sur GPIO 5 via un pont diviseur 5v->3v »

    1. Bonjour Eric,

      Les 5V sortent du capteur ultrasonic.
      Celui ci accepte d’être alimenté à une tension inférieure, mais sort du 5V sur sa sortie ECHO.
      Avec le recul aujourd’hui cela me semble surprenant, mais lorsque j’avais lu la doc à l’époque, c’est ce qui était spécifié.

    1. Bonjour Sebastien,

      Le circuit présenté doit être alimenté en 3.3V
      Ce que tu présentes est en 5V, tu ferais griller l’esp 🙂 Tu peux toujours mettre un pont diviseur.

      ++

  5. Ok, en fait, je n’ai pas été clair, je pensais viré le booster 3v->5v du montage et donc alimenter par la batterie li ion direct. Mai sune batterie li ion pleine charge fait un peu plus de 3.3v (3.6 exactement).
    Faut il que je prévois un diviseur pour être sur de rester à 3.3 ou 3?
    Merci encore.

    1. Je viens de faire une petite recherche et il faut reguler à 3.3v et ne pas utiliser en direct la cellule…
      Du coup, je vais regarder ce que je vais faire…
      Pas tres beau mais peut etre un booster à 5v et un regulateur à 3.3v derriere pour etre sur d’etre toujours impeccable.
      Il y aura de la perte mais comme la batterie sera chargé avec un panneau solaire… ca le fera…
      Merci

      1. Pour info, l’esp est finalement assez conciliant. Il accepte des tensions inférieures à 3V. Je n’ai pas fait de mesures exactes, mais il doit pouvoir encaisser de 2.5V à 3.6 grosse louche.

    1. bonjour Ninux,
      Pour ma part, je m’était fournis chez aliexpress.
      Si tu veux t’éviter de trop longues heures de recherches, seeedstudio ou adafruit devrait faire l’affaire 😉

  6. Merci Xavier,

    Super montage, j’ai tout commandé chez Aliexpress.
    J’ai le même récupérateur d’eau, c’est bien un 800L que tu as ?
    Comment interprète tu le résultat sur Jeedom de la sonde pour calculer le niveau et le volume d’eau ?

    1. Quelques règles de géométrie ajoutées dans un jeedom virtuel.
      J’ai estimé le demi diamètre de la cuve que je multiple simplement par la hauteur réelle. La hauteur réelle de l’eau est calculée à partir de la distance mesurée par le capteur ultrasonic.

      Le volume est calculé ainsi : ((129-#[Extérieur][Cuve Garage][Niveau]#)/10)*3.14*(40*40)/100
      Le pourcentage de remplissage ainsi : 100-((#[Extérieur][Cuve Garage][Niveau]#-21)/150)*100
      Je ne saurais plus te dire quelle valeur correspond à quoi par contre, je n’ai pas fait ce montage chez moi.

  7. Bonjour,

    je suis venu a bout du montage (j’avais soudé quelques bugs ;))
    Mon module ESP07 semble fonctionner correctement avec le firmware AT de base. Je vois bien les réseaux wifi et peux m’y connecter.
    Par contre, pas moyen d’uploader le sketch depuis l’IDE Arduino. En fonction des quelques modifications de paramètres que j’ai pu faire, soit le module boot en boucle soit le module s’arrête sur ets_main.cp et ne lance pas l’app.
    Avez vous rencontré des problemes de la sorte ? Quels paramètres utilisez vous dans l’IDE Arduino pour faire la compil et l’upload?
    Désolé de toutes ces questions, j’ai fouillé pas mal sans trouver pour le moment et il ne me manque que ca pour terminer…

    Merci d’avance.

  8. Je viens de réaliser le montage.
    Il me manque US-100 mais tout semble fonctionner j’ai bien dans les logs de Jeedom un appel a l’API.
    Par contre il ne boucle pas, plus rien après cet appel.
    Avez vous une idée d’où peux provenir le problème ?

    1. Plus rien même plusieurs heures après ?
      Vous pouvez activer le debug en décommentant des ligne pour analyser ce qu’il se passe.

      1. Le problème provenait d’une mauvaise soudure entre l’ESP et la breadboard.
        Tout fonctionne correctement maintenant j’ai bien toute les 1h un appel à l’API.
        Plus qu’a attendre mon US-100…

        Merci Xavier

        1. J’ai reçu enfin mon US-100.
          Par contre la valeur renvoyé oscille entre 30 et 44cm.
          J’ai l’impression que l’angle de l’US-100 tape sur les parois du récupérateur d’eau.

          Ou avez vous fixé l’US-100, le mien est placé sur la plaque ronde sur le dessus du récupérateur ?

          1. Bonjour Ninux,

            Oui, j’ai percé une espèce de couvercle qu’il y a sur le haut de la cuve.
            Essayez de le centrer le plus possible.
            Je ne connais pas le diamètre de votre cuve, mais si celle ci est trop étroite, l’onde de mesure peu effectivement se répercuter sur les parois. Il doit être possible de bricoler un peu l’US100 en rallongeant les tubes emetteur/recepteurs afin de focaliser l’onde de mesure.
            Tenez moi au courant !

          2. Bonsoir,
            Même soucis de réflexion indésirable !!!
            A la base, j’ai utilisé ce module (http://www.ebay.fr/itm/321714364470?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT) et cela fonctionnait très bien jusqu’au jour, mon puits est descendu à 50 cm d’eau et là, cata… (il fait 1m de diamètre…) la mesure remontée était fausse de 1 mètre ! (réflexions je pense…)
            J’ai alors regardé plus précisément les données techniques de ces capteurs et me suis rendu compte que le modèle choisi était étanche, très bien, mais un angle de 50° contre 10 à 15 avec le HC-SR04 !!! Je vais donc refaire tout ça avec un HC-SR04 mais pour le moment je buggue sur ESP Easy (je suis moi aussi sous jeedom 😉 qui ne veut pas dialoguer avec ce capteur … GRRRR (il ne e donne que 0 ou 1 ???) à moins que vous ayez une idée pour modifier l’angle du JSN-SR04T pour l’amener à 10°… ?

          3. Hello Christophe,

            Aucune idée pour modifier ton JSN-SR04T.
            Par contre, ton jeedom ne reçoit que 0 ou 1 car tu as du setter la donnée en binaire. Essai de la typer en curseur ou numérique.

          4. Bonjour Carl,

            C’est une demie colonne romaine comme celle en photo sur ton blog.
            Elle fait 465mm de diamètre.
            J’ai placé l’US100 au centre du couvercle.
            Je vais essayer de rallonger les tubes.

            Merci

  9. Bonjour
    j’ai effectué un montage que je développe au fil de l’eau sur mon site http://karlytau.raidghost.com.
    Moi c’est un problème de niveau de cuve de fuel.
    Plus proche de mon besoin mais le problème reste le même.
    Un module arduino avec son shield RJ45 pour supporter du CPL et une sonde à Ultrasons étanche « JSN-SR04T ».
    Le tout alimente un site web visible sur mon site avec à la base du Google charts amélioré.
    voila le tout est assez complexe mais on y arrive et c’est fiable.
    4 mesures par jour avec différentes températures relevées.
    Cordialement

  10. Bonjour,
    Merci beaucoup pour ce tuto qui m’a été bien utile 🙂
    Juste une précision le capteur US-100 ne renvoi pas une tension de 5v mais bien une tension max à VCC.
    Donc pas besoin de pont diviseur.
    Surtout que le pont diviseur de ton schéma divise la tension 3.3V de l’ESP et donc rabaisse la tension en sortie de l’US-100 à 2.2V qui par chance et suffisamment grande pour basculer l’entrée de l’ESP.
    Encore merci !!

  11. Bonjour Xavier Carl,

    Petite question concernant Jeedom. Comment fais-tu exactement pour récupérer la (les) valeur(s) ?
    La sonde envoi l’info et jeedom est à l’écoute (via le plugin script) ?

    Merci,
    Didier

    1. Bonjour Didier,

      J’ai utilisé le plugin Virtuel que j’ai adressé via l’API HTTP en passant le tocken API + l’identifiant de l’objet créé et la valeur est passée en slider.

      A+

  12. Bonjour xavier,

    J’aimerais fabriquer ce genre de montage capteur et l installer sur mon silo de mon insert a pellet, pour mesurer le niveau de pellet et m’alerter via jeedom lorsqu’il faut remplir a nouveau le silo

    Pensez vous que ca puisse faire l affaire ?

    N’etant pas forcement très manuel, tt cela me semble très compliqué, n existe t il pas le méme genre de solution/montage prêt a l emploi (n’etant pas tres a l aise niveau fer a souder, composants electroniques…)?

    ‘utilise jeedom avec

    1. Bonjour Alex
      Cela dépend de la largeur du silo, s’il n’est pas trop etroit ni trop profond, cela devrait faire l’affaire.
      Justement, c’est parce qu’il manquait ce genre d’équipement que j’ai fini par le faire moi même.
      Je n’ai pas vu d’équivalent dans le commerce depuis, désolé 🙂

      1. En fait, il s’agit d’un insert à pellet dont le silo contient environ 90kgs de pellets.

        Le silo mesure environ 80 cms de haut x 80 cms de large x 20 cms d' »épaisseur »

        Je pensais placer le capteur bien au centre, sur la partie haute bien sûre, par contre il y a deux « renforts » métal a l’intérieur :
        http://hpics.li/a014235

        Pensez vous que si je positionne le capteur en « 1 », les barres de renfort situé en 2 puissent fausser la mesure ?!?
        http://hpics.li/1eb295d

  13. Bonsoir,
    Excellente idée et excellent article, bien documenté, bravo !
    Je suis en train de tester avec une ESP-12 (Wemos D1 mini), et un HC_SR-04, ça ne fonctionne pas …
    Les 3v3 fournis par les piles ne sont pas suffisantes pour le HC-SR04 !
    Du coup, connecté en 5V USB, c’est ok, mais avec les piles … 0cm à chaque fois
    Solution : Un élévateur 3v3 à 5V fera certainement l’affaire, je vais en commander un
    Petite idée d’amélioration : Le A0 de l’ESP servira à mesurer le voltage des piles, pour les changer en temps voulu 😉
    Merci

Laisser un commentaire

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