Nachdem meine Teichstation kein Erfolg war, gibt es nun eine neue Verwendung für das Projekt. Dafür muss die Station aber um einen Sensor erweitert werden, der messen kann, wie viel Wasser pro Minute durch einen Schlauch fließt (Durchflusssensor). In diesem Artikel beschreibe ich, wie ich den Sensor kalibriert habe und biete eine Vorlage für den 3D-Druck, mit der sich der Sensor einfach verschrauben lässt.
Theorie
Eine erste Idee, wie ein Durchflusssensor aufgebaut sein könnte, hatte ich schon, bevor ich überhaupt nach Durchflusssensoren Ausschau gehalten hatte. Ich überlegte zuerst, selbst einen zu bauen, allerdings wäre das sehr aufwendig geworden und hätte wahrscheinlich nur halb so gut funktioniert wie ein gekaufter. Dennoch ist das Prinzip einfach: Das durchfließende Wasser treibt ein Rad an, an dem ein Magnet befestigt ist. Von außen ist ein Hall-Sensor befestigt, mit dem sich das Magnetfeld des vorbeikommenden Magneten messen lässt (vgl. Abb. unten). Auf diese Weise ergibt sich bei jeder Umdrehung ein Puls, der sich durch die Hall-Spannung messen lässt. Je schneller das Wasser fließt, desto schneller folgen die Pulse aufeinander, das heißt, die Pulsrate ist ein Maß für die Strömungsgeschwindigkeit. Kennt man die Querschnittsfläche des Rohrs sowie die Strömungsgeschwindigkeit kann man das durchgeflossene Volumen pro Sekunde berechnen und erhält so den Wasserfluss.
Während sich bei vielen Durchflusssensoren schon an der Form das oben beschriebene Prinzip erkennen lässt, ist das bei meinem Durchflusssensor nicht so. Da ich dazu auch kein Datenblatt finden kann, kann ich nur vermuten, dass auch dieser Sensor ein Rad mit einem daran befestigten Magneten (oder etwas ähnliches) enthält. Eine Alternative wäre die magnetisch-induktive Durchflussmessung, jedoch zeigte sich bei meinen Versuchen, dass es bei meinem Sensor vorkommen kann, dass der Hall-Sensor nach Durchfluss des Wassers eine durchgehend hohe Spannung zeigt. Dies kann ich mir nur dadurch erklären, dass der Magnet direkt am Hall-Sensor stehen geblieben ist – beim magnetisch-induktiven Messverfahren hingegen sollte es ohne Wasserfluss niemals eine Spannung geben.
Anschluss an den Arduino
Der Anschluss an den Arduino ist einfach: Das rote Kabel wird an ein hohes Potential (5V), das schwarze Kabel an das Nullpotential (0V, GND) angeschlossen. Dies sichert den Stromfluss durch den Hall-Sensor. Mit dem gelben Signalkabel kann dann die Hall-Spannung gegenüber GND gemessen werden. Dazu kann man das Kabel an einen analogen Pin wie A0 anschließen – da es aber nur darum geht, die Anzahl der Pulse zu zählen, reicht ein Digitalpin zur Unterscheidung von HIGH/LOW völlig aus.
Das Programm
Da mir der Aufbau klar war, suchte ich nicht nach Tutorien im Internet (wie zum Beispiel bei theorycircuit oder instructables), sondern schrieb mir selbst ein Programm. Zugegebenermaßen war der erste Versuch noch nicht erfolgreich – zuerst dachte ich, folgendes würde bereits ausreichen, um die Anzahl der Pulse im Messzeitraum zu zählen:
falls Potential hoch:
erhöhe zähler um 1
warte, solange das Potential hoch ist (also bis der Puls vorbei ist)
… und dies wäre dann für den gesamten Messzeitraum zu wiederholen.
Leider stellte sich heraus, dass die Möglichkeit, dass der Magnet in der Nähe des Hall-Sensors stehen bleibt und dementsprechend ein durchgehend hohes Potential vorhanden ist, bei diesem Programm zu einem unerwünschten Verhalten führt: Es bleibt “ewig” in der warte-Schleife gefangen und hört nicht mit der Messung auf. Außerdem wurde eine ähnliche Abfrage, die die Messung starten sollte, schon ausgelöst, bevor überhaupt ein Wasserfluss da war.
Entscheidend ist es also, den Wechsel des Potentials von niedrig zu hoch (oder umgekehrt) zu erkennen. Dazu wird im folgenden Programm mit zwei Variablen für das Potential gearbeitet: oldPot
speichert das gerade vergangene (und bis zur neuen Messung aktuelle) Potential. newPot
speichert das neu eingelesene Potential. Das wird in einem Messzeitraum von zehn Sekunden in jeder Millisekunde wiederholt. Dementsprechend kommt mein Programm im Unterschied zu den oben verlinkten Tutorials ohne Interrupt-Pin aus, der für Anfänger vielleicht schwieriger zu verstehen ist. Außerdem hilft dieses Programm, falls man keinen Interrupt-Pin mehr übrig hat. Unten gibt es das Programm auch zum Download.
// Sketch zum Testen und Kalibrieren des Flowmeters von SAIER
#define flowSignal 7
bool oldPot = 0;
bool newPot = 0;
int counter = 0;
long startTime;
void setup() {
Serial.begin(115200);
pinMode(flowSignal, INPUT);
}
void loop() {
Serial.println("Waiting for water flow...");
oldPot = digitalRead(flowSignal);
newPot = digitalRead(flowSignal);
do {
oldPot = newPot;
newPot = digitalRead(flowSignal);
delay(1);
}
while(oldPot == newPot);
Serial.println("Starting measurement");
counter = 1; // first pulse was measured in do-while-loop above
startTime = millis();
while ( millis() - startTime < 10000) {
oldPot = newPot;
newPot = digitalRead(flowSignal);
if ( newPot == 1 && oldPot == 0 ) {
// Potential rised up
counter ++;
}
delay(1);
}
Serial.println("Measurement ended.");
Serial.println("--- Results: ---");
Serial.println("Pulse-Counter: " + String(counter) + " in 10 seconds");
float flow = (float(counter) / 10 + 4) / 10;
Serial.println("Flow according to formular given in data sheet: " + String(flow) + " L/min");
float flow10 = flow/6;
Serial.println("Corresponds to: " + String(flow10) + " L / 10s (Duration of Measurement)");
// adding some space before next measurement
for(int i=0; i<5; i++) Serial.println();
delay(3000);
}
Kalibrieren / Testen
Am Ende des Programms erkennt man die Umrechnung der Pulsrate in einen Wasserfluss. Dazu habe ich die angegebene Formel zum Wasserfluss umgestellt. Da die Pulsrate in der Formel in Hz, also pro Sekunde angegeben wird, muss die gemessene Pulsrate (aus 10 Sekunden) noch durch 10 geteilt werden. Das Ergebnis ist der Wasserfluss in Liter pro Minute. Gültig ist die Formel laut Herstellerangaben ab einem Wasserfluss von 1L/min. Das entspricht einer Pulsrate von 6 Hz bzw. 60 Pulsen in 10 Sekunden.
Da ich skeptisch war, ob diese Formel so stimmt (ich hatte einen proportionalen Zusammenhang erwartet), habe ich die Ergebnisse der Formel überprüft. Dazu habe ich zusammen mit meinem Vater einen Schlauch mit Trichter an den Sensor angeschlossen, das Programm gestartet, unterschiedlich starke Wasserflüsse fließen lassen und das in zehn Sekunden durchgeflossene Wasser mit einem Eimer aufgefangen, sodass wir die tatsächlich durchgeflossene Wassermenge mit der von der Formel ermittelten Wassermenge vergleichen konnten. Unten ist das Ergebnis zu sehen.
Man erkennt, dass die gemessenen Wassermengen durchgehend größer sind als die von der Formel ermittelten Wassermengen, dass aber die Steigung der Geraden gut übereinstimmt und lediglich eine konstante, kleine Wassermenge zwischen den Geraden liegt. Wir führen dieses Ergebnis auf unsere Reaktionszeit zurück, die nötig war, um auf das Ende der Messung (vom Arduino verkündet) zu reagieren. Außerdem ließ sich ein leichtes Nachfließen des Wassers nicht vermeiden. Insofern lässt sich sagen, dass die von der Formel ermittelten Werte sehr gut passen und brauchbare Ergebnisse liefern!
Material
Zum Abschluss stelle ich mein Test-Programm als .ino-Datei zur Verfügung. Außerdem füge ich die Dateien für den 3D-Druck der Sensorhalterung bei. Viel Erfolg bei eigenen Projekten!