// By Ian Cumming found on arduino project hub
//https://create.arduino.cc/projecthub/ianabcumming/a-simple-arduino-menu-with-an-lcd-254080
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // ARDUINO UNO
byte buttons[] = {6,7,8}; //10 for additional pin
const byte nrButtons = 3; // change to 4 if additional button added
int menusize = 16;
String menu[] = {
" Menu", //0 // hoofdtekst
" Menu> LED one", //1 // menu van de 3D Printer
" Menu> LED one> Off", //2 //optie voor menu 3D Printer
" Menu> LED one> On", //3 //optie voor menu 3D Printer
" Menu> LED two", //4 // menu van de Sticker machine
" Menu> LED two> Off", //5 //optie voor menu Sticker machine
" Menu> LED two> On", //6 //optie voor menu Sticker machine
" Menu> LED three",
" Menu> LED three> Off",
" Menu> LED three> On",
" Menu> LED four",
" Menu> LED four> Off",
" Menu> LED four> On",
" Menu> Nothing1", //7 //menu van nix1
" Menu> Nothing2", //8 //menu van nix2
" Menu> Nothing3", //9 //menu van nix3
};
int t;
byte pressedButton, currentPos,currentPosParent, possiblePos[20], possiblePosCount, possiblePosScroll = 0;
String parent = "";
int brightness;
int LCDtoggle = 0;
int fadeAmount = 5;
unsigned long timer = (millis() / 10);
int LEDone = 0;
int LEDtwo = 0;
int LEDthree = 0;
int LEDfour = 0;
void updateMenu () {
possiblePosCount = 0;
while (possiblePosCount == 0) {
for (t = 1; t < menusize;t++) {
if (mid(menu[t],1,inStrRev(menu[t],">")-1).equals(menu[currentPos])) {
possiblePos[possiblePosCount] = t;
possiblePosCount = possiblePosCount + 1;
}
}
//find the current parent for the current menu
parent = mid(menu[currentPos],1,inStrRev(menu[currentPos],">")-1);
currentPosParent = 0;
for (t = 0; t < menusize; t++) {
if (parent == menu[t]) {currentPosParent = t;}
}
// reached the end of the Menu line
if (possiblePosCount == 0) {
//Menu Option Items
switch (currentPos) {
case 2:
case 3:
case 5:
case 6:
case 8:
case 9:
case 11:
case 12:
for (t = 2; t < 13; t++) {
if (mid(menu[t], len(menu[t]), 1) == "*") {
menu[t] = mid(menu[t], 1, len(menu[t]) - 1);
}
}
menu[currentPos] = menu[currentPos] + "*";
break;
}
//Set Variables
switch (currentPos) {
case 2:
LEDone = 0;
break;
case 3:
LEDone = 1;
break;
case 5:
LEDtwo = 0;
break;
case 6:
LEDtwo = 1;
break;
case 8:
LEDthree = 0;
break;
case 9:
LEDthree = 1;
break;
case 11:
LEDfour = 0;
break;
case 12:
LEDfour = 1;
break;
}
// go to the parent
currentPos = currentPosParent;
}
}
lcd.clear();
// Serial.println(currentPos); //lahko zavzame 0 ali 1
//Serial.println(menu[currentPos]);// Menu ali Menu> LED one
//Serial.println(inStrRev(menu[currentPos],">")); // lahko zavzame 0 ali 6
// Serial.println(len(menu[currentPos])); // lahko zavzame 5 ali 14
//Serial.println(inStrRev(menu[currentPos],">")); //lahko zavzame 0 ali 6
//Serial.println(len(menu[currentPos])-inStrRev(menu[currentPos],">")); // lahko zavzame 5 ali 8
lcd.setCursor(0,0); lcd.print(mid(menu[currentPos],inStrRev(menu[currentPos],">")+1,len(menu[currentPos])-inStrRev(menu[currentPos],">")));
lcd.setCursor(0,1); lcd.print(mid(menu[possiblePos[possiblePosScroll]],inStrRev(menu[possiblePos[possiblePosScroll]],">")+1,len(menu[possiblePos[possiblePosScroll]])-inStrRev(menu[possiblePos[possiblePosScroll]],">")));
}
// Look for a button press
byte checkButtonPress() {
byte buttonPressed = 0;
byte lastPressedButton = 0;
for (t = 0; t<nrButtons;t++) {
if (digitalRead(buttons[t]) == 0) {buttonPressed = (t + 1);
}
}
lastPressedButton = buttonPressed;
while (buttonPressed != 0) { // wait while the button is still down
buttonPressed = 0;
for (t = 0; t<nrButtons;t++) {
if (digitalRead(buttons[t]) == 0) {buttonPressed = (t + 1);}
}
}
return lastPressedButton;
}
void setup() {
Serial.begin(115200);
lcd.begin(16,2);
lcd.clear();
for (t=0;t<nrButtons;t++) {
pinMode(buttons[t],INPUT_PULLUP);
}
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9,OUTPUT);
lcd.setCursor(0,0); lcd.print(" Hello");
delay(1000);
updateMenu();
}
void loop() {
switch (LEDone) {
case 0:
digitalWrite(9, LOW);
break;
case 1:
digitalWrite(9, HIGH);
break;
}
switch (LEDtwo) {
case 0:
digitalWrite(10, LOW);
break;
case 1:
digitalWrite(10, HIGH);
break;
}
switch (LEDthree) {
case 0:
digitalWrite(11, LOW);
break;
case 1:
digitalWrite(11, HIGH);
break;
}
switch (LEDfour) {
case 0:
digitalWrite(12, LOW);
break;
case 1:
digitalWrite(12, HIGH);
break;
}
pressedButton = checkButtonPress();
if (pressedButton != 0) {
switch (pressedButton) {
case 1:
possiblePosScroll = (possiblePosScroll + 1) % possiblePosCount; // Scroll
break;
case 2:
currentPos = possiblePos[possiblePosScroll]; // Okay
break;
case 3:
currentPos = currentPosParent; // Back
possiblePosScroll = 0;
break;
}
updateMenu();
}
delay(200);
}
String mid(String str, int start, int len) { //izpis substringa
int t = 0;
String u = "";
for (t = 0; t < len;t++) {
u = u + str.charAt(t+start-1);
}
return u;
}
int inStrRev(String str,String chr) {
int t = str.length()-1;
int u = 0;
while (t>-1) {
if (str.charAt(t)==chr.charAt(0)) {
u = t+1;t = -1;
}
t = t - 1;
}
return u;
}
int len(String str) {
return str.length();
}
uno:A5.2
uno:A4.2
uno:AREF
uno:GND.1
uno:13
uno:12
uno:11
uno:10
uno:9
uno:8
uno:7
uno:6
uno:5
uno:4
uno:3
uno:2
uno:1
uno:0
uno:IOREF
uno:RESET
uno:3.3V
uno:5V
uno:GND.2
uno:GND.3
uno:VIN
uno:A0
uno:A1
uno:A2
uno:A3
uno:A4
uno:A5
btn1:1.l
btn1:2.l
btn1:1.r
btn1:2.r
btn2:1.l
btn2:2.l
btn2:1.r
btn2:2.r
btn3:1.l
btn3:2.l
btn3:1.r
btn3:2.r
led1:A
led1:C
r2:1
r2:2
r1:1
r1:2
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
led2:A
led2:C
led3:A
led3:C
led4:A
led4:C
r3:1
r3:2
r4:1
r4:2
r5:1
r5:2