#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int signalPin = 4; // Clock connected here
volatile unsigned long pulseCount = 0;
unsigned long previousMillis = 0;
const long interval = 1000; // 1 second
// Interrupt function
void IRAM_ATTR countPulse() {
pulseCount++;
}
void setup() {
lcd.init();
lcd.backlight();
pinMode(signalPin, INPUT);
attachInterrupt(digitalPinToInterrupt(signalPin), countPulse, RISING);
previousMillis = millis();
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
detachInterrupt(digitalPinToInterrupt(signalPin));
unsigned long rpm = pulseCount * 60;
pulseCount = 0;
previousMillis = currentMillis;
attachInterrupt(digitalPinToInterrupt(signalPin), countPulse, RISING);
noInterrupts();
unsigned long pulses = pulseCount;
pulseCount = 0;
interrupts();
unsigned long rpm = pulses * 60;
previousMillis = currentMillis;
unsigned long rpm = pulseCount * 60;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("RPM:");
lcd.setCursor(0, 1);
lcd.print(rpm);
pulseCount = 0;
previousMillis = currentMillis;
attachInterrupt(digitalPinToInterrupt(signalPin), countPulse, RISING);
}
}