Arduino Flowmeter Wasseruhr

Mit einem Arduino oder einem anderen Mikrocontroller und einem Paddle Wheel kann man sehr leicht eine Durchflussmenge oder Durchflussgeschwindigkeit messen. Mit den verarbeiteten Sensordaten kann man dann eine einfache Wasseruhr bauen oder erweitert auch die Durchflussmenge einer Wasserpumpe regeln. In diesem Beitrag zeigen wir, wie ein Flowmeter mit dem Arduino funktioniert und wie es kalibriert wird.

Funktionsprinzip Paddle Wheel

Ein Paddle Wheel funktioniert grundsätzlich gleich wie ein Anemometer, jedoch wird es nicht durch Luft angetrieben, sondern eben durch Wasser. Im Sensor befindet sich eine kleine Turbine, die teilweise magnetisch ist. Ähnlich wie beim Fahrradcomputer befindet sich im Bauteil ein Hallsensor, der bei jeder Umdrehung einen Impuls abgibt. Bei unserem Sensor Modell befindet sich auch ein Pull-up Widerstand. Das bedeutet, dass genau dieser Sensor ohne weitere Bauteile direkt an den Arduino angeschlossen werden kann. Alternativ zum Paddle Wheel gibt Ultraschall-Flowmeter oder optische Flowmeter, die mit Lichtschranken arbeiten.

Arduino Flowmeter Serial Monitor Output

Interrupts zählen mit dem Arduino

Um die Durchflussmenge zu ermitteln, muss der Arduino die Impulse zählen, die vom Sensor bei jeder Umdrehung erzeugt werden. Damit das Hauptprogramm am Arduino nicht unnötig von der Messung blockiert wird, sollte man auf Interrupts ausweichen. Mit den Interrupts verliert der Arduino keine Impulse, wenn im Hauptprogramm gerade andere Aufgaben erledigt werden. Um aus den Interrupts einen sinnvollen Wert wie z. B. Liter pro Minute ermitteln zu können, muss bekannt sein, wie viele Impulse einen Liter entsprechen. Die Interrupts werden in unserem Beispiel über den I/O-Pin D2 eingelesen.

Sensor kalibrieren mit dem Arduino

Damit der Sensor zuverlässige Werte liefert, muss die Software am Arduino kalibriert werden. Um mit der Kalibrierung beginnen zu können, muss zuerst das Flowmeter und die Leitung voll mit Wasser sein und es sollten sich keine Luftblasen darin befinden. Anschließend füllt man einen Messbecher mit z. B. 500 ml und vergleicht die Ausgabe im Serial Monitor vom Arduino. Je nach dem ob zu viele oder zu wenige Milliliter angezeigt werden, muss der "cfactor" angepasst werden. Dazu kann man am Anfang vom Arduino-Code den "cfactor" modifizieren. Wenn der Wert bei 4.0 liegt und es um 50 ml zu wenig im Messbecher sind, so kann man den Wert z.B. auf 4.7 ändern. Mit dem Wert exprimiert man so lange herum, bis die Füllmenge im Messbecher mit der Menge am Arduino überein stimmt.

Arduino Flowmeter Calibration

Genauigkeit und Qualität

Wir haben den Sensor über einige Tage getestet. Das Wichtigste, was man vorab sagen kann, ist, dass der Sensor stabil ist. Auch die Wassertemperatur wirkt sich kaum auf die Messwerte aus. Allerdings ist der Sensor, wenn er auf kleine Mengen kalibriert ist, bei großen Wassermengen etwas ungenau. So hat man bei 10 Liter Wasser eine Genauigkeit von ungefähr +-150 Milliliter. Bei 100 Litern liegt die Genauigkeit dann bei etwa +- 1.5 Liter. Für private Zwecke ist der Sensor daher ganz gut geeignet. Für Verrechnungszwecke ist dieser Sensor jedoch überhaupt nicht geeignet.

Arduino Source
//More information at: https://wwww.aeq-web.com

float cfactor = 5.0;

byte interrupt = 0;
byte sensorPin = 2;
byte pulseCount;
float flowRate;
unsigned int f_ml;
unsigned long t_ml;
unsigned long oldTime;

void setup()
{
  Serial.begin(9600);
  pinMode(sensorPin, INPUT);
  digitalWrite(sensorPin, HIGH);
  attachInterrupt(interrupt, pulseCounter, FALLING);
}

void loop()
{
  if ((millis() - oldTime) > 1000)
  {
    int semic;
    detachInterrupt(interrupt);
    flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / cfactor;
    oldTime = millis();
    f_ml = (flowRate / 60) * 1000;
    t_ml += f_ml;
    Serial.print("Current flow: ");
    Serial.print(int(flowRate));
    Serial.print(".");
    semic = (flowRate - int(flowRate)) * 10;
    Serial.print(semic, DEC) ;
    Serial.print("L/min");
    Serial.print("  Total: ");
    Serial.print(t_ml);
    Serial.println("mL");
    pulseCount = 0;
    attachInterrupt(interrupt, pulseCounter, FALLING);
  }
}

void pulseCounter()
{
  pulseCount++;
}

Oft gelesen

Anzeige:

Video zum Beitrag

Social Media

Newsletter