hardware:channels:meters:water:wasserzaehler_ohne_s0
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende ÜberarbeitungNächste ÜberarbeitungBeide Seiten der Revision | ||
hardware:channels:meters:water:wasserzaehler_ohne_s0 [2017/09/24 17:30] – Fehler im Arduino-Code korrigiert: 2 Zeilen aus dem php-Skript waren hineingeraten ... ruperts | hardware:channels:meters:water:wasserzaehler_ohne_s0 [2021/01/04 14:54] – Rechtschreibfehler korrigiert arie | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Mechanischen Wasserzähler auslesen ====== | ||
+ | ===== Ansatz 1: Text-/ | ||
- | Idee: Das kleine Sternrad des Wasserzählers mit einem Laser anvisieren.\\ | + | **Idee:** Die Ziffern und Rädchen des Wasserzählers über eine Text-/ |
+ | **Vorteil: | ||
+ | **Nachteil: | ||
+ | |||
+ | ==== Hardware ==== | ||
+ | |||
+ | Folgende Hardware (Gesamtkosten ~15€) wird benötigt: | ||
+ | * ESP32-CAM WiFi | ||
+ | * USB zu TTL UART Serial Converter zum Download des ESP32 | ||
+ | * Stromversorgung des ESP32, z.B. über USB Breakout-Modul und USB-Netzteil | ||
+ | |||
+ | ==== Software ==== | ||
+ | |||
+ | Die Idee und Software stammt von Jomjol - die Software und eine Anleitung sind hier hinterlegt: https:// | ||
+ | * Für den ersten Download empfehle ich folgende Schaltung: https:// | ||
+ | * Bei Nichterkennung des Geräts: Gerätemanager -> Benötigte Treiber ggf. über optionale Windows Updates installieren | ||
+ | * Bei Verbindungsproblemen -> USB-TTL/ | ||
+ | |||
+ | ==== vzlogger-Integration ==== | ||
+ | |||
+ | Hier der Code für die vzlogger.conf zum Abholen und Verknüpfen der Daten: | ||
+ | < | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }], | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Folgende Parameter müssen im Code ersetzt werden: | ||
+ | * UUID_FRONTEND: | ||
+ | * IP-ADDRESS_ESP: | ||
+ | |||
+ | Der Parameter ' | ||
+ | |||
+ | |||
+ | ===== Ansatz 2: Laser ===== | ||
+ | |||
+ | Idee: Das kleine Sternrad des Wasserzählers mit einem Laser anvisieren | ||
+ | |||
+ | ==== Hardware ==== | ||
<note important> | <note important> | ||
Zeile 23: | Zeile 71: | ||
{{: | {{: | ||
- | Neben dem Wasserzähler greife ich auch den Gaszähler ab. Auf dem letzten Rädchen ist hier ein silber beschichtetets Stück, das hervoragend reflektiert. Hier musste ich nicht den Aufwand mit dem Laser machen, sondern nutze hier dieses Bauteil [[http:// | + | Neben dem Wasserzähler greife ich auch den Gaszähler ab. Auf dem letzten Rädchen ist hier ein silber beschichtetets Stück, das hervoragend reflektiert. Hier musste ich nicht den Aufwand mit dem Laser machen, sondern nutze hier dieses Bauteil [[http:// |
{{: | {{: | ||
Zeile 29: | Zeile 77: | ||
Beide Zähler gehen an einen Analog in eines Arduino V3 (Ebay, deutlich unter 10 Euro) [[http:// | Beide Zähler gehen an einen Analog in eines Arduino V3 (Ebay, deutlich unter 10 Euro) [[http:// | ||
+ | Es empfiehlt sich, das Analogsignal, | ||
+ | |||
+ | <note important> | ||
+ | |||
+ | ==== Über Script in die Datenbank ==== | ||
+ | |||
+ | Für Gas- und Wasserzähler, | ||
+ | |||
+ | === Arduino === | ||
- | Das ist der Code auf dem Arduino. Die Idee ist die Differenz zwischen dem Tal und dem Berg bei dem analogen | + | Das ist der Code auf dem Arduino. Die Idee ist die Differenz zwischen dem Tal und dem Berg bei dem analogen |
<code c> | <code c> | ||
Zeile 124: | Zeile 181: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | === Script zur Datenübernahme === | ||
Der Code auf der PC/ | Der Code auf der PC/ | ||
(Aufruf mit Cron regelmäßig, | (Aufruf mit Cron regelmäßig, | ||
+ | |||
<code perl> | <code perl> | ||
# | # | ||
Zeile 214: | Zeile 274: | ||
</ | </ | ||
+ | < | ||
+ | Die Kanäle (channel_id) sind hart codiert: 12 und 9.</ | ||
+ | |||
Was noch justiert werden muss, ist die Differenz, die zwischen Tal und Berg nötig ist: | Was noch justiert werden muss, ist die Differenz, die zwischen Tal und Berg nötig ist: | ||
Zeile 268: | Zeile 331: | ||
?> | ?> | ||
- | |||
</ | </ | ||
- | |||
So sieht so eine Grafik aus: | So sieht so eine Grafik aus: | ||
- | |||
{{: | {{: | ||
{{: | {{: | ||
+ | <note tip>Oder den " | ||
+ | |||
+ | ==== Über vzlogger an die Middleware ==== | ||
+ | |||
+ | Für **nur einen** Wasserzähler, | ||
+ | |||
+ | === Arduino === | ||
+ | |||
+ | Hier der Code für den Arduino. Verkürzte Version von oben, weil nur eine Diode ausgewertet wird und die Impulse im Arduino nicht gezählt werden. | ||
+ | |||
+ | <code c> | ||
+ | |||
+ | // Original von mikemiller 2015-2016 | ||
+ | // Reduziert auf nur 1 Wasserzähler mit Ausgabe | ||
+ | // des Impulses auf die USB-Schnittstelle | ||
+ | |||
+ | void setup() | ||
+ | { | ||
+ | Serial.begin(300); | ||
+ | // Open serial communications and wait for port to open: | ||
+ | // A baud rate of 115200 is used instead of 9600 for a faster data rate | ||
+ | // on non-native USB ports | ||
+ | // | ||
+ | while (!Serial) { | ||
+ | ; // wait for serial port to connect. Needed for native USB port only | ||
+ | } | ||
+ | | ||
+ | // | ||
+ | pinMode(A0, INPUT); | ||
+ | digitalWrite(A1, | ||
+ | } | ||
+ | int wasser_max = 0; | ||
+ | long wasser = 0; | ||
+ | int wasser_z = 0; | ||
+ | unsigned long lastlog = 0; | ||
+ | unsigned long last_wasser = 0; | ||
+ | unsigned long time; | ||
+ | |||
+ | void loop() | ||
+ | { | ||
+ | // Gleitender Durchschnitt anwenden. | ||
+ | wasser = ((wasser *3) + analogRead(0))/ | ||
+ | time = millis(); | ||
+ | if (time < lastlog ){ //time ist übergelaufen | ||
+ | lastlog = 0; | ||
+ | last_wasser = 0; | ||
+ | } | ||
+ | wasser_max = max(wasser_max, | ||
+ | |||
+ | if ((wasser_max - 200) > wasser) | ||
+ | { | ||
+ | wasser_z++; | ||
+ | } else { | ||
+ | wasser_z = 0; | ||
+ | } | ||
+ | |||
+ | // Qn 2,5 m³/h = 2.500 Liter pro Stunde | ||
+ | // Das Raedchen hat 6 Fluegel und dreht sich 1x je 0,1 Liter --> 60 Impulse je Liter | ||
+ | // Bei Maximaldurchfluss 2.500 l/h * 60 Imp/l = 2.500*60 Imp/h = 2.500/60 Imp/s = 41,7 Imp/s | ||
+ | // --> Mindestens 24 ms zwischen zwei Impulsen (" | ||
+ | |||
+ | if (wasser_z > 40 && time - last_wasser > 30) { | ||
+ | wasser_max= 0; | ||
+ | lastlog = time; | ||
+ | last_wasser = time; | ||
+ | Serial.print(0x00); | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | Die Differenz zwischen Hell und Dunkel muss für dieses Code-Beispiel mindestens 200 betragen, sonst wird kein Impuls erzeugt. | ||
+ | |||
+ | === Frontend === | ||
+ | |||
+ | Kanal erstellen als Wassermengenzähler mit einer Auflösung von 60 (Impulse/l, siehe Berechnung im Code) und Stil=steps. UUID notieren. | ||
+ | |||
+ | === Beispielkonfiguration === | ||
+ | Exemplarische / | ||
+ | <code base vzlogger.conf> | ||
+ | { | ||
+ | // Water as S0 meter | ||
+ | |||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | |||
+ | " | ||
+ | " | ||
+ | |||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | // " | ||
+ | // " | ||
+ | // " | ||
+ | " | ||
+ | } | ||
+ | } // meter | ||
+ | </ | ||
+ | |||
+ | ===== Ansatz 3: grüne LED und Fototransistor ===== | ||
+ | |||
+ | Im [[https:// | ||
+ | |||
+ | Beim Nachbau hat es sich gezeigt, dass es u.a. auf die Helligkeit der verwendeten LED ankommt. Die zuerst beschafft LED war nicht hell genug, um den Fototransistor selbst bei direkter Belichtung durchzusteuern. Mit der nachbeschafften Nichia NSPG300D gelang der Betrieb dann auf Anhieb. | ||
+ | |||
+ | Wie in der Original-Anleitung beschrieben, | ||
+ | |||
+ | Dieser Impulsgenerator ließ sich dann einfach aufbauen und funktioniert in der Tat viel besser als die einfache Schaltung. Ob das an der Verwendung eines Mikrocontrollers oder an dem mit Linse fokussierten Lichtstrahl der LED liegt, ist unklar. Die Montage auf dem Wasserzähler und die Justage war jedenfalls in wenigen Minuten erledigt. Zum Schutz von Fremdlicht habe ich ein HT-Rohr mit Deckel über den Wasserzähler gestülpt. | ||
+ | |||
+ | Nach Lektüre des Artikels über [[: | ||
+ | - Einen USB-to-Serial-Adapter mit extra herausgeführtem Vcc-Pin aus der Schublade geholt | ||
+ | - diesen gleich zur Spannungsversorgung des STALL-Impulsgebers verwendet | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Die Idee ist wie bei der Schaltung aus [[: | ||
+ | |||
+ | < | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | }] | ||
+ | } | ||
+ | ]} | ||
+ | </ | ||
+ | |||
+ | {{: | ||
+ | |||
+ | So besonders gut scheint die Middleware mit den groben Impulsen (1 Impuls pro Liter) und dem oft stundenlangen Ruhen des Messwertes nicht klarzukommen; | ||
+ | |||
+ | {{: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | ===== Ansatz 4: 3D Druck Optik und OPT101 ===== | ||
+ | Ich hatte den Laser-Ansatz für Jahre in Gebrauch. Abgesehen von den Sicherheitsproblemen hatte ich nach ein paar Jahren Algen im Wasserzähler. | ||
+ | Daher die Idee auch mit grüner LED zu arbeiten. Da 3D-Drucker vorhanden habe ich eine Halterung für eine Linse entworfen, deren Fokuspunkt direkt auf dem Rad liegt. | ||
+ | https:// | ||
+ | Impulse werden mit einem OPT101 Chip (intgrierter Verstärker) abgenommen. | ||
+ | {{: |
hardware/channels/meters/water/wasserzaehler_ohne_s0.txt · Zuletzt geändert: 2024/04/23 18:03 von jau