#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Inisialisasi LCD I2C (alamat default 0x27, ukuran 16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pin rotary encoder
#define CLK 18
#define DT 19
volatile int counter = 0; // Variabel untuk menghitung putaran
int lastStateCLK;
unsigned long lastTime = 0; // Waktu terakhir perhitungan RPM
int rpm = 0; // Variabel untuk menyimpan nilai RPM
void IRAM_ATTR updateEncoder() {
int currentStateCLK = digitalRead(CLK);
if (currentStateCLK != lastStateCLK && currentStateCLK == HIGH) {
// Cek arah putaran
if (digitalRead(DT) != currentStateCLK) {
counter++; // Putaran searah jarum jam
} else {
counter--; // Putaran berlawanan arah jarum jam
}
}
lastStateCLK = currentStateCLK;
}
void setup() {
// Inisialisasi pin rotary encoder
pinMode(CLK, INPUT);
pinMode(DT, INPUT);
// Baca state awal rotary encoder
lastStateCLK = digitalRead(CLK);
// Attach interrupt untuk rotary encoder
attachInterrupt(digitalPinToInterrupt(CLK), updateEncoder, CHANGE);
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("RPM Monitor");
delay(2000); // Tampilkan pesan awal
lcd.clear();
}
void loop() {
// Hitung RPM berdasarkan counter
unsigned long currentTime = millis();
if (currentTime - lastTime >= 1000) { // Perhitungan tiap 1 detik
rpm = counter * 60; // 60 untuk konversi ke RPM
counter = 0; // Reset counter
lastTime = currentTime;
// Tampilkan nilai RPM di LCD
lcd.setCursor(0, 0);
lcd.print("RPM: ");
lcd.print(rpm);
lcd.print(" "); // Clear sisa karakter
}
}