Suivre sa consommation d’eau : domotisation d’un compteur d’eau à l’aide d’un arduino

Bonne année à tous (mieux vaut tard que jamais :). Pour commencer cette année, un petit article sur le relevé automatique de la consommation d’eau. Le montage utilise un compteur d’eau banal du commerce (sans capteur donc) et ne nécessite pas son démontage.

[adsGrandRectangleTexte]

Relever sa consommation d’eau : les différentes solutions

Pour faire du relevé de compteurs d’eau, il n’y a pas 36 solutions. Il faut que le compteur soit équipé d’un capteur.

Les solutions commerciales, « plug&play », fiables … et pas trop bon marché

Il existe des compteurs avec une sortie pour un capteur à impulsion? J’en possède un de la marque Sappel, on peut lui ajouter un module nommé « Pulsar » mais outre le compteur qui coute ~40€ le module capteur coute lui ~80€ … 120€ pour avoir un retour de consommation d’eau, autant dire que c’est un investissement long terme … d’autant plus si l’on souhaite domotiser deux compteurs (eau froide et eau chaude).
Il en existe d’autres, le compteur d’eau ci-dessous avec sortie impulsion semble pas mal utilisé :

On le trouve chez planète domotique par exemple : http://www.planete-domotique.com/energie/consommation-d-eau/compteur-d-eau-froide-avec-sortie-impulsion-1-imp-1-litre.html. Coté prix c’est mieux mais on va faire mieux 🙂

La solution du pauvre, play&plug ;), aussi fiables et pas chères !

Comme d’habitude je suis parti sur une solution la moins chère possible et sans sacrifier la fiabilité.

Domotisons un compteur d’eau classique

Là aussi, il existe plusieurs solutions. Il y a des compteurs à roues, comme celui ci:

On peut les démonter et placer un petit aimant sur l’aiguille des litres puis placer un capteur, genre capteur d’ouverture de porte, dessus. A chaque tour, le capteur renvoie un changement de statut. Vous trouverez des infos sur ce type de montage ici : http://www.macoda.com/index.php/Montage:Compteur_eau_DS2423

Je ne voulais pas démonter mon compteur et j’ai opté pour une autre solution : la lumière.

Montage à base d’arduino et d’interrupteur optique

J’ai domotiser deux compteurs, celui de marque Sappel ainsi qu’un deuxième pour l’eau chaude de marque itron que l’on trouve à 20€ en GSB. J’ai choisi ces deux compteurs d’eau car il ont en commun de posséder un demi disque réfléchissant couleur métal (cf flèche rouge) qui fait un tour à chaque litre consommé :

L’idée est donc de trouver un capteur capable de détecter ce disque. J’ai choisi un CNY70. C’est un capteur de réflexion aussi appelé “interrupteur optique”.
Pour l’histoire, les capteurs de réflexions sont très présent en robotique. On peut utiliser notamment le CNY70 pour réaliser un suiveur de ligne. Il va permettre de différencier deux surfaces ayant une réflexion différente (la ligne noire du circuit et le blanc de la piste autour). Dans notre cas le demi disque réfléchissant.

Vous pouvez vous en procurer dans tous les magasins en ligne d’électronique aux alentours de 1€ ou directement chez le fabricant sous forme de sample (gratuit :).

Fonctionnement du CNY70 :

Il possède un émetteur et un récepteur infrarouge accordés sur la même longueur d’onde.
L’émetteur est une diode infrarouge et le récepteur est un phototransistor. La diode émet de la lumière IR en direction du disque. Si le capteur se trouve au dessus d’un objet de couleur claire, la lumière se reflète et vient frapper le phototransistor qui devient passant. Si on le connecte sur une pin digital de l’arduino, celle-ci passe à 1 lorsque quelque chose est détecté, sinon 0.

Pour connecter le capteur à l’arduino j’ai utilisé le schéma suivant (attention à la polarité, j’ai grillé bêtement la diode infrarouge sur un cny70) :

Schéma de connexion arduino cny70

le schéma d’origine : http://www.flickr.com/photos/igorgm/2486110065/
 

Les tests

L’arduino est maintenant capable de recevoir les informations du capteur CNY70.

Lors de mes premiers tests, le capteur était collé directement contre le compteur et il renvoyait toujours 1 (la lumière était réfléchie que le disque soit en face ou pas).
Il est donc préférable d’éloigner le capteur de quelque cm pour qu’il soit moins sensible. Pour ce faire, je l’ai enfermer dans un petit tube PVC (type gaine d’électricité rigide) d’un diamètre équivalent à celui du demi disque. J’ai ensuite coller ce dernier sur le compteur, en face du demi disque, avec un adhésif bien costaud (le résultat fait un peu bidouille peu être, l’idée c’est qu’il tienne bien et je suis sûr que certains feront bien mieux :).

Après quelques tests on trouve la distance adéquate (1 à 2cm) pour que la lumière soit réfléchie par le disque et pas par le fond.

Pour effectuer ces tests et trouver la bonne position du capteur, voici un stetch tout simple qui permet d’allumer la LED de la pin 13 de l’arduino lorsque le CNY70 détecte un objet :

#define LED 13
#define IN 3

volatile uint8_t state = LOW;

void cny70_onRising(void) 
{
    // bascule l'état de la led
    state = !state;

    Serial.print(state);
    Serial.println(" detected");
}

void setup () 
{
    Serial.begin(9600);
    Serial.println("CNY70 test");

    pinMode(IN, INPUT);
    pinMode(LED, OUTPUT);

    // Attache une interruption sur changement de valeur (pin 3)
    attachInterrupt(1, cny70_onRising, CHANGE);
}

void loop () 
{
  digitalWrite(LED, state);
}

Une fois la bonne configuration trouvée, vous pouvez fixer le CNY70 sur le compteur et vous aurez un retour à chaque ½ litre consommé (½ litre à chaque changement de valeur).

Ajoutons un peu d’xPL sur tout ça pour remonter les informations au serveur domotique

Il nous reste maintenant à propager l’information sur le réseau. Comme d’habitude, j’utilise le protocole xPL pour intégrer mon nouveau capteur à mon réseau domotique. Et je fais un peu de promo pour la librairie xPL.Arduino au passage 😉 voici le sketch final :

#include <xPL.h>
#include <EtherCard.h>

#define IN 3

volatile uint8_t state = LOW;

byte Ethernet::buffer[XPL_MESSAGE_BUFFER_MAX];
xPL xpl;

// Init du serveur HTTP
uint8_t mymac[6] = { 0x54,0x55,0x58,0x10,0x00,0x11 };
uint8_t myip[4] = { 192,168,1,136 };
uint8_t gwip[4] = { 192,168,1,1};

// Ethercard seems to only send broadcast on this addr
// if using xpl-perl, don't forget to add "--define broadcast=0.0.0.0" to the xpl-hub
uint8_t broadcast[4] = { 255,255,255,255};

void SendUdPMessage(char *buffer)
{
    ether.sendUdp (buffer, strlen(buffer), xpl.udp_port, broadcast, xpl.udp_port);
}

void cny70_onRising(void) 
{
    // bascule l'état de la led
    state = !state;

    // Un message xPL est remonté à chaque front montant (un litre)
    // On peut supprimer la condition pour envoyer un message tous les 1/2 litre
    if(state)
    {
      xPL_Message msg;

      msg.hop = 1;
      msg.type = XPL_TRIG;

      msg.SetTarget_P(PSTR("*"));
      msg.SetSchema_P(PSTR("sensor"), PSTR("basic"));

      msg.AddCommand_P(PSTR("device"),PSTR("Eau"));
      msg.AddCommand_P(PSTR("type"),PSTR("output"));
      msg.AddCommand_P(PSTR("current"),PSTR("HIGH"));

      xpl.SendMessage(&msg);
    }

    Serial.print(state);
    Serial.println(" detected");
}

void setup () 
{
    Serial.begin(9600);
    Serial.println("CNY70 test");

    // decommenter pour un mega et commenter la ligne en dessous
    // ether.begin(sizeof Ethernet::buffer, mymac);
    ether.begin(sizeof Ethernet::buffer, mymac, 10);

    ether.staticSetup(myip, gwip);

    xpl.SendExternal = &SendUdPMessage;  // pointer to the send callback
    xpl.SetSource_P(PSTR("xpl"), PSTR("arduino"), PSTR("CNY70Test")); // parameters for hearbeat message

    pinMode(IN, INPUT);

    // Attache une interruption sur changement de valeur (pin 3)
    attachInterrupt(1, cny70_onRising, CHANGE);
}

void loop () 
{
}

Précision / Fiabilité

Concernant la précision du système, Je l’ai utilisé sur un an et la précision était vraiment bonne. Sur les les 14000 premiers litres (env deux mois) j’ai eu un écart de 4 litres soit moins de 0.1% d’erreur.

Relever sa consommation d’eau chaude, l’astuce à 2 balle

Histoire de gagner 10€ et se dire qu’on est super malin …, pour la consommation d’eau chaude, plutôt que d’acheter un compteur pour eau chaude souvent plus cher, vous pouvez prendre un compteur d’eau froide et le placer à l’entrée du ballon d’eau chaude. Tout ce qui sort du ballon sera forcement entré en passant par le compteur, voila ça c’est fait 🙂

[adsGrandRectangleHTexte]

Conclusion

Le sketch est assez simple, il remonte sur le réseau en xPL chaque litre consommé, charge à vous d’en faire ce que vous voulez. Pour ma part, mon serveur log chaque litre en base, ensuite j’ai des scripts qui génère des graphs et agrège les données par heure/jour/mois pour limiter la taille en base.

On pourrait aussi ne pas envoyer un message à chaque litre mais stoker le total sur l’arduino et envoyer un rapport une fois pas jour par exemple ou à la demande. Pour plus de souplesse et facilité de maintenance, je préfère garder sur les arduino une logique très simple et centraliser l’intelligence.

Le prochain article parlera du relevé de la consommation électrique sur un vieux compteur à roue (et oui malheureusement ça existe encore) sans pince ampèremétrique mais basé sur ce même montage. Si vous voyez des améliorations ou d’autres montages possibles avec ce type de capteurs, n’hésitez pas à les partager!

Vous aimerez aussi...

31 réponses

  1. meunier dit :

    Salut et bonne année.

    Bonne idée tout ça.
    Autre, un compteur froid general et un compteur que le froid et le chaud par différence.

    Pour le comteur électrique, j ai l idée irréalisé de mettre ume webcam devant et de faire un reconnaissance d image.

    A+

    • Olivier dit :

      Salut, Il y a quelques années j’ai pris quelques photo de mon vieux compteur électrique pour tester la reconnaissance aussi mais je n’ai pas réussi à l’époque à obtenir qqchose de très fiable :/ Peut être que ça à évolué depuis ? Autre problème, tu sera limité au kwh.

      Dans le même ordre d’idée, pendant un moment j’utilisais une webcam installée en face de ma jauge de fioul pour vérifier le niveau. J’avais essayé de réaliser un petit programme pour trouver la position de l’aiguille et en déduire la contenance de la cuve mais pareil c’était hasardeux 😉

  2. fraborak dit :

    On peut , peut etre, voir le disque tourner
    Apres on aussi faire une derivé pour avoir une conso
    Instantannée
    Mais la precision risque en effet d etre pourrie.

  3. Julien dit :

    Bonjour,
    Je trouve ça très intéressant et souhaiterai me mettre à la bidouille…
    Cependant, je me heurte à un premier obstacle : le prix…
    En effet, je ne trouve pas de compteurs à ces prix là (20 – 30 euros). Au moins cher je suis plutôt à 45 euros…
    Y a t-il des bons plans que je ne connais pas ? (j’ai cherché sur différents sites).
    Merci,
    julien

    • Olivier dit :

      Bonjour,
      J’avais acheté le itron chez leroy merlin à ~20€ (il y a deux ans). Je vais essayer d’aller voir sur place s’ils ont toujours le même modèle ou équivalent.
      Le Sappel lui était bien autour des 40€, je l’avais pris au cas où le montage ne fonctionne pas bien car on peut lui ajouter un capteur (mais super cher :/)

      • Julien dit :

        Merci pour ta réponse et désolé d’avoir mis autant de temps à réagir…
        Après un stand-by de mon projet, je viens de me procurer un compteur Sappel et une carte arduino. Du coup le système que tu défini fonctionne en lisant des impulsions… saurais-tu si les liaisons M-bus standard pourraient être lues de la même façon ?

  4. Mennesson dit :

    Bjr,

    Je suis tres interesse mais je n arrive pas a trouver le compteur idron. Quel est le modele itron svp ? Sinon quelles sont les caracteristiques du disque reflechissant (noir puis blanc ?).

    Merci pour votre reponse.

    • Olivier dit :

      Bonsoir,
      Pour le modèle je ne pourrai malheureusement pas vous répondre.
      J’ai depuis, vendu la maison dans laquelle je l’avais installé.
      Le disque est un demi disque couleur argenté sur fond noir. Mais ça fonctionnerai aussi bien avec un blanc sur fond noir, il suffit que le contraste entre les deux couleurs soit important.

  5. Jacques URBAIN dit :

    Bonjour,

    J’imagine les problèmes de détection résolus, néanmoins voici ma suggestion.
    Histoire d’avoir une bascule nette du CNY70 dans son bout de tube j’occulterais la moitié du disque vu en manière telle que CNY70 serait dans l’obscurité / verrait un demi disque blanc. Pour peu qu’il y ait du débit …

  6. Jerome dit :

    Bonjour,
    Il existe des solutions bien moins couteuses, et surtout plus précises. En effet, je n’ai jamais trouvé élégant de combiner un compteur mécanique couteux avec un système de lecture optique … alors qu’il existe des capteurs faits pour ça !
    Tapez « water flow meter » dans ebay, ou sur dealextreme (dx.com), et vous trouverez des capteurs qui font le boulot pour bien moins cher. Exemple chez dx.com, pour moins de 6 euros frais de port compris vous avez ça:
    http://dx.com/p/yf-s203-1-2-water-heater-flow-transducer-meter-black-222043
    Ce capteur donne une impultion à chaque rotation de sa roue. Les capteurs que j’utilise ont une précision de l’ordre du millilitre (vous me direz qu’autant de précision est inutile, et vous aurez raison 🙂
    J’utilise ce capteur pour mesurer ma consommation en eau de mes toilettes, ça m’a permis de voir qu’utiliser l’eau des cuves était rentabilisable en deux ans (malgrès le cout des tuyaux, raccords, pompe, …).
    Le capteur est directement relié à l’arduino (on peut difficilement faire plus simple …), et l’arduino à un raspberry pi qui logge tout ça et exporte les valeurs en SNMP. Pour ce qui est de l’arduino, la mesure se fait lorsque une impulsion déclenche une interruption: ça augmente un compteur. Toutes les 4 heures (environ), si la consommation a varié, l’arduino sauvegarde le compteur dans son eeprom (ce qui permet au système de fonctionner une petite décénie avant que l’eeprom ne soit fatiguée): ainsi en cas de débranchement du montage, le compteur revient à sa valeur précédente.

    • Marbaf dit :

      Bonjour,

      Très intéressant ce montage. Le raspberry n’est pas en mesure d’assurer le comptage des impulsions seul ?
      Merci pour le tuyau.

  7. jean dit :

    Bonjour, j’aurai besoin d’aide pour suivre ma consommation d’eau grâce à un pulsar de la société sappel et un Raspberry. Merci pour toute aide, cdl

  8. jean dit :

    personne ?

  9. Jean-Pierre dit :

    A l’école, j’ai appris à lire et à compter. Pas vous ? Pour suuivre ma consommation, je me baisse et regarde les chiffres du compteur. Pourquoi se compliquer la vie et dépênser dans de l’électronique et des radiofréquences qui vous polluent l’environnement et tomberont en panne ? Mon arrosage intégré est géré par une mijnuterie hebdfomadaire. Le progrès n’en est un que s’il est positif pour l’homme.

    • Doublehp dit :

      Parce que j’ai autre chose à faire dans ma vie, que d’aller vérifier mon compteur d’eau matin et soir, en soulevant la plaque de rue, retirer l’isolant qui s’use un peu à chaque manipulation, et qu’après 3 mois de 2 revelés par jour, le machin est mort, et laisse passer le gel.

      Un relevé avec un rPi coute 2W, soit 2e par an; rPi capable de gérér simultanément mon relevé EDF. Avec un vrai câble de bonne qualité, il n’y a aucun rayonnement radio.

      Avec un relevé automatique, je sais quand j’ai une fuite; je sais si mon groupe de sécu est mort. Je sais quand mon vase d’expansion a un soucis. Je sais qui a pris une douche plus longue que d’habitude. Je sais quand j’ai une fuite sur un robinet du jardin. Je sais quand on mon déosmoseur est défectueux. Et je sais tout ça par SMS dans les 12h. Et sans passer 1h par jour à aller inspecter chaque robinet, vanne, et raccord de ma maison (j’en ai une centaine; et faut ouvrir plus de 15 trappes pour accéder à tout).

  10. Jean-Pierre dit :

    En plus, ces capteurs, ça consomme du courant et me fait penser aux fous du smartphone qui consomment autant qu’un congélateur..

    • Olivier dit :

      Bonjour Jean-Pierre,
      Le but d’un suivi automatisé de consommation, que ce soit l’eau, l’électricité, etc est de te permettre d’analyser tes consommations, pourquoi pas les comparer avec des foyers comparables, comprendre pourquoi tu consomme plus que l’année passée, réaliser des économies d’argent bien sûr, mais aussi d’énergie, consommer raisonnablement, devenir responsable, etc.

      Arroser son jardin via une minuterie automatique sans prendre en compte les facteurs extérieurs (vient-il de pleuvoir, va il pleuvoir dans la journée) est un non sens, arroser sa pelouse tout court l’est déjà … mais chacun voit midi à sa porte.

  11. REINAUDO dit :

    Comme Jean Pierre je mets à profits mes facultés de lecture pour suivre ma consommation d’eau sur mon compteur général d’arrivée d’eau tous les dix jours.
    je fais cela non pas pour connaître ma consommation (si mes plantes crèvent je dois bien les arroser!) et économiser quelques euros mais pour vérifier si je n’ai pas une fuite dans mon jardin (que je ne peux pas détecter autrement) et ainsi économiser beaucoup d’euros.
    J’ai eu l’idée, il y déjà longtemps, de créer un petit appareil qui suivrait la consommation en temps réel et qui à partir d’une consommation journalière donnée (qui serait paramétrable suivant les saisons (ou les périodes : absence par exemple)) fermerait un robinet si cette consommation était supérieure à celle maximum prévue par le paramétrage. De ce fait si une fuite survenait je n’aurais qu’un jour de fuite à payer.
    Je pourrai donc vérifier mon installation, faire des essais en fermant diverses vannes disposées sur mon circuit d’eau pour déterminer l’endroit de la fuite, faire intervenir un spécialiste en recherche de fuite etc…
    Je ne parle pas de l’envoie de l’information sur smartphone, ordinateur et autre.
    Conclusion: Je ne maîtrise pas la domotique mais comme la consommation d’eau par fuite est paraît -il très importante, je fais jouer ma fibre écolo et passe l’idée à qui voudra bien la développer.

  12. Jeremie Kaufmann dit :

    Bonjour, le raspberry pi n’est il pas capable de traiter lui-même les informations en provenance du capteur, si l’on se branche sur les broches gpio ? Doit-on obligatoirement passer par un arduino ?

  13. Doublehp dit :

    « pour la consommation d’eau chaude, plutôt que d’acheter un compteur pour eau chaude souvent plus cher, vous pouvez prendre un compteur d’eau froide et le placer à l’entrée du ballon d’eau chaude. Tout ce qui sort du ballon sera forcement entré en passant par le compteur, voila ça c’est fait  »

    N’ayant pas envie de mourir, j’ai installé un groupe de sécu sur mon CE; et un vase; et deux compteurs: un en entrée, un en sortie; et le différentiel m’indique l’état de santé de mon groupe et de mon vase. Le différentiel m’indique un défaut du groupe.

    Après, si tu es suicidaire, c’est ton droit d’avoir un CE sans groupe de sécu.

    Mais avoir un groupe de sécu, et présumer que ta conso d’eau chaude est égale à la conso d’eau froide … c’est d’une absurdité sans nom.

    • Olivier dit :

      Bien sûr que mon ballon est équipé d’un groupe sécurité. Je l’ai d’ailleurs changé il y a quelques mois.
      L’eau froide passe par le groupe sécurité qui est chargé de réduire la pression dans le ballon entre autre. Oui il y a de la « perte » (jusqu’à 3% si on en croit wikipedia) mais cette eau à bien été utilisée pour ta production d’eau chaude, même si elle n’a pas servie à prendre ta douche.

      Si tu veux un calcul plus précis tu peux prendre en compte cette perte théorique de 3% ou effectivement installer une usine à gaz … perso je préfère avoir une bonne idée de ma consommation à 3% prêt. Savoir que j’ai pris une douche de 63 ou 65 litre m’importe peu, c’est l’ordre de grandeur qui est important mais chacun son dada.

      La prochaine fois n’hésite pas à expliquer ton point de vue de manière constructive …

  14. SEB dit :

    Salut et félicitation pour ce tuto c’est vraiment génial mais j’aurai quelque question comment tu fais pour retrouver tes infos sur le réseau tu ajoute une puce wifi, entre la sonde et l’arduino et as-tu fais ton tuto pour ton compteur EDF avec roue cranté ?

  15. Olivier dit :

    Salut SEB,
    L’arduino est équipé d’un shield ethernet et communique les consommations d’eau en XPL.
    Non je n’ai pas terminé mes essais sur le compteur à roue car j’ai changé de compteur entre temps et déménagé (plusieurs fois) depuis. Dans ma nouvelle maison j’ai installé un compteur électronique « LANDIS+GYR » (acheté sur ebay) que j’ai branché entre le compteur à roue d’EDF et le tableau élec pour profiter de la téléinfo. C’est tout de même plus précis et rapide à mettre en oeuvre.

  16. Breizh13 dit :

    Bonjour,
    page techniquement intéressante. J’ai relevé une erreur d’arithmetique. Vous dites avoir relevé un écart de 4 litres sur 14000 litres, cela fait 0.0285% et non pas .01% !!

  17. jc dit :

    bonjour,

    Je suis étonné que vous n’ayiez pas rencontré le problème classique suivant : quand ll’aiguille reste devant l’aimant .. et bien le contact est fait .. on a beau mettre un filtre (résistance&capa) cela compte des impulsions fausses ..
    pour ma part j’ai rencontré ce cas beaucoup plus souvent sur 1 année .. de sorte que cela ne serve pas à grand chose de domotiser ainsi un compteur : voir une consommation sur un an, cela consiste à relever son compteur .. par contre voir une fuite la c’est intéressant .. or cette solution est totalement inoppérante dans ce cas

    • Olivier dit :

      Bonjour,
      Vous parlez d’un aimant mais si vous relisez l’article il s’agit d’un capteur optique. Si le demi-disque s’arrête en face du capteur le signal est à 1 et reste à 1.
      J’ai utilisé ce système plusieurs mois et comparé avec le relevé manuel sans écart significatif.

  18. meufeu dit :

    fiable non .. avec un seul capteur on ne peut pas distinguer le bruit d’une fuite ..
    et on génère des impulsions infinies si l’aiguille a le malheur de s’arrêter devant le capteur ..
    donc pas cher oui .. intéressant oui .. mais fiable non

Répondre à meufeu Annuler la réponse

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