const byte pulsesPerRev = 8;
const byte debounceInterval = 200;
volatile unsigned long us, prevPulseUs, pulseUs, prevPulseUsCopy, pulseUsCopy;
unsigned long pulsePeriod, rpm;
const unsigned long slotUs = 60000000 / pulsesPerRev;
const byte rpm_in = 2;
void rpm_interrupt() {
us = micros();
if ((us - pulseUs) > debounceInterval) { //also determines max rpm
prevPulseUs = pulseUs;
pulseUs = us;
}
}
bool processInterval(unsigned long ms) {
volatile unsigned long prevMs, now;
now = millis();
if ((now - prevMs) >= ms) {
prevMs = now;
return true;
}
return false;
}
void setup() {
Serial.begin(115200);
pinMode(rpm_in, INPUT); //Interrupt
attachInterrupt(digitalPinToInterrupt(rpm_in), rpm_interrupt, FALLING);
}
void loop() {
if (processInterval(400)) {
noInterrupts();
prevPulseUsCopy = prevPulseUs;
pulseUsCopy = pulseUs;
interrupts();
pulsePeriod = pulseUsCopy - prevPulseUsCopy;
if (pulsePeriod) rpm = slotUs / pulsePeriod ;
Serial.print("RPM = ");
Serial.println(rpm);
}
}