mikrocontroller.net

Forum: Projekte & Code Sensus Wasserzähler


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Rolf W. (sp0ngeb0b)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.
#include <Adafruit_SleepyDog.h>
#include <LiquidCrystal_I2C.h>
                                                                      
LiquidCrystal_I2C lcd(0x27,16,2);

byte drei[] = {B11100,B00100,B01100,B00100,B11100,B00000,B00000,B00000}; 

float Count=0;

int Counter = 2;
int Button = 3;

void setup()  {
  lcd.init();
  lcd.createChar (1, drei);
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("Display -- OK");
  delay(2000);
  lcd.clear();
  lcd.noBacklight();
  pinMode(Counter, INPUT);
  pinMode(Button, INPUT);
  Serial.begin(9600);
}

void loop() {
  while(digitalRead(Counter)==LOW)  {
    if(digitalRead(Button)==HIGH) {
      for(int i=0;i<150;i++){
        if(digitalRead(Counter)==HIGH)  {
          break;
          }
        setDisplay();
        lcd.print(i);
        Watchdog.sleep(10);
      }
      lcd.clear();
      lcd.noBacklight();
    }else{
      Watchdog.sleep(10);
    }
  }
  while(digitalRead(Counter)==HIGH  ){
    if(digitalRead(Button)==HIGH) {
      for(int i=0;i<150;i++)  {
        if(digitalRead(Counter)==LOW) {
          break;
        }
        setDisplay();
        lcd.print(i);
        Watchdog.sleep(10);
      }
      lcd.clear();
      lcd.noBacklight();
    }else{
      Watchdog.sleep(10);
    }
  }
  Count++;
  lcd.clear();
  lcd.noBacklight();
}

void setDisplay() {
  lcd.setCursor(0,1);
  lcd.print ("Stand: ");
  lcd.print((Count/1000),3);
  lcd.print("m");
  lcd.write(1);
  lcd.setCursor(9,0);
  lcd.print("150/");
  lcd.setCursor(13,0);
  lcd.backlight();
}

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

Mit freundlichen Grüßen
Rolf

von Matthias L. (lippy)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (lippy)


Bewertung
0 lesenswert
nicht 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:
void main(void)
{
  initialisations();
  //------------------------------
  while(1)
  {
    display();
  }
}

Beschreibung:
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.
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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.