Regenmesser zu Ethernet oder USB - mein erstes Arduino-Projekt?

Jul 18, 2019 Last reply: 7 years ago 119 Replies

Also mein Regenzähler sendet "Beim Nächsten Ton waren es 30 Impulse" an die Station. Bzw. er sendet seine Seriennummer. Quasi UDP.

Falk D.

Hallo,

Am 21.07.19 um 11:16 schrieb Marc Haber:

Warum überhaupt Zeitstempeln? Ich muss doch nur Impulse zählen und die BlackBox liefert mir auf Anfrage die Impulse bzw die umgerechnete Regenmenge zurück?

Also ich würde da mit nicht mehr als 100 mm Niederschlag ausgehen. Das wäre für die meisten mitteleuropäischen Messstationen mehr als ein Zehntel des Jahresniederschlags. Extremere Extremregen mit einem Tagesniederschlag als ein Zehntel des Jahresniederschlages sollte es wohl kaum gegeben haben? Sehen wir mal beim DWD nach? Lassen wir uns Google helfen?

"Maximale Niederschlagsmenge Starkregen" Deutschland site:dwd.de

Hier zum verlinken die HTML-Seite mit Link aufs relevante PDF:

Einleger Starkniederschläge in Deutschland Datum 02.09.2016 Zusatzbericht Einleger Starkniederschläge in Deutschland (PDF, 667KB, Datei ist nicht barrierefrei.)

formatting link

Da gibt es eine Tabelle auf Seite 2:

Dauerstufe 15 min würde alle 100 Jahre mal 45 mm geben. Das sieht gut aus. Mit meinen 100 mm war ich mal wieder sehr weit oben, aber ich bin nun mal etwas abgehoben. Hab ich schon mal erzählt, dass die Seminarräume des Instituts für Meteorologie und Klimatologie im Karlsruhe im obersten, den 13. Stock, des Physikhochhaus sind?

Das sollte reichen. Selbst bei einem Ausfall mit Reboot würden da nur wenige Daten verloren gehen. Und jetzt nehme Dir noch zum Sichern ins EEPROM einen Ringbuffer und dann gehen nicht mal die Tagesmengen so richtig kaputt.

---%---%---%---%---%---%---%---%---%---%---%---%---%---%---%---

Da muss man sich nur Gedanken mit den Ein-/Aus-Vorgang machen und wie man das Ende des RingBuffers bei Neustart erkennt? Hat da jemand eine gute Idee? Das erste Bit alternieren und nur die restlichen Bit für den Zähler nehmen?

Neustart: Suchen nach Datensatzende und dort weiter machen.

int iPos = ThisSearch() Suche nach Datensatzende: Erstes Bit im folgenden Datensatz ist ungleich oder aber alle Ersten Bit haben das gleiche Vorzeichen, dann war der letzte Wert das Datensatzende.

ThisWrite(iCounter,iPos) Schreiben: Erstes Bit togglen und Zählerstand dran hängen.

int iCounter = ThisRead(iPos) Lesen: Differenz zwischen aktuellem und letzten Zählerstand ist die Zahl der Klicks im Intervall.

int iCounter = GetCounter() Datenholen: Zählerstand auslesen ... Der liegt im RAM und wurde durch eine ISR hochgezählt.

Dazu definiert man noch FIRSTPOS und LASTPOS des Ringbuffer und damit sollte man durchkommen?

main(){ iPos = ThisSearch(); ThisCount = ThisRead(iPos);

Zeitschleife ggf in oder über Timerinterrupt oder RTC? { LastCount = ThisCount; ThisCount = GetCounter(); if ( ThisCount > LastCount ); { /* Schreiben bei Bedarf */ /* Zaehlerbehandlung */ iPos++; if (iPos > LASTPOS) { iPos = FIRSTPOS; } /* der eigentliche Schreibvorgang */ WriteThis(iCounter,iPos); } /* Ende Schreiben */ } /* Ende Zeitschleife */ } /* Ende main() */

Lasse da mal 500 Plätzchen im Ringbuffer und Du hast da selbst bei extremen Regenfällen fast einen ganzen Tag im Puffer. Jetzt kommt nur noch das Problem mit dem Überlauf bzw. Zurücksetzen?

Den Server im Keller kannst Du doch auch nach Oben setzen? Also ein hohes Regal in etwa 1m50 Höhe? Da würde ich auch Router ggf. vorhandene NAS und USV hinhängen. Und die Steckdosen erst recht!

MfG

Uwe Borchert

Hallo,

Am 20.07.19 um 21:02 schrieb Gerrit Heitsch:

Und das wiederum legt den Gedanken an einen Ringbuffer nahe! Man muss nur im Ringbuffer die Möglichkeit haben das Ende der Datenreihe zu finden. Aber dazu schrubbte ich schon was mit einem geflippten Bit am Anfang.

---%---%---%---%---%---%---%---%---%---%---%---%---%---%---%---

Neustart: Suchen nach Datensatzende und dort weiter machen.

int iPos = ThisSearch() Suche nach Datensatzende: Erstes Bit im folgenden Datensatz ist ungleich oder aber alle Ersten Bit haben das gleiche Vorzeichen, dann war der letzte Wert das Datensatzende.

ThisWrite(iCounter,iPos) Schreiben: Erstes Bit togglen und Zählerstand dran hängen.

int iCounter = ThisRead(iPos) Lesen: Differenz zwischen aktuellem und letzten Zählerstand ist die Zahl der Klicks im Intervall.

int iCounter = GetCounter() Datenholen: Zählerstand auslesen ... Der liegt im RAM und wurde durch eine ISR hochgezählt.

Dazu definiert man noch FIRSTPOS und LASTPOS des Ringbuffer und damit sollte man durchkommen?

main(){ iPos = ThisSearch(); ThisCount = ThisRead(iPos);

Zeitschleife ggf in oder über Timerinterrupt oder RTC? { LastCount = ThisCount; ThisCount = GetCounter(); if ( ThisCount > LastCount ); { /* Schreiben bei Bedarf */ /* Zaehlerbehandlung */ iPos++; if (iPos > LASTPOS) { iPos = FIRSTPOS; } /* der eigentliche Schreibvorgang */ WriteThis(iCounter,iPos); } /* Ende Schreiben */ } /* Ende Zeitschleife */ } /* Ende main() */

Lasse da mal 500 Plätzchen im Ringbuffer und Du hast da selbst bei extremen Regenfällen fast einen ganzen Tag im Puffer. Jetzt kommt nur noch das Problem mit dem Überlauf bzw. Zurücksetzen?

---%---%---%---%---%---%---%---%---%---%---%---%---%---%---%---

Jetzt fehlt nur noch die passende Auslegung. Ich ging von einem Intervall von 1 min aus. 1920 gingen in 8 Minuten in Füssen mal 128 mm runter. Ok, da würde ich bei einer reinen Hobbystation durchaus mal einen Messfehler verzeihen.

Ich würde da alle 60 s abfragen und in den Ringbuffer (im EEPROM) schreiben. Jaja, ein Tag hat 1440 Minuten, aber es regnet selten einen ganzen Tag durch und die über 8 h im Ringbuffer sollten fast immer für über einen Tag reichen. Bei Schreiben nach Bedarf und geschätzten maximal 600 Regenstunden im Jahr (etwas unter 200 Regentagen mit irgendwas um die 3 Regenstunden) überschreibe ich eine Zelle etwa 70 bis 80 mal jedes Jahr.

MfG

Uwe Borchert

Am 20.07.19 um 15:42 schrieb Rainer Knaepper:

Sinnvoll erscheint mir eine Größenordnung von 10s -60s wenn man Spitzenwerte erfassen oder eine Markisensteuerung beeinflussen möchte.

Wenn man die Übertragung niederschlagsabhängig macht ist es sinnvoll. Warum soll ich wenn es die ganze Woche nicht regnet im Sekundentakt loggen?

Egal wie genau die laufen - ich muss sicherstellen dass sie läuft und die gesetzte Zeit auch halbwegs korrekt ist. Bringt keinen Mehrwert wenn der Sensor nicht auch unabhängig vom Server betrieben wird und eventuell selbst eine Messauswertung / Anzeige hat.

Wichtig ist jeweils das Zeitintervall über das die Messung erfolgt ist und ein unterbrechungsfreies (d.h. lückenfreies) aufsummieren der Messwerte. Wenn ich garantieren kann dass der Host den Zeitstempel mit nur wenig Versatz zum aktuellen Intervallende aufprägt sehe ich da kein Problem. Vielleicht reden wir auch aneinander vorbei - Ich rede von Datum und Uhrzeit auf die man im Sensor verzichten kann. Der Zählertakt für das Zeitintervall muss natürlich schon hinreichend genau sein. Das sollte aber bei einem quarzgetakteten uC kein Thema sein.

Selbst das ist für die Niederschlagsmessung wahrscheinlich nicht das Problem. Die Datenverbindung stellt da je nach Typ die höheren Ansprüche an die Taktgenauigkeit.

Kommt auf die Anforderungen an. Wenn es nur um den Monatsniederschlag geht spielt es keine Rolle wie häufig und regelmässig ich den Wert über den Monat verteilt auslese. Ich muss nur sicherstellen dass ich halbwegs den jeweiligen Monatsanfang erwische.

In 512Byte bekommt man problemlos ein ganzes Jahr als 8Bit-Wert tagesgenau aufgelöst unter. Reicht auch zusätzlich noch für den letzten Tag stundengenau und die letzte Stunde minutengenau. Wobei man dann zumindest für letzters dann wieder auf die Schreibzyklenfestigkeit des EEPROMs schauen sollte.

Gerald

snipped-for-privacy@web.de (Gerald Oppen) am 21.07.19:

Genau das ist ja der Punkt, den ich angesprochen habe. Wenn der Host keine Ausfälle hat und stets wie gewünscht abfragen kann, braucht man keine Uhr im Arduino. Mein Gedanke zielte halt auf den Fall, daß der Host eben /nicht/ stets wie gewünscht verfügbar ist. Blätter mal zurück. Dann ist eine Uhr im Arduino nützlich.

Und mein nächster Gedanke war halt, daß man *gar* keinen Arduino benötigt, wenn der Host sowieso stets wie gewünscht verfügbar ist, sondern dann irgendeine Mimik am PC ausreicht, die den Reedkontakt abfragt. Früher(tm) hätte man was mit einem Optokoppler (wegen der galvanischen Trennung) und einem Druckerportpin oder der RS232 gemacht. Heute halt einen Übersetzer auf USB.

:-)

100ppm vs. 2-3ppm bei einer tauglichen RTC.

Bei mindestens täglicher Abfrage, also keine wochenlangen Pausen, ist der Arduino mit Quarz genau genug, kein Thema.

Klar. Ich hatte aber das OP so verstanden, daß eben auch Zeiten und Mengen von einzelnen Wolkenbrüchen erfaßt werden können sollten. Kann mich latürnich geirrt haben.

Rainer

Wenn man nur bei Änderungen abspeichert, sind es (ausser im Regenwald) deutlich weniger Daten zu schreiben. Bei Verwendung eines Ringpuffers sollte auch regelmässiges Schreiben kein Problem sein. Bei 100k Zyklen und 128 Bytes EEPROM kann man alle Minute 1 Byte ändern und das ca. 24 Jahre lang; bei

2 Bytes _nur_ 12 Jahre lang.

oder die Baumschule ;-)

Für den Fall dass ich die Daten mal nicht zeitnah abhole wegen irgend einer Störung im nachgelagerten System.

Wenn wir mal die Oberlehrerheit stecken lassen und den Thread komplett lesen, dürte man sehen, dass der OP sich darüber durchaus Gedanken gemacht hatte und in seinem OP bereits eine Überschlagsrechnung gemacht hatte. Das könnte dann zum Schluß führen, es hätte sich um eine rhethorische Frage gehandelt.

Nein, hattest Du nicht. Sicher eine schöne Location.

Das Virtualisierungsnotebook ist auf Tastaturhöhe, das dürfte so 100 cm sein. Ein späterer "richtiger" Server wird weiter unten sein.

Ich weiß Deine Meinung zu schätzen, aber Rechenzentrumsbau ist _mein_ Geschäft.

Grüße Marc

Der "Host" läuft, blätter mal zurück, in Virtualisierung und steht 35 Meter Leitungslänge entfernt, da möchte ich mich nicht mit hineingereichtem USB-Geraffel abkämpfen muss.

Es gibt noch einen Banana Pi, dem trau ich nicht zu, das kurze "Klick" des in der Mitte des Wippenweges montierten Reedkontakts sauber abzugreifen. Da müsste man also noch Elektronik einbauen, die den Kontakt entweder latcht oder jedes Klick in eine Flanke ummünzt. Dann lieber einen Arduino.

Ich hoffe, dass ich die 35 Meter Leitungsweg auf der analogen Seite des Arduino unterbringen kann. Wenn das nicht funktioniert, muss der Arduino halt raus ins Gartenhaus.

"Das Gewitter heute nacht waren nur läppische 3 l/m²"

Grüße Marc

Wenn du durch den Reedkontakt einen kleinen Strom von ca. 5 mA in die LED eines Optokoppler fliessen lässt, sollten die 35 Meter kein Problem sein.

mh+ snipped-for-privacy@zugschl.us (Marc Haber) am 23.07.19:

Blätter mal zurück. /Mein/ Ansatz war, den Arduino das Logging komplett incl. Zeiterfassung erledigen zu lassen und den Host nur die fertigen Daten abholen zu lassen. Komplett asynchron. Das wurde mir als überflüssiger Aufwand ausgelegt.

4-20mA, galvanische Trennung per Optokoppler. Kann man mit etwa sechs Bauteilen plus Steckernetzteil machen. Wenn du garantieren kannst, daß der Reedkontakt niemals klemmt (bzw. die Wippe über dem Kontakt hängenbleibt): 0-20mA und Batterie. (wenn der mal klemmt, würde halt die Batterie zügig leergelutscht). 4-20 hätte den Vorteil, daß du eine Leitungsunterbrechung detektieren könntest, würde aber, je nach Auswertung, entweder einen analogen Eingang oder zwei digitale erfordern. Für deine Anwendung wäre aber wohl 0-20 an einem digitalen Pin hinreichend.

Na also.

Rainer

Am 18.07.2019 um 19:43 schrieb Marc Haber:

Eigentlich ist das natürlich völlig übertrieben, aber da der Kram praktisch nichts mehr kostet, spendiert ich in solchen Fällen (wenn Empfang da ist) ein China-GPS-Modul für wenige Euro und muß mich um das Thema Uhrzeit nicht mehr kümmern.

Im konkreten Fall würde ich einen WEMOS D1 MINI und einen NEO-6M Klon vom freundlichen Chinesen verbauen und das Ganze per WLAN anbinden....

Und warum den (Reed)Kontakt des Regenmessers nicht ins Haus verlegen? so. Rainer...

Für Sicherheitsfanatiker wg. mir zwischen 4 und 20mA Schleifenstrom über verdrillte DA umschaltend? Wenn man gaaaaanz sicher gehen will, dann Reed -> Trani -> Haus -> Logik mit Erkennung von Linienstrom... Sowas hab ich schon für KKW und im Walzwerk mit 800m Kabellänge gemacht.

Denk dran, das (Reed)Kontakte übelst prellen. Bei Reed durchaus im kHz Bereich. Dagegen helfen Quecksilber benetzte Kontakte oder gleich ein (IR) Optoklopper-Lichtschranke mit Fähnchen an der Messwippe. Kann man auch aus alten Floppy Laufwerken recyclen. Und keinen Ärger mehr mit verschweissenden Reed (Kabel L und C lassen grüssen)

Reed sind nicht immer seeligmachend und schon garnicht, wenn man die möglichen Schwachstellen bei Kontakten beachtet.

Aber fürn Regenmesser würde ich mir keinen Kopp machen. Eher um Bastelfreudige Piepmätze (Papagei) oder Insekten (Schlupfwespen, Spinnen), zumindest hier in PY. Keas in AUS sollen auch üble Saboteure sein :)

Saludos (an alle Vernünftigen, Rest sh. sig) Wolfgang

So gehts auch ohne viel Bastelei, allerdings sollten die Besonderheiten von Reed beachtet werden.

Saludos (an alle Vernünftigen, Rest sh. sig) Wolfgang

Am 23.07.2019 um 14:16 schrieb Wolfgang Allinger:

Ich dachte, Basteln und dabei Lernen wäre der Sinn der Veranstaltung. Andernfalls könnte man sich einfach ein fertiges Gerät kaufen...

Hallo Marc,

Du schriebst am Tue, 23 Jul 2019 08:05:09 +0200:

Hat der keine interruptfähigen GPIOs wie die Raspberrys?

Warum mit einem Pull-Up-Widerstand zufrieden sein, wenn man auch gleich einen ganzen Mirocontroller mitsamt Peripherie einsetzen kann.

Da gab's ja ein paar Vorschläge -

- die alle auch ohne Arduino mit Deiner Banane funktionieren dürften.

Gerald Oppen schrieb:

Normalerweise justiert er, d.h. dreht wild an Trimmern rum, bis der gewünschte[sic] Wert angezeigt wird. Fortgeschrittene peilen den wahren Wert an.

Kalibrieren ist wenn man ein Normal anschliesst, und dann notiert, was das Gerät anzeigt, oder was es zuviel anzeigt, oder zuwenig, oder der Faktor zwischen was auch immer. Anschliessend geht verloren, ob man das Vorzeichen jetzt vergessen hatte oder nicht, verwechselt Zähler mit Nenner, Korrektur mit Korrektion, dreht zur Sicherheit das Vorzeichen nochmals zuviel um und ist beim nächsten Einsatz so verwirrt, dass man diesen Abschnitt immer und immer wieder repetiert, selbstverständlich mit dem Vorsatz, dieses mal wirklich alles ganz genau aufzuschreiben.

Nicht von mir, ich werde das genau so machen. Ich habe mir nur nicht weiter dazu geäußert, um diese Diskussion nicht weiter anzuheizen. Software und Protokolle kann ich nämlich, das mache ich seit 20 Jahren. In Elektronik bin ich nicht ansatzweise so firm.

Dann wäre der Optokoppler im Haus und die "lange" Strecke auf der 'äußeren' Seite?

Garantieren kann ich das natürlich nicht, aber aufgrund der Konstruktion dürfte das ziemlich unwahrscheinlich sein.

Wenn ich den auswertenden Kleincomputer und die Schleife über den Kontakt aus demselben Netzteil versorge, ist die galvanische Trennung hin und ich kann mir den Optokoppler sparen, richtig?

Grüße Marc

Ich habe keinen Schimmer und wüsste auch nicht wie ich die abfragen müsste.

Grüße Marc

Ein fertiges Gerät mit Ethernet und Webschnittstelle? Wo gibt's sowas?

Grüße Marc

--

-------------------------------------- !! No courtesy copies, please !! ----- Marc Haber | " Questions are the | Mailadresse im Header Mannheim, Germany | Beginning of Wisdom " | Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 72739834

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required