Une cuve de Fuel en mode connectée

image principale Une cuve de Fuel en mode connectée

Difficulté:

ou comment surveiller le niveau de sa cuve de Fuel et suivre sa consommation énergétique.


Il m’est souvent arrivé (au moins 3 fois) d’oublier de remplir ma cuve de fuel. En plus de petites remarques désobligeantes de la part de ma femme, de la perte de crédibilité auprès de mes enfants et de quelques soirées très froide, la petite blague m’a aussi coûtée un brûleur de chaudière (la pompe n’a pas du tout aimée la crasse du fond de la cuve que je suis allez chercher pour gagner quelques degrés!!!)
J’ai alors décidé que ça n’arriverais plus et que j’allais faire gaffe à partir de maintenant.
Mais si la posture du mec qui décide est bien sur louable, le risque que dans un an ou deux, j’oublie de surveiller ma cuve comme les 3 autres fois précédentes n’est pas tout à fait à négligeable.


D’où l’idée de mettre un peut de technologie là dedans…
Et de faire faire à des machines ce que je ne fais pas bien : ne pas oublier.


J’ai donc décidé de mettre en place un système pour surveiller ce qui me reste en stock de fuel et d’intégrer cette mesure à ma gestion du compteur électrique (voir tuto http://ouiaremakers.com/ferg-mon-vieux-compteur-edf-connecte-en-mode-framboise/).


Plutôt que de mesurer ce qui rentre et ce qui sort de la cuve, j’ai décidé de mesurer la quantité de fuel en stock.
Plutôt que de peser la cuve, mon choix s’est porté sur la mesure du niveau du fuel dans la cuve.
Et le plus simple m’a paru de mesurer la distance entre le haut de la cuve et le niveau du fuel.
Pour mesurer cette distance, j’ai utilisé un capteur ultra son.


Pour lire l’information et la transmettre à une base de données, j’ai dans un premier temps utilisé un arduino qui transmettait les mesures en RF433 Mhz. Ensuite les trames 433 Mhz étaient lue par un Rasperry pi. Ca fonctionnait un peu près mais le Rasperry tournait à 100% tout le temps pour décoder le signal sans que je trouve d’algorithme économe.


J’ai donc décidé de simplifier le problème en utilisant une puce ESP8266 qui va envoyer directement en Wifi les mesures à la base de données.


Ce capteur s’intègre dans ma solution FERG (voir tuto sur ouiaremakers.com).

Matériel :

Budget : Non défini

  • La solution définitive est composée de :
  • Obligatoirement
  • un capteur numérique de température DS18b20 (<1€) (disponible ici)
  • un capteur de distance par ultrason de qualité : HRLV-MaxSonar-EZ4 (33€50 chez Gotronic) avec le rayon de mesure le plus étroit possible.
  • un module nodeMcu (basé sur ESP8266) (5€) (disponible ici)
  • Facultatif
  • un serveur de base de données (chez moi un synology)
  • </ul>
  • <li>un autre système linux (chez moi une raspberry pi 2)</li> (disponible ici)
  • un autre système linux (chez moi une raspberry pi 2)

Etape 1 : Mesure de la distance

Un peu de physique :
Le son se propage dans l’air à la vitesse d’environ 330 mètres par secondes.
Pour mesurer la distance entre un emeteur de son et un objet assez gros, il suffit de gènèrer un son, attendre qu’il rebondisse sur l’objet et reviennent sur notre recepteur. la distance sera alors la moitier du temps qi’il a fallut pour faire l’aller retour multipliè par la vitesse du son.

un capteur basique & economique : le HC SR04
J’ai dans un premier temps utilisè ce capteur très simple et surtout très économique.
Pour l’utiliser, rien de plus simple: on envoie une impulsion de 10us sur la pin trigger puis on mesure le temps durant lequel la pin echo est à High.
Si vous voulez utiliser ce capteur avec un raspberry pi, vous pouvez utiliser ma librairie python FGPIO (https://pypi.python.org/pypi/FGPIO).
Tout allait bien jusqu’à ce que le niveau de ma cuve ne baisse trop : le capteur c’est mis à mesurer les bords et non plus le niveau du fuel!
En fait, l’angle de mesure est trop ouvert (voir schéma).

un capteur de précision : le HRLV-MaxSonar®-EZ4™ :
La solution au problème a donc été de mettre la main à la poche et d’investir 30€ dans un vrai capteur de précision!

Cette fois ci, plus besoin de gérer l’envoie du signal, ni de compter le temps qu’il met à revenir, tout est géré par le capteur.

La distance peut être lue de différentes manières (PWM, analogique, série).
Les pins :

1 Connecteur pour capteur de température optionnel
2 Sortie Pulse Width Output : pulsation avec une largeur de 1 µs / mm
plage de sortie : 300µS(300mm) / 5000µS (5000mm)
3 Sortie Analogique :
Distance = V/Vcc/1024*5mm
ex (Vcc = 5V):
0V : 0mm
1V : 1024mm
4.885V : 5000mm
4 Start/Stop
par défaut, cette pin est à HIGH et le capteur mesure tout le temp si on met la pin à LOW : le capteur est stoppé
pour re démarrer, il faut 20µs
5 Sortie série
si le jumper n’est pas soudé : RS232
si le jumper est soudé : TTL
sortie : R9999 où 9999 est la distance en mm
(c’est la sortie la plus précise)
6 Vcc : 2.5V – 5.5V
(s’il y a du bruit dans Vcc, il faut ajouter une capa de 100µF entre Vcc et GND
GND 0V

Pour mon cas, j’ai utilisé le mode de lecture série. J’ai donc du souder le jumper.
On peut aussi utiliser les deux autres modes, mais il sont un peu moins précis dans la transmission de l’information.

Etape 2 : Le module NodeMcu (avec de l’ESP8266 dedans)

"" onclick="__gaTracker('send', 'event', 'outbound-article', '" rel="nofollow external" class="ext-link" target="_blank">"https://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx" onclick="__gaTracker('send', 'event', 'outbound-article', 'https://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx', 'https://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx');" rel="nofollow external" class="ext-link" target="_blank">https://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx

  • Un firmware a personnaliser soit même : "https://github.com/nodemcu/nodemcu-flasher" onclick="__gaTracker('send', 'event', 'outbound-article', 'https://github.com/nodemcu/nodemcu-flasher', 'https://github.com/nodemcu/nodemcu-flasher');" rel="nofollow external" class="ext-link" target="_blank">https://github.com/nodemcu/nodemcu-flasher
  • un module de développement :
  • Etape 3 : Cablage


    Le capteur de température est optionnel, il est juste utilisé pour suivre le température de mon garage.

    Par contre vous ne pouvez ignorer que la vitesse du son dans l’air dépend de la pression atmosphérique et de la température de l’air (environ 1% par °C).
    Là, pas de stress, le capteur gère (la température en tout cas).

    Etape 4 : Installation in situ

    Etape 5 : Code LUA : lecture capteur Ultra Son


    L’ESP8266 n’a pas beaucoup de RAM, par contre la mémoire flash est largement suffisante. Il faut mieux créer plusieurs petits fichier .lua que l’on pourra exécuter à la demande plutôt que de charger un gros fichier avec pleins de fonction.

    Pour le calcul de la distance : distance.lua

    La difficulté est que la mesure renvoyée par le capteur n’est pas toujours parfaite. De temps en temps une mesure adhérente nous tombe dessus! Nous allons donc devoir analyser le degré de précision de la mesure avant de la valider.
    Pour ceci :
    – on lance une alarme qui va va essayer toutes des 10 secondes de mesurer la hauteur du fuel dans la cuve.
    – Cette alarme met en route le capteur et attend de recevoir des infos valides en UART.
    – Ensuite, on enregistre 20 mesures et si l’écart type de la mesure est ok, la mesure est validée, sinon pas.

    Pour transformer la distance en litres de fuel, voir dans params.lua la fonction contenance(). Chez moi, quand la cuve est pleine et comme je n’arrive pas à mesurer des distances < 300mm, je compte 1400 litres quand la distance est < 300 mm ; sinon, contenance = 1500 – distance / 1600 * 1500 (1500 = volume de la cuve ; 1600 = hauteur de la cuve).

    Etape 6 : Code LUA : lecture capteur de température

    Etape 7 : Envoyer les données à la base de données

    Dans les deux fichiers distance.lua et temperature.lua, nous avons envoyé à un serveur la requête GET suivante :

    http:192.168.10.10/tempeDB/index.php?table=mesures&capteur=%capteur%&temperature=%valeur%

    (voir params.lua pour modifier)
    où %capteur% = nom d’un capteur
    et %valeur% = valeur (ici température et hauteur de fuel)

    Je laisserais à chacun le soin d’aménager à son propre environnement.
    Pour ma part, j’utilise un NAS Synology sur lequel tourne
    – un serveur web ( mettre le contenu de http://www.tempeDB.zip à sa racine)
    – une base MariaDb (fork de MySQL) voir plus bas.

    Etape 8 : Code LUA : un mini serveur web

    "La Cuve de Fuel" host = "ESP_FUEL" html_bgcolor = "silver" html_temp_icone = "" html_sensor_name = "Garage" function html_cuve_image(vol) if vol == "???" then return "" end if vol > 1399 then return "" end if vol > 1249 then return "" end if vol > 1099 then return "" end if vol > 1069 then return "" end if vol > 750 then return "" end if vol > 600 then return "" end if vol > 450 then return "" end if vol > 300 then return "" end if vol > 150 then return "" end if vol > 100 then return "" else return "" end end

    Etape 9 : Charger le code dans le microcontroleur

    Avant de pouvoir programmer le module, il faut mettre à jour le firmware du module.
    Et tout d’abord, on va “commander” un firmware sur mesure :
    – aller sur http://nodemcu-build.com/
    – saisissez votre email et sélectionner les modules a inclure à votre firmware.
    – validez la demande, le firmware sur mesure va vous être livré dans les minutes qui suivent.
    – branchez le module sur le port USB (si vous avez bien installé le driver, ça devrait bien se passer, sinon, …)
    – ouvrez ESP8266Flasher (que vous avez installé à l’étape 2)
    – le port COM se sélectionne tout seul
    – dans l’onglet config, choisissez votre firmware (bouton engrenages) et laissez d’adress tel quel (0x00000)
    – retour à l’onglet principal et “Flash”
    – le module clignote, et la barre de progression progresse …. quelques minutes à 9600 bauds

    Quand c’est fini, rebooter le module et c’est tout bon!

    Etape 10 : Charger le code lua, le compiler

    Pour programmer le module nodecmu, le plus simple est d’utiliser http://esp8266.ru/esplorer/.

    Mise en route : brancher et module et lancer le programme. Le port est sélectionné automatiquement.

    Ouvrer tous les fichier lua présents dans le fichier cuve_fuel.zip
    => ils s’affichent à gauche

    Modifiez le fichier params.lua selon votre configuration.

    Pour chaque fichier, faites “Save to ESP” (sauf init.lua pour l’instant)
    => le fichier est uploadé dans la mémoire flash du microcontroleur.
    => et il s’exécute. Il risque donc de faire une erreur tant que tous les fichiers ne sont pas chargés (pas grave)

    Quand ils sont tous uploadés, rebooter le module et faites un “reload”. Vous devez obtenir comme sur l’image 2.

    Nous allons ensuite les compiler. Pour celà : click droit sur le fichier (coté microcontrôleur, à droite), “compile xxxx to .lc”.
    L’intérêt est de gagner un peu de place en mémoire!
    Nous pouvez maintenant supprimer les fichiers lua du microcontrôleur (ou les laisser, n’importe).

    Rebooter (çà nettoie la mémoire).

    Ensuite, executer main.lc, vous devriez obtenir rapidement :

    > dofile(“main.lc”)
    *************************
    * CUVE FUEL *
    *************************
    Lecture des paramètres ok.
    M> Waiting for Wifi connection
    Waiting for Wifi connection
    Waiting for Wifi connection
    Waiting for Wifi connection
    Waiting for Wifi connection
    ESP8266 mode is: 1
    The module MAC address is: 5e:cf:7f:0b:16:f6
    Config done, IP is 192.168.10.171

    puis les mesures de température et de hauteur de cuve si tous les capteurs sont branchés.

    Dernière touche : pour que le programme main.lc s’execute tout seul, il faut uploader init.lua (c’est le programme que lancer toujours le microcontrôleur au boot.
    Pas la peine de la compiler celui là, il ne fait que :
    dofile(“main.lc”)

    Etape 11 : La base de données


    Nous utilisons la même base que pour le projet FERG (http://ouiaremakers.com/ferg-mon-vieux-compteur-edf-connecte-en-mode-framboise/) de gestion du compteur électrique.

    A créer :

    table nom données
    grandeur_mesuree CuveFuel table_donnees = ‘mesures’, …
    grandeur_mesuree Garage table_donnees = ‘mesures’, …
    capteurs CuveFuel juste min et max a adapter (‘formule’= inutilisé)
    capteurs Garage juste min et max a adapter (‘formule’= inutilisé)
    alertes CuveFuel définir les alertes selon seuil mini, qui vont envoyer les alertes par mail
    Etape 12 : Intégration à FERG

    Etape 13 : Résultats graphiques : le niveau de la cuve


    voir température pour site web qui permet de faire quelques graphes
    (à adapter à vos besoins)

    http://192.168.10.10/temperatures/index.php

    (a noter sur la courbe : petite période de quelques jours où le capteur à déconné)

    Etape 14 : Résultats graphiques : consommation energie

    "" onclick="__gaTracker('send', 'event', 'outbound-article', '" rel="nofollow external" class="ext-link" target="_blank">

    Etape 15 : Pour allez plus loin

    Sources :

    http://nodemcu.com/index_en.html, https://nodemcu.readthedocs.org/en/dev/, http://www.maxbotix.com/Ultrasonic_Sensors/High_Resolution_Sensors.htm


    Super réalisation et programmation impressionnante…pour mon niveau !
    J'ai aussi un système pour ma cuve avec le HC SR04, je ne rencontre pas le problème que vous soulevez et ma cuve ressemble à la votre (1500L) mais je ne suis jamais descendu en dessous de 29cm (146cm mesuré avec le HC SR04).
    La programmation est plus simple puisqu'elle est basé sur le projet Mysensors (NRF24L01+Arduino) connecté à un raspberry Pi2 ou tourne le logiciel domotique Jeedom. J'ai aussi les info de mon compteur, les commandes de volets roulants et gestion sonnette, lumière…

    Bonjour

    Genial j'ai moi même fais le choix de l'arduino plutot et la sonde HC SR0.

    Je suis pratiquement sur qu'on peut aussi la mettre sur un ESP-01

    mon site ; karlytau.fr pour mes tests

    bon travail

    Bonjour,

    Excellent tuto !!

    J'avais commencé par faire des mesures dans mes cuves (2 de 750 l) avec des capteurs HR SR04, mais avais remarqué, comme vous, des erreurs en fonction du niveau des cuves ..

    L'idée de passer sur un meilleur capteur est une très bonne idée !!

    Par contre, question de béotien: comment récupérer vos sources ?

    Merci encore

    Bonjour

    Quel est le logiciel utilisé pour programmer le Nodemcu (copie écran du fichier lua Etape 5)

    Merci !!

    Ces tutoriels devraient vous plaire

    vignette Arduino et Porte automatique de poulailler
    Arduino et Porte automatique de poulailler
    vignette Préparer un fichier pour une découpe et une gravure laser
    Préparer un fichier pour une découpe et une gravure laser
    vignette Écran Tactile et Raspberry Pi
    Écran Tactile et Raspberry Pi

    Découvrez tous les tutoriels partagés sur Oui Are Makers

    Powered by Oui Are Makers