Anemometer Eigenbau für Arduino Wetterstation

Ermutig durch das recht simple zu bauende und zu programmierende Min/Max Thermometer, habe ich mich entschlossen ein größeres Projekt umzusetzen. Ziel wird sein, eine eigene kleine Wetterstation mit einer 24/7 Datenerfassung zu betreiben. Dabei sollen Luftdruck, Temperatur, relative Luftfeuchte und wenn möglich Windgeschwindigkeit und Windrichtung erfasst werden. Für die Windmessung gibt er fertige Teile, die allerdings zur Zeit nirgendwo lieferbar sind, daher habe ich mir kurzerhand ein eigenes Anemometer (Windgeschwindigkeit) gebaut.

Dosier-Löffel als WindschaufelBei diversen Händlern gibt es ein Set für ca. 65 Euro mit einem Regensensor, einem Anemometer und einem Sensor für die Windrichtung. Leider ist dieses Set aktuell nicht mal in den USA (Herstellerland) zu bekommen. Optisch scheinen das die gleichen Sensoren zu sein, die zur Funkwetterstation PCE FWS 20 gehören. Aber für die ersten Erfahrungen reicht sicher auch ein Eigenbau.

Bauteile

  • Arduino-Ethernet.
  • Das DFrobot LCD Shield
  • Ein einfacher, kleiner Reed-Kontakt plus passendem Mini-Magneten
  • 3 Plastiklöffel / Dosierlöffel als Windschaufeln
  • Etwas Holz für die Rahmenkonstruktion
  • Ein Aluminium Rundstab (5mm) aus dem Baumarkt
  • Ein 10kOhm Widerstand und ein 100nF Kondensator

Das LCD Shield ist prinzipiell nicht notwendig und wird später in der Wetterstation auch nicht verwendet. Für die ersten Tests, ist es aber recht hilfreich, eine Anzeige vor Ort zu haben und nicht auf serielle Debugausgaben angewiesen zu sein.

Mechanischer Aufbau

Unser Anemometer ist ein sogenanntes Schalensternanemometer, die am meisten verbreitete Bauform. Da ich nur drei gleichartige „Dosierlöffel“ zur Verfügung habe, bekommt unser Windrad eben drei Arme. Mittels eines „Kreisbohrers“ schneide ich mir aus einem Brett zwei Holzscheiben von ca. 4cm Durchmesser. Die eine Scheibe wird an drei Stellen im 120° Winkel ca 1cm eingesägt, so das die Stiele der Löffel in den Schlitz passen. Zu meinem Glück passt das Mittelloch der Scheiben (das entsteht zwangsläufig beim Bohren mit dem Kreisbohrer) genau und straff auf meine 5mm Alu-Welle.
Reedkontakt und Auslösemagnet in der HolzscheibeAus einer Holzleiste schneide ich 4 Stücke, ein langes, ein mittleres und zwei kurze Stück, die zu einem Träger-Rahmen verschraubt werden. Die kurzen Stücke dienen dabei als Führung für die Welle des Windrades, daher bekommen beide noch ein Loch, das etwas größer ist als der Durchmesser der Welle, damit sich diese frei drehen kann. Zu groß sollte der Unterschied aber nicht sein, da die Welle sonst zu viel Spiel hat. Auf der untersten Schiene wird kein Loch gebohrt, sondern nur eine kleine Vertiefung angebracht, damit die Welle nicht wegläuft. Die Welle selbst wird am unteren Ende rund gefeilt, damit sie sich mit wenig Reibung drehen kann.
Die zweite Holzscheibe bekommt ein kleines (nicht durchgehendes) Loch, in das ich den kleinen, runden Mageneten einsetze. Da der Magnet unten in der Scheibe sitzt, markiert ein Punkt die Stelle auf der Oberseite. In eine Nut auf der Bodenleiste wird nun der Reedkontakt geklebt. Bei jeder Umdrehung schließt nun der verbeikommende Magnet kurz den magnetischen Schalter und erzeugt somit einen Zählimpuls für unseren Mikrocontroller. Um keine stöhrenden Drähte zu haben, gehen die Anschlüsse des Reedkontakts durch zwei kleine Löcher auf die Unterseite der Bodenleiste.

Elektrischer Aufbau

Die Schaltung ist relativ simple und entspricht bis auf den Kondensator dem Einführungsbeispiel für Taster / Schalter am Arduino Board. Mittels eines Widerstandes (10kOhm) wird der digitale Eingang dauerhaft gegen Masse (GND) geschaltet. Durch diesen „Pull-Down-Widerstand“ sorgen wir dafür, das ohne Schaltsignal der Eingang definitiv ein LOW Signal erhält. Erst wenn der Schalter geschlossen wird, wird der Eingang auf HIGH (+5V) geschaltet. Somit gibt es immer ein definiertes Signal.
Leider mußte ich bei meinen ersten Tests feststellen, das mein Schalter „prellt„. Das bedeutet, das der Schalter bei einem einzigen Schaltvorgang (Magnet „überfliegt“ den Schalter) aufgrund der Mechanik mehrere Schaltsignale erzeugt. Durch die Art und Weise der Messung (siehe unten) kann ich das nur schwer durch die Software abfangen. Die einfachste, wenn auch nicht beste Lösung ist in diesem Fall der im Schaltbild zu sehende Kondensator. Er bildet mit dem Widerstand ein sogenanntes RC-Glied, das durch die Zeit die der Kondensator bei einem Schaltvorgang zum Laden und Entladen benötigt, die zusätzlichen Schaltsignale abfängt. Danke an die Jungs von cc-robotik.de für ihren Beitrag zum „Enprellen ohne FlipFlop

Messen

Messergebnisse auf dem LCDAuch beim Messen der Zählimpulse habe ich diesmal Neuland betreten. Bisher war das Abfragen von digitalen oder analogen Eingängen recht einfach. An irgendeiner Stelle im Programm ruft man die Funktion digitalRead(int pin) oder analogRead(int pin) auf und wertet das Ergebnis aus. Bei einem Knopf den ein User drückt ist das auch kein Problem, der User wird den Knopf schon so lange drücken, bis etwas passiert. Leider verhält sich unser Windrad nicht so kooperativ. Der Zählimpus wird im Ernstfall nur einige Millisekunden (wenn überhaupt so lange) am digitalen Eingang anliegen. Wenn das Programm den Eingang nicht genau in diesem Moment abfragt, dann haben wir den Zählimpuls verpasst. Dreht sich aber das Windrad nur sehr langsam, kann es passieren, das wir in unserer Abfrageschleife erneut an dem Programmpunkt vorbei kommen und den gleichen Zählimpuls ein zweites Mal zählen. Ein einfaches Abfragen hilft also nicht weiter.
Unser kleines Arduino Multitalent hat aber auch dafür eine clevere Lösung parat – externe Interrupts. Das ist eine Unterbrechung des Programmablaufs durch ein externes Ereignis, bei dem plötzlich ein ganz anderes Stück Programm ausgeführt wird, die sogenannte „Interrupt Service Routine“. Ist diese abgearbeitet, macht das Programm an der alten Stelle weiter. Da eine solche Unterbrechung aber einige zusätzliche Auswirkungen auf unser System hat, muß diese immer so kurz wie möglich gehalten werden. Der Arduino Uno, bzw. alle gleichartigen Arduinos haben zwei digitale Eingänge, die solche Interrupts auslösen können – Pin 2 und Pin 3. Unser Anemometer wird an Pin 3 angeschlossen, wie im Schaltplan angegeben und als digitaler Eingang definiert. Jeder Wilde VerdrahtungSchaltvorgang am Reedkontakt löst nun im Programm einen Interrupt aus, der dann einfach den Umdrehungszähler um eins erhöht. Um Messfehler zu minimieren, messe ich 3 Sekunden lang und teile dann die gezählten Umdrehungen durch 3. Vor jeder Messung wird der Zähler wieder auf Null gesetzt. Für die Wetterstation wird die Messdauer sicher eher 10 oder 20 Sekunden betragen, aber da ich ja nach dem Messen das Display aktualisieren will, sind 3 Sekunden ein guter Kompromiss. Die Umrechung auf die eigentliche Windgeschwindigkeit erfolgt in der Annahme, das die Drehzahl proportional zur Windgeschwindigkeit ist. Das wird in unserem Fall nicht wirklich so sein, aber als Näherungswert ist das erstmal OK. Das Datenblatt zum „Kauf-Anemometer“ gibt einen Umrechungsfaktor von 2.4 an. Also eine Umdrehung pro Sekunde entspricht ca. 2.4 km/h Windgeschwindigkeit. Ob das bei unserem Windrad auch so ist, kann ich nicht sagen, aber die Werte sehen erstmal halbwegs plausibel aus. Sollte ich das Teil für die Wetterstation verwenden, muss es natürlich geeicht werden.

Das Programm

Download: Anemometer_Counter
Das Programm besteht im wesentlichen aus drei Teilen.

  1. der Interrupt Service Routine, die den Umdrehungszähler hoch zählt
  2. das Aktivieren des Interrupts beim Start der Messung und das Deaktivieren am Ende der Messung
  3. das Auswerten und Anzeigen der ermittelten Werte

Warum aktiviere ich den Interrupt nur während der Messung und warte dann mittels der Funktion „delay()“ den Messzeitraum ab?
Wird der Interrupt ausgelöst, wird die 16 Bit Variable windCounter um eins erhöht. Das ist aber unter Umständen in der eigentlichen Maschinensprache des ATMEL Prozessors nicht ein einzelner Befehl, sondern mehrere. Ebenso ist das Kopieren und Umwandeln der Zählwertes aus der Variable „windCounter“ bei der Auswertung eine Folge aus mehreren Befehlen. Da Interrupts immer Vorrang haben, könnte ein weiterer Zählimpuls während der Verarbeitung durch das Hauptprogramm den Wert plötzlich verändern. Um das zu vermeiden, aktiviere ich den Interrupt für Pin 3 nur direkt vor der Messung, warte dann den Messzeitraum ab und deaktiviere dann den Interupt wieder. Somit kann mir das weiterdrehende Windrad nicht mehr dazwischen funken. Das ist sicher keine schöne Lösung, da man Programme nicht blockierend schreiben sollte, zum Testen ist das aber zunächst OK.
Nach dem Messen wird dann noch die „theroretische“ Windgeschwindigkeit ermittelt und das Ganze auf dem Display ausgegeben.

Das Anemometer in Aktion

In Ermangelnung eines kräftigen Windhauchs, mußte zunächst unser Fön als Testwerkzeug herhalten. Die Stimme im Hintergrund, die da so lauthals nach Futter verlangt, ist meine Frau, da mein Versuchsaufbau den eigentlich fürs Abendbrot gedachte Küchentisch bevölkerte. Aber auch wenn ich Essen grundsätzlich für die wichtigste Malzeit des Tages halte :-), hat nerdiges Spielzeug IMMER Vorrang. Vor allem wenn es selbst gebaut ist und im Grunde sogar funktioniert.

Nachtrag vom April 2013:
Auf Nachfrage von Drachenflieger Andre habe ich den Sketch noch ein wenig erweitert. In einem Ringspeicher werden nun die Messwerte der letzten 15 Minuten gespeichert und der größte Wert (stärkste Böe) auf dem Display mit ausgegeben. Achtung, im Sketch wird ein anderes Display (Nokia 5110) verwendet.
Hier der geänderte Sketch: Anemometer_boen

3 Kommentare zu “Anemometer Eigenbau für Arduino Wetterstation

  1. Hallo Mario,
    ich habe dein Arduino Anemometer (Kauf-Anemometer) nachgebaut und freu mich dass es auf Anhieb geklappt hat.
    Ich bin Drachenflieger und brauch immer verlässliche Werte für die Windgeschwindigkeit an meinem Startplatz. Neben der momentanen Windgeschwindigkeit brauch ich noch zusätzlich die maximale Geschwindigkeit des Windes in den letzten 15 Minuten. Also eine Angabe zu den Wind-Böen. Kannst du mir dabei helfen, den Sketsch dahingehend zu erweitern?

    Liebe Grüße Andre

  2. Den Sketch auf Böen zu erweitern sollte kein Problem sein. Der interne Zeitzähler über „millis()“ sollte für diese Aufgabe genau genug sein.
    Spannend wird eher der Algorithmus. Einen Maximalwert zu speichern ist leicht. Dazu den Zeitpunkt wann der Wert gemessen wurde auch.
    Nun veraltet aber nach 15 Minuten dieser Wert und es werden ggf. plötzlich Werte die zwar kleiner sind, aber noch innerhalb des Zeitfensters liegen, wichtig.
    Wenn eine Messung pro Minute ausreicht, dann reicht es die letzen 15 Messungen zu speichern und davon immer den größten als Max-Wert zu verwenden.

  3. Hallo Mario

    Danke für den Sketch, er funktioniert wirklich einwandfrei. Ich habe ihn für meine Test-Wetterstation verwendet. Eine tolle Idee wäre es, wenn du mal ein Tutorial machst, wie man einen Windrichtungssensor bauen könnte!

    Liebe Grüße
    Alex

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>