const float ANEMOMETER_RADIUS = 0.132; // Radius des Anemometers
const int PULSE_PIN = 2; // Digitaler Pin für Pulse-Eingang // INTERRUPT PINS ONLY ALLOWED ON PINS 2 AND 3, CPU LIMITATION
const int NUM_READINGS = 20; // Anzahl der Messwerte für Durchschnittsberechnung
volatile int pulseCount = 0; // Zähler für Pulse
float speedKilometersPerHour = 0.0; // Windgeschwindigkeit in km/h
float readings[NUM_READINGS]; // Array für Durchschnittswerte
int idx = 0; // Index für Array
unsigned long total = 0; // Summe der Messwerte für Durchschnittsberechnung
unsigned long lastMeasurementTime = 0; // Zeitpunkt der letzten Messung
unsigned long debounce = 0;
bool state;
void setup() {
pinMode(PULSE_PIN, INPUT_PULLUP); // Pulse-Pin als Eingang definieren
attachInterrupt(digitalPinToInterrupt(PULSE_PIN), countPulse, RISING); // Interrupt auf fallende Flanke
Serial.begin(9600); // Serielle Kommunikation starten
}
void loop() {
unsigned long currentTime = millis(); // Aktuelle Zeit auslesen
if (currentTime - lastMeasurementTime >= 2000) { // Wenn 2 Sekunden vergangen sind
lastMeasurementTime = currentTime; // Zeitpunkt der letzten Messung aktualisieren
delay(1000); // Eine Sekunde warten, um Impulse zu zählen
float rotations = pulseCount * 1.0 / 2; // Für jedes Rad gibt es 2 Impulse
float distance = 2 * PI * ANEMOMETER_RADIUS * rotations; // Zurückgelegte Strecke in einer Sekunde
speedKilometersPerHour = distance / 1000 * 3600; // Windgeschwindigkeit in km/h berechnen
total = total - readings[idx]; // Alten Wert aus der Summe entfernen
readings[idx] = speedKilometersPerHour; // Neuen Wert in Array speichern
total = total + readings[idx]; // Neuen Wert zur Summe hinzufügen
idx = (idx + 1) % NUM_READINGS; // Index für Array aktualisieren
float average = total * 1.0 / NUM_READINGS; // Durchschnitt berechnen
Serial.print("Windgeschwindigkeit: ");
Serial.print(average);
Serial.println(" km/h");
pulseCount = 0; // Zähler zurücksetzen MOVED THE PULSECOUNT HERE SO IT WILL DELETE AFTER THE CALCULATION
}
}
void countPulse() {
if (millis() - debounce >= 10) // WE NEED TO DEBOUNCE THE PIN AS IT MAKES CONNECTION, THE INTERRUPT MAKES 2X CONNECTION (pressed and released) SO WE NEED TO CAPTURE THE RELEASE
{
if (state) {
pulseCount++; // Zähler für Pulse erhöhen
Serial.println("pulse");
}
state = !state;
debounce = millis();
}
}