#include <LiquidCrystal_I2C.h>
const byte slots = 1; // no of slots in a rotating object
volatile unsigned long us, prevPulseUs, pulseUs, prevPulseUsCopy, pulseUsCopy;
unsigned long pulsePeriod, rpm;
const unsigned long slotUs = 60000000 / slots;
void isr() {
us = micros();
if ((us - pulseUs) > 100) { // debounce interval, also determines max rpm
prevPulseUs = pulseUs;
pulseUs = us;
}
}
bool timeOut(unsigned long ms) {
volatile unsigned long prevMs, now;
now = millis();
if ((now - prevMs) >= ms) {
prevMs = now;
return true;
}
return false;
}
LiquidCrystal_I2C lcd (0x27, 16, 2);
void setup() {
attachInterrupt(digitalPinToInterrupt(2), isr, RISING);
lcd.init();
lcd.backlight();
//lcd.clear();
lcd.setCursor(0, 0);
lcd.print("___TACHOMETER___");
lcd.setCursor(0, 1);
lcd.print("RPM: ");
}
void loop() {
if (timeOut(250)) {
cli(); //stop interrupts
prevPulseUsCopy = prevPulseUs;
pulseUsCopy = pulseUs;
sei(); //allow interrupts
pulsePeriod = pulseUsCopy - prevPulseUsCopy;
if (pulsePeriod) rpm = slotUs / pulsePeriod ;
lcd.setCursor(5, 1);
lcd.print(rpm);
}
}