#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Button pins
const int selectButton = 2;
const int backButton = 3;
const int upButton = 4;
const int downButton = 5;
// LED pins
const int ledPin = 13;
// State variables
volatile bool enterLoop = false;
int level = 0;
int index0 = 0;
int index1 = 0;
void main_screen() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Home");
}
void menu1_screen() {
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("Setting");
lcd.setCursor(1, 1);
lcd.print("About Device");
lcd.setCursor(1, 2);
lcd.print("About Developer");
lcd.setCursor(0, index0); // Show selection
lcd.print(">");
}
void menu2_screen() {
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("T1");
lcd.setCursor(1, 1);
lcd.print("T2");
lcd.setCursor(1, 2);
lcd.print("T3");
lcd.setCursor(0, index1); // Show selection
lcd.print(">");
}
void executeAction() {
switch (level) {
case 0: // Move to main menu
level = 1;
index0 = 0;
break;
case 1: // Navigate submenus
if (index0 == 0) level = 2; // Example action for first menu item
break;
}
}
void updateMenu() {
switch (level) {
case 0:
main_screen();
break;
case 1:
checkBounds(index0, 0, 2);
menu1_screen();
break;
case 2:
checkBounds(index1, 0, 2);
menu2_screen();
break;
}
}
void checkBounds(int &value, int min, int max) {
if (value < min) value = max;
if (value > max) value = min;
}
void setup() {
pinMode(selectButton, INPUT_PULLUP);
pinMode(backButton, INPUT_PULLUP);
pinMode(upButton, INPUT_PULLUP);
pinMode(downButton, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
lcd.init();
lcd.backlight();
main_screen();
attachInterrupt(digitalPinToInterrupt(selectButton), startInterrupt, FALLING);
attachInterrupt(digitalPinToInterrupt(backButton), stopInterrupt, FALLING);
Serial.begin(9600);
Serial.println("Setup complete. Waiting for interrupts.");
}
void loop() {
if (enterLoop) {
updateMenu(); // Initial update when entering loop
while (enterLoop) { // Menu navigation loop
if (!digitalRead(upButton)) {
switch (level) {
case 1: index0++; break;
case 2: index1++; break;
}
updateMenu();
delay(200); // Debounce
while (!digitalRead(upButton)); // Wait for release
}
if (!digitalRead(downButton)) {
switch (level) {
case 1: index0--; break;
case 2: index1--; break;
}
updateMenu();
delay(200); // Debounce
while (!digitalRead(downButton)); // Wait for release
}
if (!digitalRead(selectButton)) {
executeAction();
updateMenu();
delay(200); // Debounce
while (!digitalRead(selectButton)); // Wait for release
}
if (!digitalRead(backButton)) {
switch (level) {
case 1: level = 0; enterLoop = false; Serial.println("Exited menu loop"); break;
case 2: level = 1; break;
}
updateMenu();
delay(200); // Debounce
while (!digitalRead(backButton)); // Wait for release
}
}
} else {
digitalWrite(ledPin, HIGH); // Blink LED in normal mode
delay(500);
digitalWrite(ledPin, LOW);
delay(500);
}
}
void startInterrupt() {
if (!enterLoop) {
enterLoop = true;
level = 1;
Serial.println("Entered menu loop");
}
}
void stopInterrupt() {
}