Wasserzählersensor selbstgebaut (Prototyp)

fendant

Mitglied
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

 
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

 
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

 
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

 
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

 
Zuletzt bearbeitet von einem Moderator:
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

 
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

 
Nein, versiegelt ist dieser nicht. So wie es jedoch ausschaut darf man da nicht einfach zwei Auswerteeinheiten anschliessen da nicht Spannungslos.

 
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...

 
Kurzzeitig abhängig ist überhaupt kein Problem. Wenn kein Wasser läuft gibts auch keine Impulse.

 
Zuletzt bearbeitet von einem Moderator:
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

 
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

 
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

Code:
#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);
}
 
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

 
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

 
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

 
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.

 
Zuletzt bearbeitet von einem Moderator:
Zuletzt bearbeitet von einem Moderator:

Statistik des Forums

Themen
27.536
Beiträge
257.909
Mitglieder
31.816
Neuestes Mitglied
Ideu
Zurück
Oben Unten