Events

:

:

Elektronik | Funk | Software

Der Technik-Blog

  • Social Media

    YouTube

    Werbung:


    Neue Artikel


    Events

    • Keine zukünftigen Events vorhanden

    Der Technik-Blog

    Arduino Anemometer Wind Sensor

    Arduino Anemometer Schaltung

    Alex @ AEQ-WEB

    In einer einfachen Wetterstation wird die Windgeschwindigkeit über Anemometer ermittelt. Das Anemometer gibt bei jeder Umdrehung einen kurzen Impuls ab, der mit einem Mikrocontroller über einen bestimmten Zeitraum hochgezählt wird. Durch entsprechenden Umrechnungsfaktor kann die Windgeschwindigkeit gemessen werden. In diesem aktualisierten Beitrag geht es um das Auslesen eines Anemometers mit einem Arduino Uno. Die Software gibt über den Serial Monitor alle drei Sekunden die aktuell gemessene Windgeschwindigkeit aus.

    Nützliche Artikel zum Projekt:

    Wie funktionieren Interrupts am Arduino


    Innenleben vom Anemometer

    Das Anemometer besteht aus einem leicht drehbaren Löffelrad, was vom Wind ständig angetrieben wird. Auf der Achse befindet sich ein kleiner, immer mitdrehender Magnet. Als Sensor kommt ein Reed-Kontakt zum Einsatz, der beim vorbeifahren des Magneten jedes mal den Stromkreis kurz schließt. Dadurch wird bei jeder Umdrehung ein Impuls generiert. Der Vorteil dieser Variante ist der einfache Aufbau mit nur zwei Leitungen. Eine eigene Stromversorgung wird hier nicht benötigt. Ein Nachteil ist jedoch der mechanische Schalter (Reedkontakt). Dieser wird über die Jahre durch das ständige Schalten abgenützt, was nach einigen Jahren zu einem Ausfall oder zu Störungen an der Messung führen kann. Alternativ könne man das Anemometer auf eine optische Auswertung (Lichtschranke) oder induktive Auswertung (Hallsensor) umbauen. Mit einer entsprechenden elektronischen Schaltung können die mechanisch bedingten Messfehler vom Reedkontakt recht gut kompensiert werden.

    Anschluss an dem Mikrocontroller

    Da es sich im Grunde nur um einen Schalter handelt, wird das Anemometer ähnlich wie ein Taster angeschlossen. Der Widerstand von 10 Kiloohm fungiert hier als Pull-Down Widerstand, der den Pegel im offenen Stromkreis gegen Masse zieht. Einige Mikrocontroller haben im inneren einen Pull-Down Widerstand eingebaut, der über die Software aktiviert werden kann. In diesem Fall könnte der Widerstand weggelassen werden. Der Reed-Kontakt kann direkt über den 5 Volt Pin angeschlossen werden. Die gleiche Schaltung kann übrigens auch mit 3,3 Volt betrieben werden.

    Werbung:

    Der Kondensator

    Der Kondensator parallel zum Widerstand dient zum kurzzeitigen Abfangen der Spannung vom digitalen Eingang. Über die Jahre wird der Reed-Kontakt mechanisch abgenützt. Dreck und Metallstaub auf den Kontakten kann dazu führen, das der Kontakt beim schließen mehrere Impulse in Bruchteilen einer Millisekunde abgibt, bis der Magnet diesen erst richtig fest angezogen hat. Da der Mikrocontroller die Signale über Interrupts zählt, reagiert dieser auch extrem schnell auf einen Flankenwechsel. Die Folge wäre ein mehrfaches Zählen der Impulse, obwohl es tatsächlich nur einen gegeben hat. Dies würde in der Auswertung dann zu einer deutlich überhöhten Windgeschwindigkeit führen. Da der Kondensator immer eine kurze Zeit zum Aufladen braucht, nimmt dieser die Spannung kurz weg, bevor der digitale Pin die Spannung bekommt. Genau diese Zeit reicht aus, um solche mechanisch bedingten Messfehler zu kompensieren. Anschließend muss sich der Kondensator auch wieder recht schnell entladen, da dies sonst ebenfalls zu einem Messfehler führt. Eine Kapazität von 100 Nanofarad ist daher ein guter Kompromiss. Die folgende Grafik zeigt einen derartigen mechanischen Messfehler von einem alten Anemometer:

    Auswertung der Signale

    Der Mikrocontroller bekommt pro Umdrehung einen Impuls. Laut Datenblatt des Herstellers besagt dieses, dass eine Umdrehung pro Sekunde eine Windgeschwindigkeit von 2,4 km/h ergibt. Die Software müsste dazu einfach die Impulse, die genau in einer Sekunde kommen, addieren und mit dem Faktor 2,4 multiplizieren. Da eine Messzeit von einer Sekunde aber kaum brauchbare Ergebnisse liefert, sollte diese schon auf einige Sekunden erhöht werden. Für einen Test sind drei Sekunden ausreichend. Im produktiven Einsatz würde eine Messzeit von 30 Sekunden oder einer Minute schon sehr gute Ergebnisse bringen. Die Aufgabe der Software ist es daher, die einzelnen Impulse zu zählen und durch die Messzeit zu dividieren. Anschließend muss das Ergebnis um den Faktor 2,4 Multipliziert werden. Das Resultat ist die Windgeschwindigkeit in Kilometer pro Stunde.

    Werbung:

    Die Software

    Wie bereits erwähnt ist die Hauptaufgabe der Software, die einzelnen Impulse in einem Zeitfenster zu zählen und in eine Geschwindigkeit umzurechnen. Einen digitalen Input über die Software ständig einzulesen und mit Vergleichsoperationen auszuwerten, ist nicht sehr effizient. Die bessere Lösung dafür sind Interrupts. Vor jeder Messung wird der Impulszähler auf null gesetzt. Anschließend wird auf den angeschlossenen Pin der Interrupt im RISING-Mode aktiviert. Kommt es zu einem Flankenwechsel (LOW auf HIGH) am digitalen Input, so löst der Controller einen Interrupt aus. Bei jedem Interrupt wird jetzt der Impulszähler um den Wert "Eins" addiert. Obwohl nach der Aktivierung des Interrupts ein Delay von einigen Sekunden herrscht und die Software quasi "eingefroren" ist, werden Interrupts mitgezählt. Nach Ablauf der Messzeit wird der Interrupt am Pin aufgehoben und die aktuellen Impulse mit der Zeit und Umrechnungsfaktor in die Windgeschwindigkeit umgerechnet. Anschließend erfolgt eine Ausgabe im Serial Monitor. Mehr Infos und ein Video zum Thema Interrupts gibt es hier. Der folgende Screenshot zeigt den Serial Monitor vom Arduino IDE mit aktuellen Messwerten:

    //More Information at: https://www.aeq-web.com/
    //Version 2.0 | 11-NOV-2020
    
    const int RecordTime = 3; //Define Measuring Time (Seconds)
    const int SensorPin = 3;  //Define Interrupt Pin (2 or 3 @ Arduino Uno)
    
    int InterruptCounter;
    float WindSpeed;
    
    void setup()
    {
      Serial.begin(9600);
    }
    
    void loop() {
      meassure();
      Serial.print("Wind Speed: ");
      Serial.print(WindSpeed);       //Speed in km/h
      Serial.print(" km/h - ");
      Serial.print(WindSpeed / 3.6); //Speed in m/s
      Serial.println(" m/s");
    }
    
    void meassure() {
      InterruptCounter = 0;
      attachInterrupt(digitalPinToInterrupt(SensorPin), countup, RISING);
      delay(1000 * RecordTime);
      detachInterrupt(digitalPinToInterrupt(SensorPin));
      WindSpeed = (float)InterruptCounter / (float)RecordTime * 2.4;
    }
    
    void countup() {
      InterruptCounter++;
    }
    


    122X122

    Über den Autor

    Alex, der Gründer von AEQ-WEB. Seit über 10 Jahren beschäftigt er sich mit Computern und elektronischen Bauteilen aller Art. Neben den Hardware-Projekten entwickelt er auch Webseiten, Apps und Software für Computer.

    Top Artikel in dieser Kategorie:

    Arduino IRFZ44N PWM MOSFET Load Control

    Arduino MOSFET Steuerung

    • Video
    • DE/EN

    In diesen Artikel zeigen wir wie man große Lasten mittels eines MOSFET-Transistors über das Arduino Board steuert und die Drehzahl von einem Motor regelt

    Weiterlesen
    Arduino LM358 PT1000 Sensor Converter

    Temperatur messen mit PT1000 & Arduino

    • Video
    • DE/EN

    PT1000 Sensoren können nicht direkt analog mit einem Mikrocontroller gemessen werden. Wie baut man einen Messwandler mit dem LM358 für den PT1000 und Arduino?

    Weiterlesen

    Social Media

    YouTube

    Werbung:


    Neue Artikel


    Events

    • Keine zukünftigen Events vorhanden