#include <math.h>
#define WindSensorPin (2)

volatile unsigned long Rotations; // cup rotation counter used in interrupt routine
volatile unsigned long ContactBounceTime; // Timer to avoid contact bounce in interrupt routine
float WindSpeed; // speed miles per hour

void setup()
{
    Serial.begin(9600);

    pinMode(WindSensorPin, INPUT);
    attachInterrupt(digitalPinToInterrupt(WindSensorPin), isr_rotation, FALLING);

    Serial.println("Rotations\tKm/h");
}

void loop()
{
    Rotations = 0; // Set Rotations count to 0 ready for calculations

    sei(); // Enables interrupts
    delay (3000); // Wait 3 seconds to average
    cli(); // Disable interrupts

    // convert to mp/h using the formula V=P(2.25/T)
    // V = P(2.25/3) = P * 0.75

    WindSpeed = (Rotations * 0.75) * 1.609344;

    Serial.print(Rotations); Serial.print("\t\t");
    Serial.println(WindSpeed);
}

// This is the function that the interrupt calls to increment the rotation count
void isr_rotation()
{
    if ((millis() - ContactBounceTime) > 15 ) // debounce the switch contact.
    {
        Rotations++;
        ContactBounceTime = millis();
    }
} 
