Forum: Projekte & Code Sensus Wasserzähler


von Rolf W. (sp0ngeb0b)


Angehängte Dateien:

Lesenswert?

Hallo Liebes Forum,

mein Name ist Rolf und ich bin 33 Jahre alt und habe 3 und nächstes Jahr 
im April 4 Kinder. Ich arbeite bei einem Wasserversorger auf kommunaler 
Ebene als Monteur. Meine Ausbildung zum Installateur ist dabei sehr 
hilfreich, doch hat mich die Welt der Elektronik schon immer begeistert. 
Bei einigen Fragen konnten mir Anregungen aus diesem Forum weiterhelfen 
auch wenn ich nur an der Oberfläche kratze. Dafür ein Dankeschön an 
dieser Stelle. Vor etwa einem Jahr kam ich zufällig auf die Arduino 
Platform. Ich finde sie gerade zum begreifen der Zusammenhänge sehr 
hilfreich. Nun habe ich eine Elektronik zusammengestellt um einen Sensus 
Wasserzähler digital auslesen zu können, diese Teile gibt es zwar auch 
zu kaufen aber wo bleibt da die Herausforderung. Ich möchte die 
Vorstellung meines Projekts hier dafür nutzen Kritik als Denkanstoß zu 
bekommen.

Auf dem Zähler befindet sich ein Halbmond aus Metall dieser kann mit 
einem Induktivem Sensor erfasst werden.

Dazu habe ich auch folgenden Code:

Für die (while) Schleifen habe ich mich entschieden weil ich mit dem 
Interrupt leider weniger Erfolg hatte. Dieser hat zwar reagiert aber es 
kam zu Fehlmessungen. Ich denke ich habe ihn falsch entprellt.

Generell steht die Erfassung immer im Vordergrund. Das Display lasse ich 
abschalten um Energie zu sparen. Durch einen Knopfdruck zeigt das 
Display den Aktuellen Stand an. Dies tut es für einen Moment oder bis 
ein neuer Impuls kommt. Alternativ kann man den Taster gedrückt halten 
dann bleibt das Display an flackert aber kurz. Um einen stand zu 
notieren wäre das vertretbar.
1
#include <Adafruit_SleepyDog.h>
2
#include <LiquidCrystal_I2C.h>
3
                                                                      
4
LiquidCrystal_I2C lcd(0x27,16,2);
5
6
byte drei[] = {B11100,B00100,B01100,B00100,B11100,B00000,B00000,B00000}; 
7
8
float Count=0;
9
10
int Counter = 2;
11
int Button = 3;
12
13
void setup()  {
14
  lcd.init();
15
  lcd.createChar (1, drei);
16
  lcd.backlight();
17
  lcd.setCursor(0,0);
18
  lcd.print("Display -- OK");
19
  delay(2000);
20
  lcd.clear();
21
  lcd.noBacklight();
22
  pinMode(Counter, INPUT);
23
  pinMode(Button, INPUT);
24
  Serial.begin(9600);
25
}
26
27
void loop() {
28
  while(digitalRead(Counter)==LOW)  {
29
    if(digitalRead(Button)==HIGH) {
30
      for(int i=0;i<150;i++){
31
        if(digitalRead(Counter)==HIGH)  {
32
          break;
33
          }
34
        setDisplay();
35
        lcd.print(i);
36
        Watchdog.sleep(10);
37
      }
38
      lcd.clear();
39
      lcd.noBacklight();
40
    }else{
41
      Watchdog.sleep(10);
42
    }
43
  }
44
  while(digitalRead(Counter)==HIGH  ){
45
    if(digitalRead(Button)==HIGH) {
46
      for(int i=0;i<150;i++)  {
47
        if(digitalRead(Counter)==LOW) {
48
          break;
49
        }
50
        setDisplay();
51
        lcd.print(i);
52
        Watchdog.sleep(10);
53
      }
54
      lcd.clear();
55
      lcd.noBacklight();
56
    }else{
57
      Watchdog.sleep(10);
58
    }
59
  }
60
  Count++;
61
  lcd.clear();
62
  lcd.noBacklight();
63
}
64
65
void setDisplay() {
66
  lcd.setCursor(0,1);
67
  lcd.print ("Stand: ");
68
  lcd.print((Count/1000),3);
69
  lcd.print("m");
70
  lcd.write(1);
71
  lcd.setCursor(9,0);
72
  lcd.print("150/");
73
  lcd.setCursor(13,0);
74
  lcd.backlight();
75
}

Wie gesagt es ist nichts großes aber ich würde mich über Denkanstöße 
freuen.

Mit freundlichen Grüßen
Rolf

von Matthias L. (Gast)


Lesenswert?

Ohne jetzt jede Zeile analysiert zu haben, sehe ich den Fehler, das das 
Konzept des Programmes falsch angelegt ist.

Diese Aussagenn bestätigen das:
>Generell steht die Erfassung immer im Vordergrund
>bleibt das Display an flackert aber kurz

Von der Verwendung von Sleep würde komplett abraten.


Das Programm sollte zwei unabhöngige Teile haben:
- Messung
- DIsplayansteuerung.

Die Verbindung zwischen beiden wäre hier der Messwert.


Bevor ich weitere Tipps gebe, würde ich folgendes wissen wollen:
> Ich denke ich habe ihn falsch entprellt.
Einen Interrupt kann man nicht entprellen. Aber ein Signal. Hier wäre 
erstmal interessant, welche Frequenzen (max) hier zu erwarten ist. Ist 
diese relativ gering (so bis einige Hertz), so würde ich generell von 
Flankeninterrupts abraten und das im Timer machen (Details später)
>Auf dem Zähler befindet sich ein Halbmond aus Metall dieser kann mit
>einem Induktivem Sensor erfasst werden.

von Rolf W. (sp0ngeb0b)


Lesenswert?

Hallo Matthias,

Es handelt sich um einen Wasserzähler QN2,5 Das heißt es gehen 2500 - 
3000 l Wasser pro h maximal durch. Der Halbmond macht eine Umdrehung je 
l

(3000l / 60min)/60sec = 0,833/sec

Also denke ich man kann mit 1hz rechnen. Zumindest bei dieser Art von 
Zähler.

von Matthias L. (Gast)


Lesenswert?

Rolf W. schrieb:
> Also denke ich man kann mit 1hz rechnen. Zumindest bei dieser Art von
> Zähler.

Ok. Und was willst Du messen? Die Wassermenge? Also einfach die Impulse 
zählen und das als Liter anzeigen?

Ich würde das folgendermassen aufbauen, das Projekt:
1
void main(void)
2
{
3
  initialisations();
4
  //------------------------------
5
  while(1)
6
  {
7
    display();
8
  }
9
}

Beschreibung:
1
void display(void)
Hier wird eine Statemaschine programmiert, die auf einen Tastendruck 
wartet, die Displaybeleuchtung anschaltet und nach einer gewissen Zeit 
wieder deaktiviert. Und natürlich den Messwert anzeigt.
1
void initialisations(void)
Hier wird alles initialisiert. Wichtig (meine Empfehlung) wäre einen 
Timerinterrupt so anzulegen, das er alle eine Millisekunde aufgerufen 
wird. In diesem wird eine Zeitbasis generiert und zugleich der Sensor 
des Halbmondes abgefragt und entprellt(!). Je nachdem, ob das Display 
immer was anzeigen soll (ggf ohne Hintergrundbeleuchtung) kann das hier 
gleich mit initialisiert werden.

von Willy L. (sabberlotte)


Lesenswert?

Rolf W. schrieb:
> Dieser hat zwar reagiert aber es
> kam zu Fehlmessungen. Ich denke ich habe ihn falsch entprellt.

Ich habe die Erfahrung machen müssen, das diese Teile auch gern mal 
(nach dem Abdrehen des Hahn's) zurück drehen!

Ich habe dann einen 2. Sensor anbauen müssen.

von Rolf W. (sp0ngeb0b)


Lesenswert?

Hallo Willy

Das Rückschlagventil bei mir ist recht neu ich hoffe das dieses nicht 
passiert. Aber ich werde das testen. Es lief jetzt seit 3 Tagen und 
hatte keinen Nennenswerten Unterschied bzw man konnte keinen 
feststellen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.