Wetter Windgeschwindigkeit ermitteln

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo,

    ich habe mit mittels der eizelnen Tutorials eine kleine Wetterstation gebaut, welche auch die Windgeschwindigkeit ermittelt. Dazu setze ich einen Windsensor von Eltako ein. Link

    Bei der Programmierung wollte ich gern auf eine stromsparende Variante setzen, d.h. einen Event Handler, welcher mir sagt wann das Ding geschalten hat. Nun musste ich jedoch feststellen, dass im Gegensatz zu den Tutorials, welche den Zustand des Reedkontaktes permanent abfragen Unterschiede in der Windgeschwindigkeit entstehen.

    Beim einen Programm messe ich den Abstand zwischen 2 Events und beim anderen wird über permanante Abfrage des Zustandes versucht die Frequenz zu ermitteln.

    Aus dem Bauch heraus, hätte ich die Variante mit den Events als die bessere empfunden. Da ich bei Windstille nicht permanent abfragen muss und somit der Raspi eigentlich nicht zu tun hat.

    Die Implementierung habe ich in Python gemacht.

    Was meint Ihr?

    VG

  • Wenn du verschiedene Ergebnisse bekommst, stimmt wohl was mit deinen Programmen nicht. Wenn du nur zwei Signale erfasst, musst dein Programm schnell genug reagieren, um die Frequenz genau genug zu bestimmen. Außerdem werden die Messwerte stark schwanken. Berechne besser gleitende Durchschnitte, das wird passender. Ich würde es auf jeden Fall mit Interrupts machen und nicht mit permanenter Abfrage.
    Energiesparen? Meinst du, es macht einen wesentlichen Unterschied, ob du bei Windstille einen GPIO abfragst oder nicht? Wenn du da wirklich was erreichen willst, dann nimm lieber einen Microcontroller als einen Pi.

    Oh, man kann hier unliebsame Nutzer blockieren. Wie praktisch!

  • Dieser Code fragt den Pin eine Sekunde lang ab und ermittelt in der Folge die Geschwindigkeit um danach das gleiche wieder anzufangen. Der Prozessor ist dann zu 8% ausgelastet.

    Alternativ habe ich mir gedacht, dass die Auswertung von Event besser wäre, also in der folgenden Form. Das gefüllte Array wird im Minuten Rythmus ausgelesen und dann die in eine DB geschrieben.


    Automatisch zusammengefügt:
    Wie gesagt läuft das eine Script permannet und fragt den Zustand aktiv ab, das andere wartet auf Events, was bei Windstille keine Last auf dem Pi erzeugen sollte.


    Wenn Microcontroller auf welchen Microcontroller sollte man setzen? Die Anwendung arbeitet autonom und schreibt in eine Remote DB(habe ich erwähnt?)

    VG

    Einmal editiert, zuletzt von fichtlundsachs (13. Juli 2017 um 22:09)

  • Nur ein Teil aus einer Klasse heraus zu schneiden und uns dann zu zeigen, bringt recht wenig. Wenn dann bitte die gesamte Klasse zeigen.
    Auch der 2. Codeschnippsel scheint unvollständig zu sein - da fehlt ebenfalls etwas.

    Und bitte auf korrekte Einrückungen achten! FAQ => Nützliche Links / Linksammlung => HowTo: CODE / PHP Code im Forum posten

    Neben bei erwähnt laufen _beide_ Scripts permanent, der Unterschied ist nur dass das zweite auf Interrupt basiert und die Callback in einem separaten Thread agiert, das erste Script hingegen "Polling" nutzt und somit blockiert.

    Wenn du nicht gerade Tornados o.ä. vermessen willst _muss_ es kein Microcontroller sein - es wäre nur eine Alternative. Sowas ist ansonsten auch mit dem Pi möglich. Ich werfe aber auch mal Begriffe in den Raum wie ESP8266 oder PyBoard, womit sowas auch ginge...

    Deine Lösung basiert soweit ich das richtig verstanden habe auf Reed-Switch.
    Es gibt Windsensoren die intern mehrere Reedswitches verbaut haben, wie du zum Beispiel hier sehen kannst: http://www.philpot.me/weatherinsider.html
    Wie viele sind in deinem?
    Der Windsensor in dem Beispiel rotiert ein mal pro Sekunde bei einer Windgeschwindigkeit von 2.4 km/h ... Also eine vollständige Umdrehung. Wenn du es möglichst genau haben willst müsstest du alle 4 Reedswitches behandeln, wenn das aber nicht allzu wichtig ist nur einen.
    Dann brauchst du eigentlich nur festlegen wie viele "Zählungen" stattfinden sollen bevor die "Geschwindigkeit" berechnet werden soll. Beispielsweise erst nach 10 Interrupt Events. Zusätzlich natürlich auch Start- und Endzeit.
    Das wiederum bedeutet dass in der Callback nur gezählt werden brauch und auch nur sollte, denn um so mehr in der Callback gemacht wird um so träger ist diese - jede Abhandlung in der Callback Funktion blockiert diese und somit könnte ein erneutes Event derweil verpasst werden. Ich empfehle dir daher ein Script auf Basis von FAQ => Nützliche Links / Linksammlung => Interrupt => #8 , sprich, in der Callback den Event nur in ein Queue einzufügen, den Rest im Script selbst abhandeln, denn dann wird die Callback nie blockiert, ein Queue ist _extrem_ schnell.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!