#include "Wire.h" // Library untuk komunikasi I2C
#include "LiquidCrystal_I2C.h" // Library untuk mengontrol LCD I2C
// Inisialisasi objek LCD dengan alamat I2C 0x27, 16 kolom, 2 baris
LiquidCrystal_I2C lcd(0x27, 16, 2); // Ganti 0x3F jika alamat berbeda
// Definisi pin untuk rotary encoder
#define CLK 2 // Pin CLK dari encoder
#define DT 4 // Pin DT dari encoder
#define SW 3 // Pin SW (tombol tekan) dari encoder
int counter = 0; // Variabel penghitung nilai putaran encoder
int currentStateCLK; // Status saat ini dari pin CLK
int lastStateCLK; // Status sebelumnya dari pin CLK
String currentDir = ""; // Arah putaran encoder: "CW" (searah) atau "CCW" (berlawanan)
unsigned long lastButtonPress = 0; // Waktu terakhir tombol ditekan, untuk debouncing
void setup() {
// Konfigurasi pin-pin sebagai input
pinMode(CLK, INPUT);
pinMode(DT, INPUT);
pinMode(SW, INPUT_PULLUP); // SW pakai pull-up internal
Serial.begin(9600); // Memulai komunikasi serial pada 9600 baud
lastStateCLK = digitalRead(CLK); // Simpan status awal CLK
lcd.init(); // Inisialisasi LCD
lcd.backlight(); // Nyalakan backlight
lcd.print("KY-040 DENGAN"); // Tampilkan pesan awal
lcd.setCursor(0, 1);
lcd.print("LCD 16x02");
}
void loop() {
currentStateCLK = digitalRead(CLK); // Baca status CLK saat ini
// Deteksi perubahan status CLK (hanya saat naik)
if (currentStateCLK != lastStateCLK && currentStateCLK == 1) {
if (digitalRead(DT) != currentStateCLK) {
// Putaran searah jarum jam (CW)
counter++;
currentDir = "CW";
} else {
// Putaran berlawanan arah jarum jam (CCW)
counter--;
currentDir = "CCW";
}
// Tampilkan arah dan nilai di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ARAH: ");
lcd.print(currentDir);
lcd.setCursor(0, 1);
lcd.print("NILAI: ");
lcd.print(counter);
// Tampilkan juga di Serial Monitor
Serial.print("ARAH: ");
Serial.print(currentDir);
Serial.print(" | NILAI: ");
Serial.println(counter);
}
lastStateCLK = currentStateCLK; // Simpan status CLK terakhir
int btnState = digitalRead(SW); // Baca status tombol
if (btnState == LOW) { // Jika tombol ditekan
if (millis() - lastButtonPress > 50) {
// Jika lebih dari 50ms sejak terakhir ditekan (debounce)
counter = 0; // Reset nilai counter
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("TOMBOL DITEKAN");
lcd.setCursor(0, 1);
lcd.print("Nilai: ");
lcd.print(counter);
Serial.println("TOMBOL DITEKAN");
Serial.print("NILAI: ");
Serial.println(counter);
}
lastButtonPress = millis(); // Update waktu terakhir tombol ditekan
}
delay(1); // Delay kecil untuk menghindari bouncing encoder
}