#include <LiquidCrystal_I2C.h> //memanggil library LCD I2C ke program
LiquidCrystal_I2C lcd(0x27, 20, 4); //deklarasi variabel lcd untuk menggantikan perintah LiquidCrystal_I2C
#define ENCODER_CLK 2 //deklarasi pin CLK
#define ENCODER_DT 3 //deklarasi pin DT
#define ENCODER_SW 4 //deklarasi pin SW
int counter = 0;
void setup() {
lcd.init(); //perintah menyalakan lcd
lcd.backlight(); //perintah menyalakan backlight lcd
// Initialize encoder pins
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_SW, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), readEncoder, FALLING); //perintah interrupt agar jika ada perubahan sinyal dari high ke low di pin 2 akan langsung di proses tanpa menunggu urutan
}
void readEncoder() {
int dtValue = digitalRead(ENCODER_DT);
if (dtValue == HIGH) {
counter++; // Clockwise
}
if (dtValue == LOW) {
counter--; // Counterclockwise
}
}
int getCounter() {
int result;
noInterrupts(); //jika tidak ada interupsi maka perintah di bawah akan dieksekusi
result = counter;
interrupts(); //jika terdapat interupsi dari pin 2 maka perintah di baris bawah ini akan dieksekusi
return result;
}
void resetCounter() {
noInterrupts(); //jika tidak ada interupsi maka perintah di bawah akan dieksekusi
counter = 0;
interrupts(); //jika terdapat interupsi dari pin 2 maka perintah di baris bawah ini akan dieksekusi
}
void loop() {
lcd.setCursor(3, 0);
lcd.print("Counter:");
lcd.setCursor(7, 1);
lcd.print(getCounter());
lcd.print(" ");
if (digitalRead(ENCODER_SW) == LOW) {
resetCounter();
}
}