Tiefbrunnenpumpen Steuerung – [Teil 2] - AZ-Delivery

Willkommen zurück zum zweiten Teil der Serie „Tiefbrunnenpumpen Steuerung“. Und vielen Dank für die vielen wertvollen Hinweise und Verbesserungsvorschläge, die uns zum Teil 1 erreicht haben. Einige Verbesserungen werden Sie hier im zweiten Teil wiederfinden, obwohl nur diese Einleitung aktualisiert wurde, nicht der Hauptteil. Denn wir zeigen in unseren Blogs nicht nur das Fertigprodukt, sondern lassen uns sozusagen „über die Schulter schauen“ bei der Umsetzung unserer Projektidee mit seinen Zwischenschritten und Fehlversuchen. Bezüglich des Nachbaus bitte ich noch einmal ausdrücklich, die Warnhinweise zur Netzspannung zu beachten.


Im heutigen Blog-Beitrag wollen wir die im ersten Teil verwendeten Klappschwimmschalter durch einen Ultraschall Sensor ersetzen. Der geneigte Leser mag sich nun vielleicht fragen, wozu das gut sein soll! Hierfür gibt es mehrere Gründe.

Der erste Grund ist, dass die Befestigung des Schwimmers bei vielen Klappschwimmschaltern aus einem Teflon Band oder einem Kunststoff Band besteht. Die dauerhafte mechanische Belastung durch das Heben und Senken des Schwimmkörpers führt dazu, dass diese mit der Zeit brüchig wird und irgendwann reißt. Passiert dies unbemerkt, z.B. beim oberen Schalter, so haben wir keinen „Sensor“ mehr, der uns mitteilt, wenn das Fass vollgelaufen ist – die Tiefbrunnenpumpe pumpt dann weiter Wasser in das Fass und es läuft über. Ein Wasserschaden wäre der Fall!

Der zweite Grund ist, und diesen finde ich persönlich viel wichtiger, dass wir unter Verwendung der Klappschwimmschalter nicht wissen können, wie viel Wasser sich aktuell im Fass befindet. Plant man also, demnächst den Garten zu bewässern oder den Fischteich aufzufüllen, benötigt man also eventuell mehr Wasser, als vorhanden ist. Das am Fass angeschlossene Hauswasserwerk zieht mehr Wasser aus dem Fass ab, als die Tiefbrunnenpumpe fördert. Folglich könnte das Fass unbemerkt schnell leer laufen.

Hier hilft uns der Ultraschall Sensor. Mit ihm können wir den Wasserpegel im Fass bis auf einen Zentimeter genau messen. Damit und mit den Maßen des Fasses können wir den Füllstand berechnen.

Der Ultraschall Sensor

Der Ultraschall Sensor besteht aus einem Sende-Modul (40kHz Signal), einem Empfänger-Modul (im Prinzip ein Mikro) und einem Kontroll-Chip. Ausgelöst wird die Messung, wenn am Trigger Pin für mind. 10µs eine LOW-HIGH-LOW Flanke anliegt. Dann sendet das Sende-Modul acht kurze Ultraschall-Impulse und liefert über den Echo Pin ein HIGH Signal für die Dauer des reflektierten Signals. Dieses Signal müssen wir dann in eine Entfernung umrechnen.


Bei der Schallgeschwindigkeit müssen wir beachten, dass diese von der Umgebungstemperatur abhängig ist. Daher muss zum Grundwert der Schallgeschwindigkeit noch eine Temperaturkorrektur hinzugefügt werden. Daraus ergibt sich dann für 20°C eine Schallgeschwindigkeit von:

331,5 m/s + (0,6 * 20) = 343,5m/s

Da unser Signal aber nicht in Metern pro Sekunden gemessen wird, sondern in cm pro µs, müssen wir die Schallgeschwindigkeit noch von m/s in cm/µs umrechnen. Dies erfolgt, in dem wir den Wert von 343,5m/s zunächst durch 1000^2 dividieren und anschließend mit 100 multiplizieren:

343,5m/s / 1000^2 * 100 = 0,03435cm/µs

Die Entfernungsmessung über die Laufzeit des Signals erfolgt nach folgender Formel:

Distanz = (Schallgeschwindigkeit in cm/µs) * Signalzeit / 2

Die Laufzeit muss durch zwei geteilt werden, da das Signal ja einen Hin- und einen Rückweg hat – es wird ja reflektiert.

Die Formel zum Berechnen des Füllstandes und der Wassermenge


Das Volumen des Fasses können wir über das Volumen für Zylinder berechnen. Dabei müssen wir ein wenig idealisieren, da das Fass kein reiner Zylinder ist, sondern im unteren und oberen Bereich leicht nach innen hin abfällt. Dies ist aber für uns vernachlässigbar.

Das Fass hat folgende Maße: Höhe (h) = 98cm, Durchmesser (d) = 57cm. Das Volumen ergibt sich wie folgt:

V = (d/2)^2 * 3,141 * h = 250025,1705 cm^3 = 250L

Im Programm berechnen wir dann über folgende Formel zunächst die Füllstandhöhe in Prozent:
waterLevel = (1-(gemesseneDistanz/Fasshöhe))*100;

Daraus leiten wir dann später (für den dritten Teil dieser Serie) die tatsächlich vorhandene Wassermenge ab:
waterQuantity = waterLevel * 250 / 100;

Der Schaltungsaufbau auf dem Breadboard


Betrachten wir den Breadboard-Aufbau, so fällt auf, dass nicht nur die Klappschwimmschalter verschwunden sind, sondern neben dem Ultraschall-Sensor noch ein Bauteil hinzugekommen ist: ein Logic Level Converter.

Dieser ist notwendig, da die GPIO Pins des ESP32 nur mit 3,3V angesteuert werden dürfen. Da der Ultraschallsensor aber mit 5V arbeitet, müssen wir die Spannungspegel des Sensors auf das Niveau des ESP32 bringen. Dies übernimmt der Logic Level Converter für uns.

Der Logic Level Converter

Bei dem hier verwendeten Logic Level Converter handelt es sich um einen 8-kanäligen bi-direktionalen Converter. Soll heißen, er kann bis zu acht Signale gleichzeitig von A nach B oder von B nach A wandeln. Die Beschaltung ist in unserem Fall sehr einfach:

VA 3.3V
OE 3.3V (Output Enabled)
VB 5V
GND GND (Masse)
A1 GPIO21 (Trigger Signal des Ultraschall Sensors)
A2 GPIO22 (Echo Signal des Ultraschall Sensors)
B1 Trigger Pin des Ultraschall Sensors
B2 Echo Pin des Ultraschall Sensors


Alternative zum Logic Level Converter

Alternativ zum Logic Level Converter, sollten Sie keinen zur Verfügung haben, können Sie auch einen Spannungsteiler verwenden. Ein Spannungsteiler ist, simpel gesprochen, eine Reihenschaltung von Widerständen. Im einfachsten Fall, wie dem unseren, besteht diese Reihenschaltung aus zwei Widerständen. Die Widerstände werden so gewählt, dass die Spannung zwischen dem ersten und zweiten Widerstand auf 1/3 zu 2/3 aufgeteilt wird. Exemplarisch ein Breadboard Aufbau.


Die Spannungsversorgung des Breadboard liefert 5V, so wie es der Ultraschall Sensor auch tun würde. Das Verhältnis der Widerstände, hier ein 10k und ein 22k Widerstand, ist ca. 1/3 zu 2/3. Messen wir die Spannung am zweiten Widerstand (gelbe Leitung), so bekommen wir ca. 3.4V. Damit können wir bedenkenlos auf die GPIO Pins des ESP32 gehen.

Die Software 

// 2020-03-02 Brunnenpumpe V2
// (c) Markus Pohle @Creative Commons BY-NC-SA
// https://en.wikipedia.org/wiki/File:Cc-by-nc-sa_icon.svg
// 
// Brunnenpumpen Steuerung mittels Ultraschall-Sensor

const int relayPin = 23;
const int triggerPin = 22;
const int echoPin = 21;
const int barrelHeight = 98;
int pumpActive = 0;
float waterLevel = 0;


void setup() {
//  Serial.begin(115200);
  pinMode(relayPin, OUTPUT);
  
  // PIN-Modes
  pinMode(triggerPin, OUTPUT);
  pinMode(echoPin, INPUT);
  digitalWrite(triggerPin, HIGH);
}

float distance() {
  float d = 0;
  long t = 0;

  noInterrupts();
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(3);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);
  t = pulseIn(echoPin, HIGH);
  d = (t/2) * 0.03435;
  interrupts();
  return(d);
}

void loop() {
  
  waterLevel = (1-(distance()/barrelHeight))*100;

  if (!pumpActive && (waterLevel <= 15) ) {
    pumpActive = 1;
  }

  if (pumpActive && (waterLevel >= 92) ) {
    pumpActive = 0;
  }

  
//  Serial.println(waterLevel);

  // vor der nächsten Messung warten wir eine Sekunde
  delay (1000);
  
  if (pumpActive) {
    digitalWrite(relayPin, HIGH);
  } else {
    digitalWrite(relayPin, LOW);
  }

}

Der Sketch unterscheidet sich nicht sonderlich viel vom Sketch des ersten Teils. Wir definieren wieder einige Konstanten (die GPIO Pins) und Variablen. In der setup() Routine definieren den Relais Pin als OUTPUT, das Gleiche gilt für den Trigger Pin. Den Echo Pin definieren wir als INPUT (wir wollen ja das ECHO Signal des Ultraschall-Sensors darüber einlesen).

Interessant ist dann noch das eigentliche Messen. Hierzu deaktivieren wir zunächst die Interrupts des ESP32 – sicher ist sicher. Dann ziehen wir den Trigger Pin für 3µs auf LOW, anschließend für 10µs auf HIGH und danach wieder auf LOW. Dies löst beim Ultraschall Sensor die Messung aus, dessen Ergebnis wir dann über den ECHO Pin auslesen können. Nachdem die Messung (und die Berechnung der Entfernung) abgeschlossen ist, schalten wir die Interrupts wieder ein.

In der loop() Schleife führen wir dann die Distanzmessung aus (Besonderheit hier bei unserer Formel: wir bestimmen anhand des gemessenen Abstands zu wie viel Prozent das Fass gefüllt ist). Über zwei if-Abfragen zum zuvor berechneten Füllstand legen wir dann fest, ob das Relais geschaltet werden muss oder nicht.

Das Sensor Gehäuse

Wenn wir so weit sind, dass wir die Schaltung zur Steuerung der Tiefbrunnenpumpe verbauen, müssen wir uns auch Gedanken über ein Gehäuse für den Ultraschall Sensor machen. Dieser wird ja innerhalb des Fasses mittig auf die Unterseite des Fassdeckels montiert werden müssen, damit er vernünftig messen kann. Daher habe ich mittels TinkerCAD ein passgenaues Gehäuse für den Sensor erstellt.




Verschraubt werden Gehäusekörper und Deckel mittels M3 Gewinde-Schrauben und Muttern. Damit diese gut ins Gehäuse eingesetzt werden können, habe ich hier bereits entsprechende Aufnahmen direkt beim Erstellen der CAD Vorlage vorgesehen. Die Mutter wird dabei mit leichtem Druck in die vorgesehene Öffnung gepresst. Dies bietet den Vorteil, dass man beim Eindrehen der Schraube die Mutter nicht mehr kontern muss, da sie sich nicht mehr mitdrehen kann.




Die .stl Dateien zum Slicen für den 3D Druck finden Sie hier:

HC-SR04Herunterladen

Viel Spaß beim Nachbauen!

Markus Pohle

Esp-32Projekte für fortgeschrittene

17 comentarios

Markus

Markus

Hallo, ich verwende an statt der HC-SR04 Sensors den Ultraschall-Sensor “DYPA02YYWM”
der ist wasserdicht und in den Konfiguration Softwareseitig gleich dem HC….
Man kann diesen Sensor ohne Anpassungen einfach verwenden.
Des weiteren benutze ich noch den Dallas DS18B20 Temperatur-Sensor um die Umgebungstemperatur am Ultraschallsensor zu messen.
Damit lässt sich dann der genaue Wert für die Schallgeschwindigkeit errechnen
( Schallgeschwindigkeit = ((0.6*Temperatur)+331.5)/10000; ) und somit werden die Messungen der des Ultraschallsensor genauer.
Um dann noch etwas genauer zu werden kann man die Messung mehrfach (z.B. 5x) durchführen und dann einen Mittelwert errechnen.

MfG Markus

bert

bert

Kann man das ganze so 1 zu 1 auf einen NodeMCU übernehmen?

Markus Pohle

Markus Pohle

Hallo @Reinhard,
vielen Dank für den Hinweis zum JSN-SR04T und dessen Begrenzung im Kontext minimale Messgröße.
Markus

Reinhard

Reinhard

Ich verwende den wasserdichten JSN-SR04T statt des HC-SR04.
Allerdings hat der JSN-SR04T den Nachteil dass keine Abstandsmessung <22 cm möglich ist.
Der Abstand in meiner Tonne beträgt Unterkante JSN-SR04T bis maximaler Wasserstand (Überlauf) 12cm. Somit erkenne ich auf maximaler Wasserstand-10cm schon auf “Tonne voll”
Gruß Reinhard

Stephan

Stephan

Hallo
Noch zwei Ergänzungen zu meinem Post:
1. Der SR04T ist gem. Datenblatt 3.0-5.5V spezifiziert. Ich betreibe ihn an einem ESP32 mit 3.3V ohne Probleme.
2. In meiner Formel hat es einen Fehler drin, die Klammer ist am falschen Ort, richtig ist:
level = (distToEmpty – (distMeasured – distToFull)) / distToEmpty * 100
Ergibt den Füllgrad in %. Statt 100 die Kapazität des Behälters in ltr angeben und man erhält die IST-Liter.

Markus Pohle

Markus Pohle

Hallo @Stephan,
hallo @makerMcl,

vielen Dank für Ihre Rückmeldungen und Hinweise… die genannte Bibliothek “NewPing” schaue ich mir an, ebenso wie den Hinweis auf die Mehrfachmessung. Vielleicht kann ich diese beiden wertvollen Hinweise noch in den dritten Teil meiner Serie einbauen.

Beste Grüße
Markus Pohle

Markus Pohle

Markus Pohle

Hallo @Michael Jochim,
vielen Dank für Ihren Kommentar… tatsächlich hatte ich bis jetzt keine Probleme mit der Messwerterfassung.
Bezugnehmend auf die Maße meine Fasses habe ich mal, unter Berücksichtigung des Abstrahlwinkels des HC-SR04, den Keulendurchmesser des Ultraschallsignals in Relation zum Abstand zur Wasseroberfläche berechnet. Dabei hat sich bei mir folgende Tabelle ergeben. Nehme ich meinen maximal niedrigstens Wasserstand und schlage in der Tabelle den Keulendurchmesser nach, so ist dieser ca. 47cm. Mein Fass hat aber einen Durchmesser von 57cm.

Folgendes kann ich mir vorstellen, dass es bei Ihnen zu Fehlmessungen kommt:

1. Ihr Fass ist schmaler, die Keule “berührt” den Fassrand und es kommt dabei zu reflexionen.
2. Ihr Sensor ist nicht exakt im 90Grad Winkel zur Vertikal-Achse des Fasses montiert. Hierdurch verschiebt sich die Keule und “berührt” den Rand und es kommt zu Reflexionen.

Beste Grüße
Markus Pohle

Distanz in m | Keulendurchmesser in m
0,1 | 0,05
0,2 | 0,10
0,3 | 0,16
0,4 | 0,21
0,5 | 0,26
0,6 | 0,31
0,7 | 0,36
0,8 | 0,42
0,9 | 0,47
1,0 | 0,52
1,1 | 0,57
1,2 | 0,62
1,3 | 0,68
1,4 | 0,73
1,5 | 0,78

Markus Pohle

Markus Pohle

Hallo @Reiner,
hallo @Conda,
vielen Dank für Ihre Hinweise zum HC-SR04 und der Problematik mit der Kondensation.
Bei mir ist es schon immer so gewesen, dass das Regenfass zum Füllen in einem Keller steht, der sehr kühl ist. Durch die starke Ummauerung des Kellers ergeben sich hier, Sommer wie Winter, so gut wie keine Temperaturschwankungen – mit Kondensation habe ich bisher nicht zu kämpfen, werde aber den Zustand des Sensor sehr genau im Auge behalten – danke für den wertvollen Hinweis.
Sie haben aber natürlich recht, dass es in Umgebungen, in denen es zu Kondensation kommt, z.B. weil der Sensor in einem Fass im Freien verbaut ist, besser wäre, die JSN-SR04T Variante zu verbauen.
Gruß
Markus Pohle

Markus Pohle

Markus Pohle

Hallo @Karl Erber,
vielen Dank für Ihre Frage… ja, auch den Füllstand eines mit Sägespänen gefüllten Fasses können Sie auf diese Weise ermitteln… auch Sägespäne reflektieren die vom Sensor ausgesendeten Ultraschallwellen. Wichtig ist dabei jedoch zu beachten, dass die Sägespäne nicht durch Einblasen in das Fass gelangen. Dies würde nämlich dazu führen, dass viele kleine Sägespäne-Fragmente “in der Luft umher schwirren”. Dies würde zu Fehlmessungen führen.
Gruß
Markus Pohle

Markus Pohle

Markus Pohle

Hallo @Holger Ullrich,
vielen Dank für Ihren Kommentar… mir ging es bei der Definition der IF Bedingung um die Verknüpfung der Bedingungen aus aktiver Pumpe und Wasserstand. Tatsächlich ist es aber so, wie Sie es sagen, an dieser Stelle könnte man in den IF Anweisungen des Status des Pumpenzustands außen vor lassen.
Beste Grüße
Markus Pohle

Stephan

Stephan

Hi. Ich habe mich kürzlich auch mit dem Thema befasst und eine Überwachung für meinen Regentank realisiert. Dazu folgende Punkte:
1. Formel zur Level-Berechnung: Die hier angeführte Formel fordert, dass der Sensor die Wasseroberfläche berührt bei 100% Füllhöhe. Das tut ihm nicht gut… Zudem messen die nicht bis 0 cm)
Meine Formel berücksichtigt die Montagehöhe über dem 100%-Level:
distMeasured: Messwert vom Sensor auf die Wasseroberfläche
distToFull: Montagehöhe des Sensors über dem 100%-Level
distToEmpty: Füllhöhe (Unterschied zwischen 0 und 100%), einfach ermittelbar mit dem Zollstock.
Die Formel: level = (distToEmpty – (distMeasured – distToFull) / distToEmpty)*100
(jaja, es ginge wohl auch noch etwas kürzer…)
2. Im Prinzip fkt das auch mit Spänen (vorbehältlich Staubproblem und die Späne sollten nicht als Kegel daliegen sondern flach…ziemlich unrealistisch)
3. Ich verwende den ‘wasserdichten’ Sensor JSN-SR04T, statt den hier gezeigten Bastelsensor.
4. Da ich ab und an Fehlmessungen habe (Resultat -1.0), mittle ich immer 5 Messungen für den relevanten Wert.

makerMcl

makerMcl

Hallo,
ich bin aktuell an einer Lösung für Zisternen-Füllstandsmessung dran.
Den Hinweisen zur Wasserfestigkeit kann ich mich nur anschliessen, insbesondere Kondenswasser/Luftfeuchtigkeit wird unterschätzt. Der JSN-SR04T ist eine gute Alternative, funktioniert abweichend vom Datenblatt/Board-Beschriftung sogar mit 3,3V und damit direkt mit ESP* zusammen.

Für die Software kann ich die Lib NewPing empfehlen, das vermeidet eine ganze Menge Probleme mit der trivialen Methode pulseIn(). Am besten noch ergänzen durch Mehrfach-Messung und Nutzung des Medians.
Worauf stützt sich die Aussage “zentimeter-genau”?
Bei eigenen Messungen bin ich mit freihändigem Versuchsaufbau und 5 Iterationen auf Varianzen bis runter auf 1..2 µs (Mikrosekunden) gekommen.
Sollte die Messung genauer ausgewertet werden wollen, dann auch die Umgebungstemperatur berücksichtigen (noch ein kleiner NTC an A0 dazu?)

Viele Grüße,
Matthias

Conda

Conda

Viele Grüße an das Team und Dank für die vielen Anregungen für Projekte. Zu dem jetzigen Projekt, besonders dem Ultraschallsensor möchte ich nur die mangelnde Haltbarkeit des nicht wassergeschützend SR04 hinweisen. Gerade in einem geschlossenen Faß dürfte die Feuchtigkeit am Sensor kondensieren und die Membran oder die Elektronik recht schnell zerstören. Es gibt jedoch zum SR04 kompatible Module, die wasserfest sind. Letztlich sind das die bekannten Sensoren in den Autostoßstangen, die in extrem rauher Umgebung (Schwallwasser, Streusalznebel) arbeiten.

Michael Jochim

Michael Jochim

Hallo,
diese Idee hatte ich auch schon für unsere Regentonne. Allerdings habe ich ein Problem beobachtet, dass die Distanzmessung außerhalb der Tonnen problemlos funktioniert, der Sensor aber in der Tonne Hausnummern liefert. Ich habe mir das mit Reflexionen des Ultraschallsignals in der geschlossenen Tonne erklärt, ist dieses bei ihnen nicht aufgetreten?

Gruß

MJ

Reiner

Reiner

Ich hatte für mein Bewässerungssystem ursprünglich auch einen HC-SR04 Ultraschallsensor am ESP32 verwendet. Die Messungen waren erstaunlich präzise und zuverlässig.

Allerdings verträgt dieser Sensor auf Dauer keine Feuchtigkeit, die z.B. in einer Regentonne ständig entsteht. Zwei dieser Sensoren waren dadurch innerhalb von 2 Wochen völlig unbrauchbar!

Aktuell teste ich mit einem JSN-SR04T, der wasserdichten Variante des HC-SR04. Scheint eine gute Alternative zu sein.

Ich habe auch einen kapazitiven Touchsensor-GPIO des ESP32 an die Wasserleitung angeschlossen. Dieser “Kondensator” liefert recht brauchbare Werte, die nach Mittelung und Kalibrierung auf die Umgebung auf den Füllstand umgerechnet werden können. Eine deutliche Verbesserung wird zusätzlich erreicht, wenn die Wassertemperatur zur Korrektur verwendet wird (DS18B20 außen an die Tonne anbringen).

Karl Erber

Karl Erber

Hallo, würde die Messung mit dem Sensor auch bei einem Fass mit Sägespäne funktionieren. Anzeige voll oder nicht.
Gruß

Karl

Holger Ullrich

Holger Ullrich

Welchen Zweck hat die Abfrage des aktuellen Pumpenzustands in den If-Abfragen?
Wenn der Füllstand unter 15% fällt soll die Pumpe an, dabei spielt es keine Rolle ob die Pumpe vorher aus war.
Das gleiche gilt für die obere Grenze.
Wenn der Füllstand 92% überschreitet soll die Pumpe aus, egal ob wir Sie vorher eingeschaltet haben.
Das macht so für mich keinen Sinn sondern verkompliziert nur unnötig den Code.
Oder übersehe ich da was?

Holger

Deja un comentario

Todos los comentarios son moderados antes de ser publicados