SucheFür Unternehmer
ThemaStart · Forum

Wasserzählersensor selbstgebaut (Prototyp)

23Antworten8’152Aufrufevon fendant · 14. Juli 2015letzter Beitrag vor 11 Jahren
  1. fendant289 Beiträge14. Juli 2015
    Ausgangslage:
     - ein analoger Wasserzähler ohne eine elektronische Schnittstelle
     - den offiziellen Wasserzähler darf man kaum auswechseln
     - Platz für einen zusätzlichen Wasserzähler eher nicht vorhanden
     - Wasserzähler mit elektronischem Interface sind teuer
     - Sanitär oder Know How nötig
     
    Motivation:
     - den Wasserverbrauch in meine Automatisierung mit einbeziehen, da:
        1) Warnung, wenn bei Abwesenheit Wasser verbraucht wird (kann mehrere Ursachen haben)
        2) Basis für die Automatisierung der Gartenbewässerung (Mengensteuerung und Absicherung)
        3) Interesse an Wasserverbrauchs-Statistiken
        
    Umsetzung:
    Zuerst dachte ich an eine Webcam mit Bilderkennungsalgorithmen. Das habe ich aber verworfen, da komplex und umständlich.
    Ich erkannte, dass der Literzähler des analogen Wasserzählers einen reflektierenden Halbkreis hat. Dies brachte mich auf die Idee, anhand der Refelektion die Wassermenge zu messen. Also nahm ich ein LED, ein Fotowiderstand und Widerstände für die Spannungsteilung. Diesen Protoypen von Sensor schloss ich an mein Arduino Board an (ein analoger Eingang ist nötig). Das Arduino Board habe ich mit dem MQTT Protokoll an meine openHAB Automatisierung angebunden, et voila...

    Resultat:
     - ein bis jetzt einwandfreier funktionierender Sensor, auf den halben Liter genau
     - aufgrund des Zeitmangels vor den Ferien, eine noch optisch unschöne Installation
     
    Zukunft:
     - Sensor in ein Gehäuse montieren
     - Sensor schöner auf den Wasserzähler montieren
     - Kabel in einem Kabelkanal montieren
     
    Jenach Interesse und Feedback, kann ich über mehr Details schreiben, bzw. Fragen beantworten.

    Grüsse

    Fendant

     

    01 (Small).jpg

    02 (Small).jpg

    03 (Small).jpg

    04.png

    05.png

    3× hilfreich
  2. habaUgeot1’199 Beiträge14. Juli 2015
    Lieber Fendant

    Soooooo ... ähm... geeeeeil. Warum habe ich nicht die Zeit zum Basteln???

    Wieviele Probleme (Falsche Scheibendurchgänge) hast Du, wenn die Scheibe ca. unter dem Sensor stehen bleibt? Oder fängst Du das ab mit einem Maximalwert?

    Haba

  3. fendant289 Beiträge14. Juli 2015
    Hallo Haba,

    Hatte bis jetzt keine falsche Scheibendurchgänge, da es mit einer Hysterese sehr gut klappt. Nach dem AD Wandler erhalte ich Werte zwischen 460, wenn die Scheibe nicht drunter ist und 560, wenn die Scheibe drunter ist und voll reflektiert. Wenn die Scheibe mitten drin stehen bleibt, wird der Wert irgendwo mittendrin sein. Ich zähle den halben Liter aber erst, wenn der Wert unter 480 oder über 540 geht. Am einfachsten ein Auschnitt aus dem Programm:

    int sensorValue = 0;
    int minValChange = 480;
    int maxValChange = 540;
    bool isMin = false;
    float liter = 0;

    ...

    void loop()
    {
      ...
     
      sensorValue = analogRead(analogInPin);

      if (isMin)
      {
        if (sensorValue >= maxValChange)
        {
          isMin = false;
          liter += 0.5;
          ...
        }
      }
      else
      {
        if (sensorValue <= minValChange)
        {
          isMin = true;
          liter += 0.5;
          ...
        }
      }
      ...
    }
    Ich liess den Wasserhahn mal tropfen und verfolgte die Sensorwerte. Sie fluktuierten nicht annähernd so fest, dass es mit der gewählten Hysterese ein Problem gibt. Ich habe den genauen Wert des Wasserzählers mal notiert und werde dies später mal mit meinem gemessenen Wert vergleichen.

    Grüsse

  4. isitom2’343 Beiträge14. Juli 2015
    Schönes Projekt!

    Unser Zähler hat eine solche Scheibe leider nicht.

    Aber mal ne andere Frage: Dein Zähler hat doch einen S0-Impulsausgang. Hättest du nicht einfach diesen nehmen können?

    Gruss,

    Thomas

  5. fendant289 Beiträge14. Juli 2015 · bearbeitet
    Schönes Projekt!

    Unser Zähler hat eine solche Scheibe leider nicht.

    Aber mal ne andere Frage: Dein Zähler hat doch einen S0-Impulsausgang. Hättest du nicht einfach diesen nehmen können?

    Gruss,

    Thomas
    Hallo Thomas,

    Wo siehst Du einen S0 Ausgang? Ich bin gerade in den Ferien und kann so leider nicht zum Wasserzähler *g* Falls das wahr ist, werde ich einen Lachkrampf kriegen /emoticons/default_smile.png 🙂 Klar, hätte ich dann die S0 Schnittstelle genommen🙂

    Grüsse

  6. isitom2’343 Beiträge14. Juli 2015
    War nur ne Vermutung. Da müsste ich freie Sicht auf den Zähler haben. Wusste auch lange nicht, dass bei unserem der S0-Ausgang enthalten ist. Leider ist dieser schon vom EW belegt.

    Gruss,

    Thomas

  7. fendant289 Beiträge14. Juli 2015
    War nur ne Vermutung. Da müsste ich freie Sicht auf den Zähler haben. Wusste auch lange nicht, dass bei unserem der S0-Ausgang enthalten ist. Leider ist dieser schon vom EW belegt.

    Gruss,

    Thomas
    Wenn der nicht winzig klein versteckt ist, hätte ich ihn fast sehen müssen... Ein Kabel war zumindest auch nicht angeschlossen. Ich schau nach den Ferien nochmals nach.

    Wir bekommen ein E-Mail in dem wir ein Foto des Wasserzähler zurück senden sollen. So funktioniert bei uns das Wasserablesen /emoticons/default_smile.png Keine S0 oder Funklösung.

    Grüsse

  8. fendant289 Beiträge14. Juli 2015
    Leider ist dieser schon vom EW belegt.

    Gruss,

    Thomas
    Ist der Anschluss irgendwie versiegelt? Sonst könnte man sich doch sicher parallel auch an den S0 Ausgang hängen?

  9. isitom2’343 Beiträge14. Juli 2015
    Nein, versiegelt ist dieser nicht. So wie es jedoch ausschaut darf man da nicht einfach zwei Auswerteeinheiten anschliessen da nicht Spannungslos.

  10. fendant289 Beiträge14. Juli 2015
    Ja, gut möglich, dass die das merken, wenn man das Kabel für eine gewisse Zeit entfernt. Möglich könnte es evt. trotzdem sein, habe aber keine Erfahrung...

  11. isitom2’343 Beiträge15. Juli 2015 · bearbeitet
    Kurzzeitig abhängig ist überhaupt kein Problem. Wenn kein Wasser läuft gibts auch keine Impulse.

  12. isitom2’343 Beiträge15. Juli 2015
    Welchen Arduino hast du? Genügt da der uno?

    Du hast meinen Basteltrieb geweckt. Ich denke darüber nach einen S0-Verdoppler zu bauen (Schaltplan habe ich schon, siehe Bild). Dann so wie du den S0-Ausgang mit dem Arduino mittels MQTT an OpenHab leiten und darstellen. Denke da könnte ich sogar 99% deines Codes verwenden.

    Gruss,

    Thomas

    ImageUploadedByHaus-Forum.ch1436941230.801224.jpg

  13. fendant289 Beiträge15. Juli 2015
    Ja, Uno reicht. Hab noch ein Ethernet Shield drauf. Sonst kannst du sicher auch über ein Serial Binding gehen. Bin gerade am Wandern, aber am Abend kann ich sonst gerne ein paar Details mehr posten

  14. fendant289 Beiträge15. Juli 2015
    Hallo Thomas,

    Hier mal noch der komplette Adruino Quellecode. EIgentlich müsste ich nicht mal einen Literwert senden, da openHab die Persistenz und das Hochzählen im Griff haben sollte. Zum Vergleichen, schicke ich trotzdem den Wert, der jedoch bei einem Reboot des Arduino Boards wieder bei 0 anfängt.

    Bei Bedarf kann ich auch die openHab Rules oder das Binding posten. Das Arduino Board publiziert zum Mosquitto MQTT Broker und openHab abonniert es dort.

    Viel Spass und Erfolg

    Grüsse

    #include <Wire.h>
    #include <SPI.h>
    #include <Ethernet.h>
    #include <PubSubClient.h>
    #include <string.h>
    
    byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
    byte server[] = { 10, 10, 1, 83 };
    byte ip[]     = { 10, 10, 1, 234 };
    
    const int analogInPin = A0;
    
    int sensorValue = 0;
    int minValChange = 480;
    int maxValChange = 540;
    bool isMin = false;
    float liter = 0;
    
    EthernetClient ethClient;
    PubSubClient client(server, 1883, callback, ethClient);
    char convertString[30];
    bool success;
    
    void callback(char* topic, byte* payload, unsigned int length) {
      // handle message arrived
    }
    
    void setup()
    {
      Serial.begin(9600);
      Serial.println("REBOOT");
      Ethernet.begin(mac, ip);
      client.connect("arduinoClient");
    }
    
    void IncrementAndPublishHalfLiter()
    {
      liter += 0.5;
      Serial.print("Liter: ");
      Serial.println(liter,0.5);
      dtostrf(liter,2,4,convertString);
      client.publish("Arduino/Wasser/Total", convertString);
    }
    
    void loop() {
    
      success = client.loop();
      if (!success)
      {
        Serial.println("loop() -> not connected anymore!");
        client.connect("arduinoClient");
      }
     
      // read the analog in value:
      sensorValue = analogRead(analogInPin);
    
      if (isMin)
      {
        if (sensorValue >= maxValChange)
        {
          isMin = false;
          IncrementAndPublishHalfLiter();
        }
      }
      else
      {
        if (sensorValue <= minValChange)
        {
          isMin = true;
          IncrementAndPublishHalfLiter();
        }
      }
     
      // print the results to the serial monitor:
      Serial.print("sensor = " );
      Serial.println(sensorValue);
    
      delay(100);
    }
  15. isitom2’343 Beiträge16. Juli 2015
    Danke dir!

    Hab noch nie was mit Arduino gemacht. Aber mich packt gerade das Bastelfieber.

    Hab da mal was rausgesucht:

    - https://www.amazon.de/gp/product/B00OEIMCIW/ref=ox_sc_act_title_3?ie=UTF8&psc=1&smid=A387VM0PZ17YV7

    - https://www.amazon.de/gp/product/B009N826DY/ref=ox_sc_act_title_5?ie=UTF8&psc=1&smid=A1P3HNFSEHPC4K

    Wird das funktionieren?

    Was haste für eine Speisung für den Arduino genommen?

    Wie kann ich deinen Code so abändern, dass er auf Impulse an einem Eingang reagiert?

    Gruss,

    Thomas

  16. fendant289 Beiträge16. Juli 2015
    Sind die richtigen Komponenten, aber der eine liefert nicht in die Schweiz. Ich habs von hier:

    http://www.ebay.ch/itm/Uno-R3-Ethernet-Shield-w5100-mit-Kable-fur-Arduino-AR01005-/271536226267?pt=LH_DefaultDomain_77&hash=item3f38d1ffdb

    Ohne jetzt die S0 Schnittstelle gut zu kennen, denke ich, dass für Dich ein digitaler Input reichen sollte. Solltest Du also schon einen Raspberry Pi haben, könntest Du es auch damit machen.

    Vom Vorgehen her denke ich, Du musst einfach genug schnell abtasten, damit du den Impuls sicher erwischt, die Wassermenge hochzählen und anschliessend warten, bis der Pegel wieder 0 ist usw.

    Die Arduino Boards sind recht einfach. Hatte meins erst ein paar Tage und pröbelte nur ein paar wenige Stunden damit herum. Es gibt auch viele Beispiele. Vielleicht komme ich später mal dazu, mein Programm umzuschreiben.

    Aktuell habe ich das Arduino Board einfach an der USB Schnittstelle meines Servers. Ich brauche aktuell aber auch nur die 3.3V Speisung, die genug stabil ist. Die 5V sollen an USB Ports nicht konstant sein und man hat nur ca. 4.7V statt 5V. Später will ich mein Arduino Board sauber in ein Wandschaltschrank montieren. Ich habe dazu noch ein altes 12V Netzteil gefunden. Optimaler sollen aber 9V Netzteile sein.
     

    Grüsse

  17. isitom2’343 Beiträge16. Juli 2015
    Ich werde mal so ein Bastelkit bestellen und mich einlesen.

    Die S0-Pulsauswertung werde ich über einen Interrupt realisieren. Da gibts auch schon Beispiele.

    Gruss,

    Thomas

  18. fendant289 Beiträge23. Juli 2015
    Ja, per Interrupt ist es noch eleganter. Ist das Bastelkit schon angekommen?

    Viel Spass und Erfolg!

  19. isitom2’343 Beiträge23. Juli 2015 · bearbeitet
    Nein, am Samstag hole ich es ab.

    Habe den Arduino Uno + Ethernet Shield und ein Arduino Projektkit bestellt.

    Und dann natürlich noch ein paar Teile für den S0-Verdoppler und Stromversorgung für Arduino.

  20. isitom2’343 Beiträge25. Juli 2015 · bearbeitet
    Schön doof...Arduino Board Software und S0-Verdoppler-Prototyp funktionieren einwandfrei.

    Und jetzt darf ich herausfinden, dass unser Wasserzähler gar kein S0 Ausgang sondern entweder einen M-Bus oder SCR(IEC) hat.

    Bei uns ist ein Wasserzähler von GWF mit integrierter Schnittstelle installiert. Diese liefert die Daten absolut.

    http://www.gwf.ch/versorgung/wasser/hauswasserzaehler/hauswasserzaehler/mtkcoderr-mp-wasserzaehler.html