#include <LiquidCrystal_I2C.h>
const byte slots = 1; // no of slots in a rotating object
volatile unsigned long us, prevPulseUs, pulseUs, prevPulseUsCopy, pulseUsCopy;
volatile bool ready;
unsigned long prevMs, now, pulsePeriod, rpm;
const unsigned long slotUs = 60000000 / slots;
void IRAM_ATTR isr() {
us = micros();
if ((us - pulseUs) > 100) { // debounce interval, also determines max rpm
prevPulseUs = pulseUs;
pulseUs = us;
}
}
bool timeOut(unsigned long ms) {
now = millis();
if ((now - prevMs) >= ms) {
prevMs = now;
return true;
}
return false;
}
LiquidCrystal_I2C lcd (0x27, 16, 2);
void setup() {
pinMode(5, OUTPUT);
attachInterrupt(digitalPinToInterrupt(19), 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)) { // 4 Hz update frequency
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);
lcd.print(" ");
}
//delay(5);
}