/* Program Membuat Menu Sederhana dengan Rotary Encoder + LCD dibuat oleh Indobot */
#include <LiquidCrystal_I2C.h> //Library LCD I2C
LiquidCrystal_I2C lcd(0x27,16,2); //Alamat I2C
#define outputA 6 //CLK pada pin D6
#define outputB 7 //DT pada pin D7
#define button 8 //SW pada pin D8
#define led1 9 //LED 1 pada pin D9
#define led2 10
bool LED1 = false; //Variabel kondisi LED 1
bool LED2 = false;
int counter = 0; //Variabel penghitung nilai
int aState; //Variabel kondisi
int aLastState; //Variabel kondisi terakhir
void setup() {
lcd.init (); //Mulai LCD
lcd.setBacklight(HIGH); //Nyalakan backlight
pinMode (outputA,INPUT_PULLUP); //Setting sebagai input pullup
pinMode (outputB,INPUT_PULLUP);
pinMode (button,INPUT_PULLUP);
pinMode(led1, OUTPUT); //Setting LED sebagai output
pinMode(led2, OUTPUT);
Serial.begin (9600); //Mulai komunikasi serial
aLastState = digitalRead(outputA);
//---------------Tampilan Awal---------------//
lcd.setCursor(1,0);
lcd.print("LED 1 = OFF");
lcd.setCursor(1,1);
lcd.print("LED 2 = OFF");
}
void loop() {
//---------------Kondisi 1---------------//
set1:
baca_rotary(); //Prosedur baca rotary
lcd.setCursor(0,0);
lcd.print(">");
lcd.setCursor(0,1);
lcd.print(" ");
if(counter == 2 || counter == -2){ //Jika kondisi berubah, maka
counter = 0;
goto set2; //Lompat ke kondisi 2
}
else if(digitalRead(button) == LOW){ //Jika tombol ditekan, maka
delay(200);
cek_led1(); //Jalankan prosedur cek LED
goto set1;
}
else{goto set1;}
//---------------Kondisi 2---------------//
set2:
baca_rotary();
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(">");
if(counter == 2 || counter == -2){
counter = 0;
goto set1;
}
else if(digitalRead(button) == LOW){
delay(200);
cek_led2();
goto set2;
}
else{goto set2;}
}
void baca_rotary(){ //Prosedur baca rotary
aState = digitalRead(outputA);
if (aState != aLastState){
if (digitalRead(outputB) != aState) {
counter++;
} else {
counter--;
}
}
aLastState = aState;
}
void cek_led1(){ //Prosedur cek LED 1
if(LED1 == false){ //Jika LED mati, maka
digitalWrite(led1, HIGH); //Menyalakan LED
lcd.setCursor(9,0);
lcd.print("ON ");
LED1 = true;
}
else{ //Jika LED hidup, maka
digitalWrite(led1, LOW); //Mematikan LED
lcd.setCursor(9,0);
lcd.print("OFF");
LED1 = false;
}
}
void cek_led2(){
if(LED2 == false){
digitalWrite(led2, HIGH);
lcd.setCursor(9,1);
lcd.print("ON ");
LED2 = true;
}
else{
digitalWrite(led2, LOW);
lcd.setCursor(9,1);
lcd.print("OFF");
LED2 = false;
}
}