Mein lang ersehnter Wunsch nach einer eigenen kleinen Wetterstation erfüllt sich nun langsam. Aber: kaufen kann ja jeder. Ich wollte selbst eine Zusammenstellen. Angefangen habe ich dann mich mit dem ESP32 und deren Derivate zu beschäftigen. Ist wirklich ein klasse Baustein für derartige Dinge. Dazu ist er noch sehr preiswert und es gibt eine Menge Sensoren zu kleinen Preisen auf dem Markt. Die Einarbeitung erfolgte mittels Fachzeitschrift und je länger ich mich mit dieser Hardware beschäftige, desto mehr Dinge fallen mir ein, die noch umgesetzt werden könnten.
Eine kleine Station, die mir Temperatur, Luftfeuchte und Luftdruck meldet, bildete den Anfang der Wetterstation. Diese wurde mit einem ESP32 und dem Multisensor BME280 realisiert, wobei als Firmware Tasmota aufgespielt wurde. Das ganze lies sich hervorragend in mein Home Assistant integrieren und dieses Teil läuft jetzt seit Dezember 2024 ohne Probleme. Deshalb war für mich der Zeitpunkt der Erweiterung gekommen. Windmessung und Regenmengen interessieren mich. Möchte mir gerne ein eigenes Bild über die Änderungen des Klimas machen...
Also schaute ich mich auf dem Markt um, was es so als Windmesser gibt. Ich fand ein Anemometer, welches sich direkt an den analogen Eingang eines ESP32-Moduls anschließen lässt und auch nur zwei Drähte für den Anschluss hatte. Der Preis war mit rund 30 € auch vertretbar. Da gibt es ganz andere Teile... Die Bestellung wurde aufgegeben und ich konnte ein paar Tage später das Teil in den Händen halten. Gut, auf den Bildern sah das Teil wesentlich kleiner aus aber in Wirklichkeit war es doch recht "wuchtig". Egal. Flugs einen ESP32-Wroom mit Entwicklerboard zusammengesucht und das Teil angeschlossen. Leider gibt es dafür keine halbwegs fertige Tasmota-Software, so dass ich meine Entwicklungsumgegbung anwerfen musste. Bin in diesem Zusammenhang auch von der Arduino-Entwickler-IDE auf die von Visual Studio Code angepriesene PlattformIO-Umgebung umgestiegen. Ich finde diese neue Umgebung intuitiver und sie kommt einem C-Programmierer unter Linux eher entgegen. Vor allem, Visual Studio Code gibt es sowohl für Linux als auch für Windows und auf beiden Rechnertypen war es schon installiert. Die Erweiterung aus dem Store von Visual Studio ist schnell installiert und schon kann es losgehen.
Der Versuchsaufbau war schnell zusammengesteckt und ein Grundgerüst an Software zur Auslesung der Werte installiert. Es kamen Werte an, jetzt musste nur noch kalibirert werden. Der Anleitung zufolge sollte man mit einem Auto 50 km/h fahren und dann den Wert des Anemometers ermitteln. Anschließend galt es, die Werte zu mappen (map-Funktion von Arduino). Das war auch relativ schnell erledigt. Das Anemometer wurde an meinem Schuppen installiert und in den Probebetrieb geschickt.
Ernüchternd muss ich sagen - der Test fiel negativ aus. Nicht, dass das System grundsätzlich keine Daten lieferte - sie waren schlichtweg falsch bzw. unbrauchbar, weil das Anemometer einfach zu schwergängig ist und die Löffel zu klein. Selbst bei relativ starkem Wind wollte sich das Ding kaum drehen. Was sich nicht dreht, liefert auch keine Messwerte. Habe das Anemometer dann an verschiedenen Stellen des Schuppens und des Carports in den direkten "Windkanal" gehängt aber das Ergebnis blieb dasselbe. Lediglich der zusätzlich ins Gehäuse integrierte Bewegungssensor verrichtete korrekt sein Arbeit. Eine Lösung musste her.
Auf meiner Terrasse habe ich Markisen mit Somfy-Steuerung im Einsatz. Auf der großen Markise ist vom Hersteller ein Anememoter verbaut, der die Markise automatisch bei zu starkem Wind einfährt. Das Teil ist nicht nur relativ kompakt im Gegensatz zu meiner käuflichen Erwerbung, nein, es dreht sich auch bei geringem Wind :-) Also habe ich mal recherchiert, ob es von Somfy so ein Teil nicht auch separat nachzukaufen gibt. Ich wurde fündig im Somfy Windmesser f. SM2000 / SM2400 (9127932). Recherchen im Internet brachten zutage, dass dieses Gerät ebenfalls nur über zwei Leitungen verfügt und intern über einen Reed-Kontakt Drehbewegungen meldet. Also statt analoger Werte eben digital. Da das Anemometer ebenfalls recht preisgünstig zu erwerben ist (um die 30 €), habe ich versuchsweise eines bestellt, welches auch ein paar Tage später durch den Postboten übergeben wurde.
Ich habe dann die bisherige Anlage wieder auf den Entwicklungstisch gehievt und das analoge Anemometer entfernt. Der ESP32 verfügt ja über diverse Eingänge - ein freier GPIO war schnell gefunden. Messungen mit einem Durchgangsprüfer ergaben, dass das Somfy-Anemometer pro Umdrehung 4 Ticks liefert. Damit konnte man doch schon etwas anfangen.
Mein Problem war, dass normalerweise der Arduino sein Hauptteil in Form einer Schleife durchführt. Das ist jedoch für dieses Anemometer nicht ideal, da nicht garantiert werden kann, dass Ticks womöglich verlorengehen. Das ganze musste also interrupt-basiert erfolgen. Neuland für mich aber nicht unlösbar. Die Arduiono-Dokumentation im Zusammenhang mit dem ESP32 zeigt auf, wie man einen digitalen Eingang interruptgesteuert auslesen kann. Das klappte auch hervorragend. Also die Ticks konnte ich zeitgenau erfassen. Doch wie wandelt man die Ticks nun in die Windgeschwindigkeit um?
Eine sofortige Ausgabe der Werte pro Interrupt scheidet aus. Mit einem Tick alleine kann man eigentlich nichts anfangen. Man braucht als Grundlage die Anzahl der Ticks pro Zeiteinheit. Ich legte als Zeiteinheit die Sekunde fest, also wieviele Ticks meldet dar Windmesser pro Sekunde. Aus dieser Angabe kann man dann leicht einen Messwert per Mathematik herleiten. Die Interruptroutine wurde umgeschrieben und legt die Anzahl der Ticks pro Sekunde innerhalb einer Minute in einem Array ab. Nach dem Ablauf einer Minute werden die Ticks pro Sekunde verarbeitet. Der Wind bläst zu jedem Moment unterschiedlich stark. Den tatsächlichen Momentwert auszugeben macht relativ wenig Sinn. Deshalb ermittele ich einen Durchschnittswert pro Minute. Dazu werden alle ermittelten Ticks pro Minute zusammengezählt und durch 60 geteilt. Das Ergebnis ist somit die durchschnittliche Anzahl Ticks pro Sekunde in der letzten Minute.
durchschnittTicks = Summe aller Ticks der letzten Minute / 60
Als Messgröße zur Ausgabe soll die Windgeschwindigkeit in m/s ausgegeben werden. Dazu stellte ich folgende Berechnung an:
Das Anemometer hat einen Radius von 6 cm, also 0,06 m. Damit ergibt sich ein Umfang (oder Weg) von
weg = 2 * Π * 0,06 = 0,376991112 m
Also ist diese Angabe unser Umrechnungsfaktor. Pro Sekunde werden rund 0.377 m bei 4 Ticks gemeldet. Daraus ergibt sich
weg pro Tick = 0,376991112 / 4 = 0,094247778 m pro Tick
Da wir die durchschnittliche Anzahl Ticks pro Sekunde schon ermittelt haben, kann man nun eine Geschwindigkeit zusammenbasteln:
windgeschwindigkeit = Anzahl Ticks pro Sekunde * Faktor pro Tick = Wind in m/s
Bei der Ermittlung der Durschnittsgeschwindigkeit werden gleichzeitig noch die minimal und die maximal ermittelten Ticks pro Sekunde festgehalten und ebenfalls in m/s umgerechnet.
Um das alles jetzt auch der Homeautomation zur Verfügung zu stellen, wurden noch Wege zur Übermittlung einprogrammiert. Das ständige Pollen ist gerade für Home Assistant nicht gerade förderlich. Die Technik hat dafür das MQTT-Protokoll ins Leben gerufen und Home Assistant bedient sich ausgiebig dieser Schnittstelle. Also flugs noch einen MQTT-Client in die Firmware eingefügt und Nach der Ermittlung die Werte per MQTT übermittelt.
Falls man zwischendurch noch die Werte abfragen will und gerade keinen MQTT-Client zur Hand hat, habe ich ebenfalls einen Webserver integriert, der die letzten Ergebnisse per HTTP im JSON-Format liefert. Voilá, das wars.
Ich habe den neuen Windmesser wieder am Schuppen installiert. Er dreht sich ;-)