PHP Dashboard für HmIP Smartmeter
09.10.2024
Elektronik | Funk | Software
Der Technik-Blog
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.
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.
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.
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:
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.
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++; }
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?
WeiterlesenDer PT100 ist ein sehr präziser industrieller Temperatursensor. In diesem Artikel geht es um den Bau eines Messverstärkers zum Einlesen eines PT100 am Arduino
WeiterlesenAEQ-WEB © 2015-2024 All Right Reserved