Hallo Zusammen,
für meine Gartenbewässerung habe ich ein komplettes System aus mehren PIs aufgebaut, die verschiedene Aufgaben übernehmen und
miteinander kommunizieren.
Um zu Bestimmen, ob die Bewässerung aus der Zisterne erfolgen kann, oder der Hausanschluss verwendet soll war ein Punkt des Projekts
den Zisternen-Füllstand zu überwachen.
Zunächst hatte ich dies über einen Ultraschallsensor realisiert, war aber mit der Genauigkeit unzufrieden, vor allem bei Entfernungen von über einem
Meter lieferten die Spielzeug sensor schon Abweichungen im Bereich von 20 bis 25cm.
Also habe ich die Überwachung umgestellt auf eine Wasser-Druck-basierte Überwachung, dies erschien mir die logischste aller Kenngrößen.
Hier eine Zusammenfassung, zum Ausschneiden und Nachbasteln
Zunächst ein paar Gedanken zur Grundüberlegung:
- Je nach Standort haben wir ca 1 bar Luftdruck, die täglichen Schwankungen sind vernachlässigbar.
- Physikalisch gesehen ist das schöne, dass der Wasserdruck auf einen Punkt lediglich von der Höhe der Wassersäule abhängt, völlig egal wieviel liter dies sind, oder wie das Wasser geformt ist.
- Hier ergibt sich pro 10m Wasser 1 bar Druck.
- Meine Zisterne hat eine Recht übliche Zylinderform: 2m Durchmesser, 2,17 Höhe (bis Überlauf), das ergibt 6817l Volumen.
Ich habe mir daher folgenden Drucksensor gekauft, dieser bildet einen Messbereich von 0-30 psi (ca 0 - 2 bar) auf den Bereich 0-5V ab (wenn er mit 5V betrieben wird)
https://www.amazon.de/gp/product/B07YZKS27T/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&th=1&tag=psblog-21 [Anzeige]
Da das Rasperry keine analoge Auswertung vornehmen kann, musste zusätzlich ein Analog-Digital-Converter her, habe folgenden gewählt:
https://www.amazon.de/gp/product/B07DFX9Q4G/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1&tag=psblog-21 [Anzeige]
(einen weiteren für künftige Spielereien)
Aufbau
Der Sensor ansich ist Wasserdicht, auch der Stecker wirkt optisch wasserdicht. Da das Teil jedoch mit ganzen 20cm Kabel geliefert wird, musste ich zwangsläufig etwas anbauen.
Ich habe den Sensor also in eine herumliegende Klemmbox gebaut, mit Reste vom Pool-Kleber fixiert und das Gehäuse dann mit Kunstharz ausgegossen um a.) den Auftrieb zu entfernen und b) das ganze einfach 100% abzudichten.
Das Kabel zum PI bzw. zum Analog-Digital-Converter ist etwa 5-Meter lang, stellt aber in der Praxis kein Problem dar, trotz der geringen Spannungen. Selbst wenn die Spannung hierdurch verfälscht werden würde, ist das egal, denn mich interessiert nicht, ob da unten jetzt 1.2bar oder 1.165bar herrschen - mich interessiert nur das delta zwischen "Voll" und "Leer".
So sieht das vergoßene Gehäuse Gehäuse aus
Links neben dem PI ist der Mini-Analog-Digital-Converter
Auswertung & Programmierung
Für den Betrieb der PIs verwende ich Java (Beruf Software-Entwickler) und die fs-based Steuerung des PIs.
Zwar gibt es tolle, fertige Libraries, ich erfinde das Rad aber manchmal gerne neu - denn ich bin der Meinung, wenn man es 100% selbst gemacht hat, hat man es verstanden und kann dann ganz anders mit Fehlern umgehen.
Betrieben mit 5V und folgender Konfiguration des Wandlers:
i2cset -y 1 0x48 0x01 0x0342 w
^ ein Wort schreiben
^----- Zu schreibende Konfiguration, siehe unten.
^---------- In Register 1 schreiben
^--------------- Gerät an Adresse 0x48 beschreiben
^------------------- I2C BUS 1 verwenden
^--------------------- yes, keine Bestätigung
^----------------------------- Serienmäßiges Programm um I2C Befehle zu senden.
Die Konfiguration für den Wandler ist sehr umfangreich (näheres ist im Datenblatt zu finden: https://www.ti.com/lit/gpn/ads1115) , der Wert "0x0342" hat folgende Effekte, zu beachten ist, dass die Werte in der Form 0xLSBMSB übertragen werden müssen:
Wichtigste Eckdaten:
- Betrieb 0 > egal, nur relevant für Betrieb.
- Multiplexer 100 > AINP = AIN0 and AINN = GND (Ich möchte Eingang 0 vs GND messen)
- Verstärkung 001 > +/-4,096V
- Modus 0 > Kontinuirliche Messung.
- Sampling Rate 000 > 8 Messungen pro Sekunde - das reicht völlig aus und je mehr, desto stärker die Varianz der Messwerte.
- Kom. Mode > 0 , traditionell.
- Alert stuff: brauchen wir nicht, deaktivieren -> Die letzte 11.
Damit konnte ich für meinen Anwendungsfall folgende Werte ermitteln:
Es ergibt sich beim Wandler "125 micro-Volt pro digit".
Beschreibung Spannung Sensor Anzeige AD-Wandler
Zisterne leer 0,70788V 5663
Zisterne voll 1,10113V 8809
Der Bereich des Sensors (0-2bar, 0-5V) ist damit natürlich nicht sehr sinnvoll ausgenutzt - Mein Messbereich ist wie erwähnt ca 1-1.2 bar.
Dennoch ergibt sich hier ein delta von 3146 digits, die sich bequem und hinreichend genau auf 0-100% umrechnen lassen.
Die Auswertung schwankt bei unveränderten Bedingungen etwa um +/- 20 digits. Auf den Bereich von 3146 digits bezogen bedeuted das,
es ergibt sich ein Fehler von +/- 0,6357% - und auf das Volumen von 6817l bezogen, entspricht das +/- 43,3 Liter.
Aber ich denke damit kann man leben.
Damit die Zisternen-Füllstands-Anzeige nicht permanent schwankt, bilde ich immer den Durchschnitt über die letzten 60 Sekunden Messwerte. Das funktioniert ganz gut und ist hinreichend schnell in der Reaktion.
Auslesung der Werte erfolgt im übrigen über das Tool "i2cget":
Anmerkung hierzu: Auch das Ergebnis der Auslesung ist in der Form 0xLSBMSB, das habe ich für diese Sensor-Klasse einfach hardcoded, bsp:
String read = IOUtils.execCmd("i2cget -y 1 " + i2cRead + " w").trim();
//result is 0xLSBMSB, for example 0x1234 is hex 3412
Long converted = 0L;
converted += Long.parseLong("" + read.charAt(3), 16) * 1;
converted += Long.parseLong("" + read.charAt(2), 16) * 16;
converted += Long.parseLong("" + read.charAt(5), 16) * 256;
converted += Long.parseLong("" + read.charAt(4), 16) * 4096;
Log.d(getClass(), "Raw-Value: " + read + " / Converted value: " + converted);
return converted;
Alles anzeigen
Jo, das wars im Prinzip soweit. Auf Programmierung und Co gehe ich jetzt nicht im Detail ein, da hier jeder eigene Vorlieben hat.
Wer aber konkrete Fragen hat, wie ich was in Java gemacht habe, kann mir diese natürlich gerne stellen.
Die PIs werden noch vom Gira-Homeserver ausgelesen und dort findet auch die "Benutzerfreundliche" Anzeige und Steuerung statt:
Sensor auf Tauchstation:
Sensor an der Luft (aka "Zisterne leer")