// Pustaka untuk mengontrol LCD I2C
#include <LiquidCrystal_I2C.h>
// Objek LCD dengan alamat I2C, jumlah kolom, dan jumlah baris
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Definisi pin encoder
#define ENCODER_CLK 2 // Pin sinyal clock encoder
#define ENCODER_DT 3 // Pin data encoder
#define ENCODER_SW 4 // Pin tombol encoder (dengan pull-up resistor)
// Variabel global untuk menyimpan hitungan encoder
int counter = 0;
// Fungsi setup
void setup() {
// Inisialisasi LCD
lcd.init();
// Nyalakan backlight LCD
lcd.backlight();
// Set pin encoder sebagai input
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
// Set pin tombol encoder sebagai input dengan pull-up resistor
pinMode(ENCODER_SW, INPUT_PULLUP);
// Pasang interupsi untuk sinyal clock encoder (falling edge)
attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), readEncoder, FALLING);
}
// Fungsi untuk membaca nilai encoder
void readEncoder() {
int dtValue = digitalRead(ENCODER_DT); // Baca nilai pin data encoder
// Perbarui hitungan berdasarkan nilai data encoder
if (dtValue == HIGH) {
counter++; // Increment hitungan untuk rotasi searah jarum jam
} else {
counter--; // Decrement hitungan untuk rotasi berlawanan arah jarum jam
}
}
// Fungsi untuk mendapatkan nilai hitungan
int getCounter() {
int result;
noInterrupts(); // Nonaktifkan interupsi sementara untuk mencegah kondisi balapan
result = counter; // Baca nilai hitungan saat ini
interrupts(); // Nyalakan kembali interupsi
return result;
}
// Fungsi untuk mereset hitungan
void resetCounter() {
noInterrupts(); // Nonaktifkan interupsi untuk memastikan reset hitungan atomik
counter = 0; // Reset hitungan ke nol
interrupts(); // Nyalakan kembali interupsi
}
// Fungsi loop utama
void loop() {
// Posisikan kursor LCD ke kolom 3, baris 0
lcd.setCursor(3, 0);
// Cetak label "Counter:"
lcd.print("Counter: ");
// Posisikan kursor LCD ke kolom 7, baris 1
lcd.setCursor(7, 1);
// Cetak nilai hitungan saat ini
lcd.print(getCounter());
// Hapus karakter yang tersisa di baris (opsional)
lcd.print(" ");
// Periksa apakah tombol encoder ditekan
if (digitalRead(ENCODER_SW) == LOW) {
// Reset hitungan jika tombol ditekan
resetCounter();
}
}