#define ROTARY_PIN_A 2 // Pin CLK rotary encoder
#define ROTARY_PIN_B 3 // Pin DT rotary encoder
#define ROTARY_PIN_SW 4
unsigned long buttonPressTime = 0;
unsigned long longPressDuration = 500;
unsigned long longPressDurationEdit = 1500;
volatile int encoderValue = 1;
int lastEncoderValue = 1;
int menuItem = 1;
const int menuCount = 4; // Jumlah item menu
unsigned long lastInterruptTime = 0;
unsigned long debounceDelay = 50; // Penundaan debounce dalam milidetik
void handleRotaryA() {
// Ambil waktu sekarang
unsigned long currentMillis = millis();
// Periksa penundaan debounce
if (currentMillis - lastInterruptTime > debounceDelay) {
int currentEncoderPinB = digitalRead(ROTARY_PIN_B);
encoderValue += (currentEncoderPinB == HIGH) ? 1 : -1; // Ubah nilai encoder sesuai arah putaran
lastInterruptTime = currentMillis; // Perbarui waktu terakhir interrupt
}
}
void handleRotaryB() {
// Ambil waktu sekarang
unsigned long currentMillis = millis();
// Periksa penundaan debounce
if (currentMillis - lastInterruptTime > debounceDelay) {
int currentEncoderPinA = digitalRead(ROTARY_PIN_A);
encoderValue += (currentEncoderPinA == LOW) ? 1 : -1; // Ubah nilai encoder sesuai arah putaran
lastInterruptTime = currentMillis; // Perbarui waktu terakhir interrupt
}
}
void setup() {
Serial.begin(115200);
pinMode(ROTARY_PIN_A, INPUT_PULLUP);
pinMode(ROTARY_PIN_B, INPUT_PULLUP);
pinMode(ROTARY_PIN_SW, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ROTARY_PIN_A), handleRotaryA, CHANGE);
attachInterrupt(digitalPinToInterrupt(ROTARY_PIN_B), handleRotaryB, CHANGE);
}
void loop() {
if (encoderValue != lastEncoderValue) {
menuItem = encoderValue % menuCount;
if (menuItem <= 0) {
menuItem += menuCount;
}
lastEncoderValue = encoderValue;
Serial.print("Nilai menuItem: ");
Serial.println(menuItem);
}
if (digitalRead(ROTARY_PIN_SW) == LOW) {
// Tombol ditekan, lakukan sesuatu
buttonPressTime = millis();
while (digitalRead(ROTARY_PIN_SW) == LOW) {
delay(10);
}
if (buttonPressTime > 0) {
unsigned long pressDuration = millis() - buttonPressTime;
// Tombol dilepas, tentukan apakah tekanan tombol pendek atau lama
if (pressDuration < longPressDuration) {
// Tekanan tombol pendek, lakukan sesuatu (misalnya, fungsi OK)
Serial.println("Tekanan tombol pendek (OK)");
// Tambahkan logika Anda di sini untuk tekanan tombol pendek
} else if((pressDuration > longPressDurationEdit)){
Serial.println("Tekanan tombol edit (EDIT)");
}
else {
// Tekanan tombol lama, lakukan sesuatu yang berbeda (misalnya, kembali ke menu sebelumnya)
Serial.println("Tekanan tombol lama (Kembali)");
// Tambahkan logika Anda di sini untuk tekanan tombol lama
}
// Reset waktu tekanan tombol
buttonPressTime = 0;
}
}
// Misalnya, lakukan sesuatu berdasarkan nilai menuItem
switch (menuItem) {
case 1:
// Lakukan sesuatu untuk menu item 1
break;
case 2:
// Lakukan sesuatu untuk menu item 2
break;
// tambahkan case lainnya sesuai kebutuhan
}
// Tunggu hingga tombol dilepaskan (debouncing)
}