#include <LiquidCrystal.h>
// LiquidCrystal lcd(19, 23, 18, 21, 5, 15);
// LCD pin definitions (adjust as per your connection)
const int rs = 19, en = 23, d4 = 18, d5 = 21, d6 = 5, d7 = 15;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// Button pin definitions
const int buttonMenu = 4;
const int buttonUp = 16;
const int buttonDown = 17;
const int buttonSelect = 2;
int cursorPosition = 0;
// Menu structure
enum MenuState { MAIN_SCREEN, MENU, FRUITS, VEGETABLES };
MenuState currentState = MAIN_SCREEN;
int currentSelection = 0;
// Menu options
const char* mainScreen[] = { "Hello World 1" };
const char* mainMenu[] = { "Fruits", "Vegetables", "Exit" };
const char* fruitsMenu[] = { "Banana", "Apple", "Dates", "Grapes", "Back" };
const char* vegetablesMenu[] = { "Potato", "Tomato", "Onion", "Lady Finger", "Back" };
struct Menu {
const char** items;
size_t size;
};
Menu selectMenu[] = {
{ fruitsMenu, sizeof(fruitsMenu) / sizeof(fruitsMenu[0]) },
{ vegetablesMenu, sizeof(vegetablesMenu) / sizeof(vegetablesMenu[0]) },
{ mainScreen, sizeof(mainScreen) / sizeof(mainScreen[0]) }
};
// enum screen {menu, suboptions, homescreen};
bool buttonMenuPressed = false;
bool buttonUpPressed = false;
bool buttonDownPressed = false;
bool buttonSelectPressed = false;
void menu_ISR() {
buttonMenuPressed = true;
currentState = MENU;
}
void buttonUp_ISR() {
buttonUpPressed = true;
}
void buttonDown_ISR() {
buttonDownPressed = true;
// Serial.println("Down");
}
void buttonSelect_ISR() {
buttonSelectPressed = true;
// Serial.println("ISR");
}
void setup() {
Serial.begin(115200);
lcd.begin(20, 4); // Initialize the LCD with 20 columns and 4 rows
lcd.print("Hello, World!");
attachInterrupt(digitalPinToInterrupt(buttonMenu), menu_ISR, FALLING);
attachInterrupt(digitalPinToInterrupt(buttonUp), buttonUp_ISR, FALLING);
attachInterrupt(digitalPinToInterrupt(buttonDown), buttonDown_ISR, FALLING);
attachInterrupt(digitalPinToInterrupt(buttonSelect), buttonSelect_ISR, FALLING);
Serial.println(sizeof(mainMenu));
Serial.println(sizeof(fruitsMenu));
Serial.println(sizeof(vegetablesMenu));
Serial.println(sizeof(mainMenu[0]));
Serial.println(sizeof(selectMenu));
Serial.println(sizeof(selectMenu[0]));
Serial.println(selectMenu[0].size);
Serial.println(selectMenu[cursorPosition].items[0]);
}
void loop() {
if ( buttonMenuPressed ) {
buttonMenuPressed = false;
cursorPosition = 0;
// switch(currentState) {
// case 'MAIN_SCREEN':
DisplayScreen(mainMenu, sizeof(mainMenu)/sizeof(mainMenu[0]));
// break;
// case 'MENU':
// DisplayScreen(mainMenu, 3);
// break;
// if (cursorPosition == 3) {
// DisplayScreen(mainScreen, 1);
// }
// else {
// DisplayScreen(mainMenu, 3);
// }
// }
// if (currentState == MENU) {
// }
}
if ( buttonUpPressed ) {
buttonUpPressed = false;
cursorPosition--;
if (currentState == MENU) {
DisplayScreen(mainMenu, sizeof(mainMenu)/sizeof(mainMenu[0]));
}
}
if ( buttonDownPressed ) {
buttonDownPressed = false;
// Serial.println("Down");
cursorPosition++;
if (currentState == MENU) {
DisplayScreen(mainMenu, sizeof(mainMenu)/sizeof(mainMenu[0]));
}
}
if ( buttonSelectPressed ) {
buttonSelectPressed = false;
// Serial.println("currentState ");
Serial.println(currentState);
switch(currentState) {
case MAIN_SCREEN:
// DisplayScreen(mainMenu, 3);
Serial.print("case0");
cursorPosition = 0;
break;
case MENU:
// DisplayScreen(mainMenu, sizeof(mainMenu)/sizeof(mainMenu[0]));
Serial.print("case1");
if (cursorPosition == 2) {
Serial.print("if");
DisplayScreen(selectMenu[cursorPosition].items, selectMenu[cursorPosition].size);
cursorPosition = 0;
}
else {
Serial.print("Menuelse");
DisplayScreen(selectMenu[cursorPosition].items, selectMenu[cursorPosition].size);
// Serial.println(sizeof(selectMenu[cursorPosition]));
// Serial.println(sizeof((selectMenu[cursorPosition])[0]));
currentState = FRUITS;
cursorPosition = 0;
}
break;
case FRUITS:
// DisplayScreen(mainMenu, sizeof(mainMenu)/sizeof(mainMenu[0]));
Serial.print("caseFruits");
if (cursorPosition == 0) {
Serial.print("ifFruit1");
DisplayScreen(selectMenu[cursorPosition].items[0], 1);
cursorPosition = 0;
}
else if (cursorPosition == 1) {
Serial.print("if");
DisplayScreen(selectMenu[cursorPosition].items[1], 1);
cursorPosition = 0;
}
else if (cursorPosition == 2) {
Serial.print("if");
DisplayScreen(selectMenu[cursorPosition].items, 1);
cursorPosition = 0;
}
else {
Serial.print("Fruitelse");
DisplayScreen(selectMenu[cursorPosition].items, selectMenu[cursorPosition].size);
// Serial.println(sizeof(selectMenu[cursorPosition]));
// Serial.println(sizeof((selectMenu[cursorPosition])[0]));
cursorPosition = 0;
}
break;
}
}
delay(2000);
}
void DisplayScreen(const char* printList[], int size) {
lcd.clear();
lcd.setCursor(0, cursorPosition);
Serial.print(cursorPosition);
lcd.print(">");
// int size = sizeof(*printList)/sizeof(printList[0]);
// Serial.print("Size: ");
// Serial.println(size);
// Serial.println(sizeof(*printList));
// Serial.println(sizeof(printList));
// Serial.println(sizeof(printList[0]));
for (int i = 0; i < size ; i++)
{
// lcd.setCursor(0, i);
lcd.setCursor(1, i);
lcd.print(printList[i]);
}
}
void DisplayScreen(const char printList[], int size) {
lcd.clear();
lcd.setCursor(0, cursorPosition);
Serial.print(cursorPosition);
Serial.println("Ov");
lcd.print(">");
lcd.print(printList);
}