#define ENCODER_CLK 16
#define ENCODER_DT 4
#define ENCODER_BTN 15
#define SDA 12
#define SCL 13
#define LED1 14
#define LED2 27
#define LED3 26
#define LED4 25
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
int Menu = 1;
int MenuUp = 0;
int MenuDown = 0;
int StateBTN = 1;
int led1 = 0;
int led2 = 0;
int led3 = 0;
int led4 = 0;
void setup() {
Serial.begin(9600);
Wire.begin(SDA, SCL);
lcd.init();
lcd.backlight();
pinMode(ENCODER_CLK, INPUT);
pinMode(ENCODER_DT, INPUT);
pinMode(ENCODER_BTN, INPUT_PULLUP);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), readEncoder, FALLING);
Serial.println("Begin");
updateMenu();
}
void readEncoder() {
int dtValue = digitalRead(ENCODER_DT);
if (dtValue == HIGH) {
Serial.println("Rotated clockwise ⏩");
MenuUp=1;
}
if (dtValue == LOW) {
Serial.println("Rotated counterclockwise ⏪");
MenuDown=1;
}
}
void updateMenu() {
switch (Menu) {
case 0:
Menu = 1;
break;
case 1:
lcd.clear();
lcd.print(">LED1");
lcd.setCursor(0, 1);
lcd.print(" LED2");
action1();
break;
case 2:
lcd.clear();
lcd.print(" LED1");
lcd.setCursor(0, 1);
lcd.print(">LED2");
break;
case 3:
lcd.clear();
lcd.print(">LED3");
lcd.setCursor(0, 1);
lcd.print(" LED4");
break;
case 4:
lcd.clear();
lcd.print(" LED3");
lcd.setCursor(0, 1);
lcd.print(">LED4");
break;
case 5:
Menu = 4;
break;
}
}
void loop() {
if (MenuUp){
MenuUp=0;
Menu++;
updateMenu();
delay(100);
}
if (MenuDown){
MenuDown=0;
Menu--;
updateMenu();
delay(100);
}
if (digitalRead(ENCODER_BTN) == LOW) {
StateBTN = !StateBTN;
Serial.println(StateBTN);
executeAction();
delay(1000);
}
delay(10);
}
void executeAction() {
switch (Menu) {
case 1:
action1();
break;
case 2:
action2();
break;
case 3:
action3();
break;
case 4:
action4();
break;
}
}
void action1() {
if (StateBTN == LOW) led1 = HIGH;
else led1 = LOW;
digitalWrite(LED1, led1);
}
void action2() {
if (StateBTN == LOW) led2 = HIGH;
else led2 = LOW;
digitalWrite(LED2, led2);
}
void action3() {
if (StateBTN == LOW) led3 = HIGH;
else led3 = LOW;
digitalWrite(LED3, led3);
}
void action4() {
if (StateBTN == LOW) led4 = HIGH;
else led4 = LOW;
digitalWrite(LED4, led4);
}