// lcd.print((char)223); degree
#include <Wire.h> // i2C Conection Library
#include <LiquidCrystal_I2C.h> //i2C LCD Library
LiquidCrystal_I2C lcd(0x27, 16, 2); // Ganti 0x3F sesuai hasil scan (bisa jadi 0x27)
#define CLK 2
#define DT 3
#define SW 4
int counter = 0;
int currentStateCLK;
int lastStateCLK;
String currentDir ="";
unsigned long lastButtonPress = 0;
int tampilan = 1;
int modeMenu = 0;
int modeSubmenu = 1;
String namaMenu;
String nilaiMenu;
void setup() {
// Set KY-040 Pin
pinMode(CLK,INPUT);
pinMode(DT,INPUT);
pinMode(SW, INPUT_PULLUP);
// Setup Serial Monitor
Serial.begin(9600);
// Baca status awal CLK
lastStateCLK = digitalRead(CLK);
// Menginisialisasi LCD
lcd.init();
lcd.backlight();
lcd.print("Tone Control by");
lcd.setCursor(0,1);
lcd.print("Galih Pamungkas");
delay(3000);
lcd.clear();
lcd.print("Main Menu : ");
lcd.setCursor(0,1);
lcd.print("1. Set Sudut");
}
void loop() {
// Baca status CLK saat ini
currentStateCLK = digitalRead(CLK);
if (currentStateCLK != lastStateCLK && currentStateCLK == 1){
// Encoder memutar searah jarum jam sehingga terjadi penambahan
if (digitalRead(SW) == LOW ) {
// =========== Main Menu =========== //
if (tampilan == 1){
modeMenu ++;
if(modeMenu > 4){ modeMenu = 0; }
}
// =========== Sub Menu =========== //
if (tampilan == 0){
modeSubmenu ++;
if (modeMenu == 0) { // Setting Sudut
if(modeSubmenu > 360){ modeSubmenu = 1;}
}
else if (modeMenu == 1) { // Setting Tinggi
if(modeSubmenu > 20){ modeSubmenu = 1;}
}
else if (modeMenu == 2) { // Setting Tebal
if(modeSubmenu > 25){ modeSubmenu = 1;}
}
else if (modeMenu == 3) { // Setting Panjang
if(modeSubmenu > 30){ modeSubmenu = 1;}
}
else if (modeMenu == 3) { // Setting Lebar
if(modeSubmenu > 35){ modeSubmenu = 1;}
}
}
} else {
if (tampilan == 1){
modeMenu --;
if(modeMenu < 0){ modeMenu = 4; }
}
// =========== Sub Menu =========== //
if (tampilan == 0){
modeSubmenu --;
if (modeMenu == 0) { // Setting Sudut
if(modeSubmenu < 1){ modeSubmenu = 360;}
}
else if (modeMenu == 1) { // Setting Tinggi
if(modeSubmenu < 1){ modeSubmenu = 20;}
}
else if (modeMenu == 2) { // Setting Tebal
if(modeSubmenu < 1){ modeSubmenu = 25;}
}
else if (modeMenu == 3) { // Setting Panjang
if(modeSubmenu < 1){ modeSubmenu = 30;}
}
else if (modeMenu == 4) { // Setting Lebar
if(modeSubmenu < 1){ modeSubmenu = 35;}
}
}
}
// =================== Menampilkan Main Menu =================== //
if (tampilan == 1){
switch (modeMenu){
case 0: namaMenu = "1. Set Sudut"; nilaiMenu = "Sudut : "; break;
case 1: namaMenu = "2. Set Tinggi"; nilaiMenu = "Tinggi : "; break;
case 2: namaMenu = "3. Set Tebal"; nilaiMenu = "Tebal : "; break;
case 3: namaMenu = "4. Set Panjang"; nilaiMenu = "Panjang : "; break;
case 4: namaMenu = "5. Set Lebar"; nilaiMenu = "Lebar : "; break;
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Main Menu : ");
lcd.setCursor(0,1);
lcd.print(namaMenu);
}
// =================== Menampilkan Sub Menu =================== //
if (tampilan == 0){
if (modeMenu == 0) { // Setting Jam
// Simpan Jam
}
lcd.clear();
lcd.setCursor(0,0);
lcd.print(namaMenu);
lcd.setCursor(0,1);
lcd.print(nilaiMenu);
lcd.print(modeSubmenu);
}
}
lastStateCLK = currentStateCLK;
int btnState = digitalRead(SW);
if (btnState == LOW) {
if (millis() - lastButtonPress > 50) {
switch (modeMenu){
case 0: namaMenu = "1. Set Sudut"; nilaiMenu = "Sudut : "; break;
case 1: namaMenu = "2. Set Tinggi"; nilaiMenu = "Tinggi : "; break;
case 2: namaMenu = "3. Set Tebal"; nilaiMenu = "Tebal : "; break;
case 3: namaMenu = "4. Set Panjang"; nilaiMenu = "Panjang : "; break;
case 4: namaMenu = "5. Set Lebar"; nilaiMenu = "Lebar : "; break;
}
switch (tampilan){
case 0:
tampilan = 1;
Serial.println(tampilan);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Main Menu : ");
lcd.setCursor(0,1);
lcd.print(namaMenu);
break;
case 1:
tampilan = 0;
Serial.println(tampilan);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(namaMenu);
lcd.setCursor(0,1);
lcd.print(nilaiMenu);
lcd.print(modeSubmenu);
break;
}
// modeMenu = 0;
modeSubmenu = 1;
}
// Mengambil saat terakhir tombol ditekan
lastButtonPress = millis();
}
// tambahkan delay untuk mrnghindari debounce saat pembacaan
delay(1);
}
// Sumber KY-040 : http://domoticx.com/arduino-rotary-encoder-keyes-ky-040/