Servus, ich mache gerade ein Projekt für die Schule, und ich komme beim Untermenüs machen nicht mehr weiter. Bis jetzt habe ich ein normales Menü erstellt bei dem man Hoch und Runter gehen kann plus Enter drücken kann. Dann kommt man in ein Untermenü, welches aber nach einer gewissen Zeit wieder zurück geht, da ich noch kein Backbuttonprogrammiert habe.
Wie es aussehen sollte:
-Backbutton so programmieren, dass ich aus dem Untermenü in das Main Menü zurück komme
-Untermenü so programmieren, dass ich die hoch und Runter Buttons auch da benutzten kann
-dass ich die verschiedenen Menüpunkte auch auswählen kann, da dann Aktionen wie eine Led. soll angehen auch programmieren will.
Bin neu:) bitte um Hilfe.
LG Felix
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 4);
int upButton = 35;
int downButton = 39;
int selectButton = 30;
int backButton = 32;
int menu = 1;
int LedOut1 = 29;
int LedOut2 = 28;
int LedOut3 = 27;
int LedOut4 = 26;
int Timer = 25;
int Timer_1 = 24;
int Timer2 = 23;
int Timer3 = 22;
void setup() {
lcd.init();
lcd.backlight();
pinMode(upButton, INPUT_PULLUP);
pinMode(downButton, INPUT_PULLUP);
pinMode(selectButton, INPUT_PULLUP);
pinMode(backButton, INPUT_PULLUP);
pinMode(LedOut1, OUTPUT);
pinMode(LedOut2, OUTPUT);
pinMode(LedOut3, OUTPUT);
pinMode(LedOut4, OUTPUT);
updateMenu();
}
void loop() {
if (!digitalRead(downButton)) {
menu++;
updateMenu();
delay(100);
while (!digitalRead(downButton))
;
}
if (!digitalRead(upButton)) {
menu--;
updateMenu();
delay(100);
while (!digitalRead(upButton))
;
}
if (!digitalRead(selectButton)) {
executeAction();
updateMenu();
delay(100);
while (!digitalRead(selectButton))
;
}
if (!digitalRead(backButton)) {
executeAction();
//Back-Button programmieren, so dass man ein Untermenü hat und da auch wieder raus kommt + einstellen dass man den beim normalen menü benutzten kann, aber es einfach wieder an anfang springt.
updateMenu();
delay(100);
while (!digitalRead(backButton))
;
}
}
void updateMenu() {
switch (menu) {
case 0:
menu = 1;
break;
case 1:
lcd.clear();
lcd.print(">Solarenergie");
lcd.setCursor(0, 1);
lcd.print(" Windenergie");
lcd.setCursor(0, 2);
lcd.print(" Garagentor");
lcd.setCursor(0, 3);
lcd.print(" Luftqualitaet");
break;
case 2:
lcd.clear();
lcd.print(" Solarenergie");
lcd.setCursor(0, 1);
lcd.print(">Windenergie");
lcd.setCursor(0, 2);
lcd.print(" Garagentor");
lcd.setCursor(0, 3);
lcd.print(" Luftqualitaet");
break;
case 3:
lcd.clear();
lcd.print(" Solarenergie");
lcd.setCursor(0, 1);
lcd.print(" Windenergie");
lcd.setCursor(0, 2);
lcd.print(">Garagentor");
lcd.setCursor(0, 3);
lcd.print(" Luftqualitaet");
break;
case 4:
lcd.clear();
lcd.print(" Solarenergie");
lcd.setCursor(0, 1);
lcd.print(" Windenergie");
lcd.setCursor(0, 2);
lcd.print(" Garagentor");
lcd.setCursor(0, 3);
lcd.print(">Luftqualitaet");
break;
case 5:
lcd.clear();
lcd.print(">Strassenlaternen");
lcd.setCursor(0, 1);
lcd.print(" LED Haus");
lcd.setCursor(0, 2);
lcd.print(" Ampel");
lcd.setCursor(0, 3);
lcd.print(" Akkustand");
break;
case 6:
lcd.clear();
lcd.print(" Strassenlaternen");
lcd.setCursor(0, 1);
lcd.print(">LED Haus");
lcd.setCursor(0, 2);
lcd.print(" Ampel");
lcd.setCursor(0, 3);
lcd.print(" Akkustand");
break;
case 7:
lcd.clear();
lcd.print(" Strassenlaternen");
lcd.setCursor(0, 1);
lcd.print(" LED Haus");
lcd.setCursor(0, 2);
lcd.print(">Ampel");
lcd.setCursor(0, 3);
lcd.print(" Akkustand");
break;
case 8:
lcd.clear();
lcd.print(" Strassenlaternen");
lcd.setCursor(0, 1);
lcd.print(" LED Haus");
lcd.setCursor(0, 2);
lcd.print(" Ampel");
lcd.setCursor(0, 3);
lcd.print(">Akkustand");
case 9:
menu = 8;
break;
}
}
void executeAction() {
switch (menu) {
case 1:
action1();
break;
case 2:
action2();
break;
case 3:
action3();
break;
case 4:
action4();
break;
case 5:
action5();
break;
case 6:
action6();
break;
case 7:
action7();
break;
case 8:
action8();
break;
}
}
void action1() {
lcd.clear();
lcd.print(">Stromstaerke");
lcd.setCursor(0, 1);
lcd.print(" Spannung");
lcd.clear();
lcd.print(" Stromstaerke"); //aus Main-Board2.0 die Spannungs und Strommesser hier hineinfügen
lcd.setCursor(0, 1);
lcd.print(">Spannung");
//ist wahrscheinlich wie lange das Bild angezigt werden soll, bevor es wieder ins Menü zurück geht
}
void action2() {
lcd.clear();
lcd.print(">Stromstaerke");
lcd.setCursor(0, 1);
lcd.print(" Spannung");
lcd.clear();
lcd.print(" Stromstaerke");
lcd.setCursor(0, 1); //aus Main-Board2.0 die Spannungs und Strommesser hier hineinfügen
lcd.print(">Spannung");
Timer++;
if (Timer == 10) {
Timer = 0;
}
delay(1500);
}
void action3() {
lcd.clear();
lcd.print(">oeffnen");
lcd.setCursor(0, 1);
lcd.print(" schließen");
lcd.clear();
lcd.print(" oeffnen");
lcd.setCursor(0, 1); //Servo Motor anschauen, verstehen und Programmieren, new sketch first
lcd.print(">schließen");
Timer++;
if (Timer == 10) {
Timer = 0;
}
delay(1500);
}
void action4() {
lcd.clear();
// Sensorwert = analogRead(0);
//Sensorwert = (sensorwert / 6);
Serial.println("Luftqualitaet : ");
//Serial.println(Sensorwert, DEC); //schauen obs funktionier mit seriel.print wenn nicht nochmal im Main-board2.0 nachschauen
//Serial.println();
Timer++;
if (Timer == 10) {
Timer = 0;
}
delay(1500);
}
void action5() {
lcd.clear();
lcd.print(">LED's an");
lcd.setCursor(0, 1);
lcd.print(" LED's aus");
lcd.clear();
lcd.print(" LED's an");
lcd.setCursor(0, 1);
lcd.print(">LED's aus");
Timer++; //oder wenn der LDR anschlägt dass es dunkel wird (Parallelgteschalten)
if (Timer == 10) {
Timer = 0;
}
delay(1500);
}
void action6() {
lcd.clear();
lcd.print(">LED's an");
lcd.setCursor(0, 1);
lcd.print(" LED's aus");
lcd.clear();
lcd.print(" LED's an");
lcd.setCursor(0, 1);
lcd.print(">LED's aus"); //oder wenn der LDR anschlägt dass es dunkel wird (Parallelgteschalten)
Timer++;
if (Timer == 10) {
Timer = 0;
}
delay(1500);
}
void action7() {
lcd.clear();
lcd.print("Akkustand: ");
lcd.setCursor(0, 1);
if (Timer == 10) { //Akkustand in Prozent anzeigen lassen, Wahrscheinlich über seriel.print etc.
Timer = 0;
}
delay(1500);
}
void action8() {
lcd.clear();
lcd.print("Akkustand: ");
lcd.setCursor(0, 1);
if (Timer == 10) { //Akkustand in Prozent anzeigen lassen, Wahrscheinlich über seriel.print etc.
Timer = 0;
}
delay(1500);
}