Ich habe die Wettersensoren bei meiner Wetterstation mit einem Arduino im einsatz.
Deswegen wollte ich hier kurz meine erfahrungen mitteilen.
Die Windsensoren Funktionieren sehrgut.
Der Regensensor reagiert bei mir auch schon, wenn der Wind am Mast wackelt.
Deswegen habe ich ihn seperat am Boden montiert, es muss nur darauf geachtet werden,
das das Wasser abfliessen kann.
Um eine schlaue Windrichtung und Windgechwindigkeit zu bekommen,
messe ich eine kurze Zeit und mittle dan die werte.
Gerade bei der Windrichtung habe ich lange nach der Formel gesucht.
Das Funktioniert nur richtig über Umrechnung in Vektoren.
Deswegen möchte ich hier mein Arduino Sketch für den Wind mit euch teilen,
in der hoffnung anderen den einstieg zu erleichtern.
// DigitalPin 3 Windgeschwindigkeit Sensor gemäs Datenblatt anschliessen
// AnalogPin A3 Windrichtung Sensor gemäs Datenblatt anschliessen
#include "math.h" // Wird benötigt für Winkel und Vektor berechnung.
const int windPin = 3; // anschluss des reedkontaktes Windgeschwindigkeit
const float windFactor = 2.4; // umrechnungsfaktor von umdrehungen in geschwindigkeit (gem. Datenblatt)
const int messZeit = 30; // messzeitraum in sekunden je Windrichtung und Windgeschwindigkeit
unsigned int windCounter = 0; // interner zaehler für umdrehungen
const float pi = 3.14159265359; // Variablen für Windrichtung
int zaehlerrichtung = 0;
double uges = 0;
double vges = 0;
double u = 0;
double v = 0;
double uabs = 0;
double vabs = 0;
double uvarc = 0;
double winkel = 0;
int windrichtung = 0;
int wingeschwindigkeit = 0;
void setup()
{
Serial.begin(9600); // Startet die Serielle Schnitstelle
}
void loop()
{
/////////////////////////////////////////////////////////////// Windgeschwindigkeit
windCounter = 0; // Zähler auf Null setzen
attachInterrupt(1,countWind,RISING); // Startet Interrupt und zählt um 1 Hoch pro umdrehung.
delay(1000 * messZeit); // Wartet die Messzeit ab
detachInterrupt(1); // Deaktiviert den Interrupt
wingeschwindigkeit = (float)windCounter / (float)messZeit * windFactor; //Umrechnung in kmh
/////////////////////////////////////////////////////////////// Windrichtung
do // Die Schleiffe Zählt die angegebene Messzeit durch
{
delay(1000); // Wartet eine Sekund
windrose(analogRead(A3)); // Einlesen des Analogwert der Windrichtung und übergabe an die Funktion. 1x Pro Sekunde
} while (zaehlerrichtung >= messZeit);
u = uges / zaehlerrichtung; // Durchschnitt errechnung der Vektoren
uges = 0;
v = vges / zaehlerrichtung;
vges = 0;
uabs = abs(u); // Zurückrechnung der Vektoren in ein Winkel
vabs = abs(v);
uvarc = uabs / vabs;
winkel = atan(uvarc);
winkel = winkel * 180 / pi;
if (u >= 0 && v >= 0) windrichtung = winkel;
else if (u >= 0 && v < 0) windrichtung = 180 - winkel;
else if (u < 0 && v >= 0) windrichtung = 360 - winkel;
else if (u < 0 && v < 0) windrichtung = 180 + winkel;
zaehlerrichtung = 0;
/////////////////////////////////////////////////////////////// Ausgabe
Serial.print("Windrichtung ");
Serial.print(windrichtung);
Serial.println ("grad");
Serial.print("Windgeschwindigkeit ");
Serial.print(wingeschwindigkeit);
Serial.println("kmh");
}
/////////////////////////////////////////////////////////////// Funktionen
void countWind() {
windCounter ++;
}
void windrose (int w) // Hier wird der Analoge eingelesene Wert in ein Winkel Umgewandelt
// und Zusammengezählt als Vektoren
{
if ( w > 776 && w < 796) winkel = 0;
else if ( w > 395 && w < 415) winkel = 22.5;
else if ( w > 450 && w < 470) winkel = 45;
else if ( w > 74 && w < 88) winkel = 67.5;
else if ( w > 88 && w < 102) winkel = 90;
else if ( w > 55 && w < 74) winkel = 112.5;
else if ( w > 174 && w < 194) winkel = 135;
else if ( w > 116 && w < 136) winkel = 157.5;
else if ( w > 276 && w < 296) winkel = 180;
else if ( w > 233 && w < 253) winkel = 202.5;
else if ( w > 620 && w < 640) winkel = 225;
else if ( w > 590 && w < 610) winkel = 247.5;
else if ( w > 936 && w < 956) winkel = 270;
else if ( w > 817 && w < 837) winkel = 292.5;
else if ( w > 968 && w < 988) winkel = 315;
else if ( w > 692 && w < 712) winkel = 337.5;
uges = uges + (sin(winkel * pi / 180));
vges = vges + (cos(winkel * pi / 180));
zaehlerrichtung ++;
}