Menü mit untermenü für ein Modeldiorama

Hallo in die Runde ich brauchte mal einen schubser in die richtige Richtung

Die Menüs habe ich soweit fertig geschrieben menu als hauptmenü, menu1 als erstes untermenü für case 1 im menu
menu 2 für case 2 usw beim drücken vom selectButton komme ich aber immer in menu1 an

was mache ich falsch ?
if (!digitalRead(selectbutton)) && updatemenu(case ==1/2)
bringt mich nicht weiter
kann ich dort mit dem var/val befehl arbeiten also über leftButton/ rightButton die variable erhöhen countUp++/countDown--

und dan mit if (...)&& serial.printeln abfragen ?

modelbord.ino (6,4 KB)

Hallo
Zeige deinen Sketch damit wir sehen können wie wir dir helfen können.

hier der code ich habe gestern abend noch bischen geschrieben mit anderen worten bin selber auf die lösung gekommen bin trotzdem dankpar über tipps
DFRobotDFPlayerMini werde ich heute noch mit einarbeiten habe allerdings noch nicht alle sounddaten zusammen
PlayB2 /RightB2 und LeftB2 sind transistorsteuerungen um den Play/right und leftButton erst nutzen zu können wen sie auch gebraucht werden
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

int upButton = 12;
int downButton = 10;
int selectButton = 11;
int leftB = 13;
int rightB = 9;
int menu = 1;
int menu1 = 1;
int PlayB = 7;
int PlayB2 = 8;
int RightB2 = 6;
int LeftB2 =5;
int menu2 = 1;
int countUp =1;
int menu3 =1;
int menu4 =1;

void setup() {
lcd.init();
lcd.backlight();
Serial.begin(9600); // Verwende die serielle Schnittstelle, um die Nummer auszugeben
pinMode(upButton, INPUT_PULLUP);
pinMode(downButton, INPUT_PULLUP);
pinMode(selectButton, INPUT_PULLUP);
pinMode(rightB, INPUT_PULLUP);
pinMode(leftB,INPUT_PULLUP);
pinMode(PlayB, INPUT_PULLUP);
pinMode(PlayB2, OUTPUT);
pinMode(RightB2, OUTPUT);
pinMode(LeftB2, OUTPUT);
updatemenu4();
updatemenu3();
updatemenu2();
updatemenu1();
updatemenu();
int countUp();
}

void updatemenu() {
switch (menu) {
case 0:
menu = 1;
break;
case 1:
lcd.clear();
lcd.print(" MODELBORD");
lcd.setCursor(0, 1);
lcd.print(" ->Tiger1<-");
lcd.setCursor(0,2);
lcd.print("Sounds durch drucken ");
lcd.setCursor(0,3);
lcd.print(" von Enter anzeigen");
break;
case 2:
lcd.clear();
lcd.print(" MODELBORD");
lcd.setCursor(0, 1);
lcd.print("->Stuka/Junkers87<-");
lcd.setCursor(0,2);
lcd.print("Sounds durch drucken ");
lcd.setCursor(0,3);
lcd.print(" von Enter anzeigen");
break;
case 3:
lcd.clear();
lcd.print(" MODELBORD");
lcd.setCursor(0, 1);
lcd.print(" ->SDKFZ/251<-");
lcd.setCursor(0,2);
lcd.print("Sounds durch drucken ");
lcd.setCursor(0,3);
lcd.print(" von Enter anzeigen");
break;
case 4:
lcd.clear();
lcd.print(" MODELBORD");
lcd.setCursor(0, 1);
lcd.print(" ->FLAK36/PaK<-");
lcd.setCursor(0,2);
lcd.print("Sounds durch drucken ");
lcd.setCursor(0,3);
lcd.print(" von Enter anzeigen");
break;
case 5:
menu = 4;
break;
}
}

void updatemenu1(){
switch (menu1) {
case 0:
menu1 = 1;
break;

 case 1:
  lcd.clear();
  lcd.print(" ->Motor" );
  lcd.setCursor(0, 1);
  lcd.print("   Geschuetz");
  lcd.setCursor(0,2);
  lcd.print("   Turm");
  lcd.setCursor(0,3);
  lcd.print("   MG");
  break;
case 2:
  lcd.clear();
  lcd.print("   Motor" );
  lcd.setCursor(0, 1);
  lcd.print(" ->Geschuetz");
  lcd.setCursor(0,2);
  lcd.print("   Turm");
  lcd.setCursor(0,3);
  lcd.print("   MG");;
  break;
case 3:
  lcd.clear();
  lcd.print("   Motor" );
  lcd.setCursor(0, 1);
  lcd.print("   Geschuetz");
  lcd.setCursor(0,2);
  lcd.print(" ->Turm");
  lcd.setCursor(0,3);
  lcd.print("   MG");
  break;
case 4:
lcd.clear();
  lcd.print("   Motor" );
  lcd.setCursor(0, 1);
  lcd.print("   Geschuetz");
  lcd.setCursor(0,2);
  lcd.print("   Turm");
  lcd.setCursor(0,3);
  lcd.print(" ->MG");
break;
case 5:
 menu1 = 4;
  break;

}
}
void updatemenu2(){
switch (menu2) {
case 0:
menu2 = 1;
break;

 case 1:
  lcd.clear();
  lcd.print(" ->Motor" );
  lcd.setCursor(0, 1);
  lcd.print("   Flug");
  lcd.setCursor(0,2);
  lcd.print("   Bomben");
  lcd.setCursor(0,3);
  lcd.print("   MG");
  break;
case 2:
  lcd.clear();
  lcd.print("   Motor" );
  lcd.setCursor(0, 1);
  lcd.print(" ->Flug");
  lcd.setCursor(0,2);
  lcd.print("   Bomben");
  lcd.setCursor(0,3);
  lcd.print("   MG");;
  break;
case 3:
  lcd.clear();
  lcd.print("   Motor" );
  lcd.setCursor(0, 1);
  lcd.print("   Flug");
  lcd.setCursor(0,2);
  lcd.print(" ->Bomben");
  lcd.setCursor(0,3);
  lcd.print("   MG");
  break;
case 4:
lcd.clear();
  lcd.print("   Motor" );
  lcd.setCursor(0, 1);
  lcd.print("   Flug");
  lcd.setCursor(0,2);
  lcd.print("   Bomben");
  lcd.setCursor(0,3);
  lcd.print(" ->MG");
break;
case 5:
 menu2 = 4;
  break;

}
}

void updatemenu3(){
switch (menu3) {
case 0:
menu3 = 1;
break;

 case 1:
  lcd.clear();
  lcd.print(" ->Anlassen" );
  lcd.setCursor(0, 1);
  lcd.print("   Motor");
  lcd.setCursor(0,2);
  lcd.print("   Fahrt");
  lcd.setCursor(0,3);
  lcd.print("   MG");
  break;
case 2:
  lcd.clear();
  lcd.print("   Anlassen" );
  lcd.setCursor(0, 1);
  lcd.print(" ->Motor");
  lcd.setCursor(0,2);
  lcd.print("   Fahrt");
  lcd.setCursor(0,3);
  lcd.print("   MG");;
  break;
case 3:
  lcd.clear();
  lcd.print("   Anlassen" );
  lcd.setCursor(0, 1);
  lcd.print("   Motor");
  lcd.setCursor(0,2);
  lcd.print(" ->Fahrt");
  lcd.setCursor(0,3);
  lcd.print("   MG");
  break;
case 4:
lcd.clear();
  lcd.print("   Anlassen" );
  lcd.setCursor(0, 1);
  lcd.print("   Motor");
  lcd.setCursor(0,2);
  lcd.print("   Fahrt");
  lcd.setCursor(0,3);
  lcd.print(" ->MG");
break;
case 5:
 menu3 = 4;
  break;

}
}

void updatemenu4(){
switch (menu4) {
case 0:
menu4 = 1;
break;

 case 1:
  lcd.clear();
  lcd.print(" ->Drehen" );
  lcd.setCursor(0, 1);
  lcd.print("   Feuerbefehl");
  lcd.setCursor(0,2);
  lcd.print("   Geschuetz");
  lcd.setCursor(0,3);
  lcd.print("   Explosion");
  break;
case 2:
  lcd.clear();
  lcd.print("   Drehen" );
  lcd.setCursor(0, 1);
  lcd.print(" ->Feuerbefehl");
  lcd.setCursor(0,2);
  lcd.print("   Geschuetz");
  lcd.setCursor(0,3);
  lcd.print("   Explosion");;
  break;
case 3:
  lcd.clear();
  lcd.print("   Drehen" );
  lcd.setCursor(0, 1);
  lcd.print("   Feuerbefehl");
  lcd.setCursor(0,2);
  lcd.print(" ->Geschuetz");
  lcd.setCursor(0,3);
  lcd.print("   Explosion");
  break;
case 4:
lcd.clear();
  lcd.print("   Drehen" );
  lcd.setCursor(0, 1);
  lcd.print("   Feuerbefehl");
  lcd.setCursor(0,2);
  lcd.print("   Geschuetz");
  lcd.setCursor(0,3);
  lcd.print(" ->Explosion");
break;
case 5:
 menu2 = 4;
  break;

}
}

void executeAction() {
switch (menu1) {
case 1:
action1();
break;
case 2:
action2();
break;
case 3:
action3();
break;
case 4:
action4();
break;
}
}

void action1() {
lcd.clear();
lcd.print("Play Motor Sound");
delay(6000);
digitalWrite(PlayB2, LOW);
digitalWrite(LeftB2, LOW);
digitalWrite(RightB2, LOW);
}
void action2() {
lcd.clear();
lcd.print("Play Geschuetz Sound");
delay(6000);
digitalWrite(PlayB2, LOW);
digitalWrite(LeftB2, LOW);
digitalWrite(RightB2, LOW);
}
void action3() {
lcd.clear();
lcd.print("Play Turm Sound");
delay(6000);
digitalWrite(PlayB2, LOW);
digitalWrite(LeftB2, LOW);
digitalWrite(RightB2, LOW);
}
void action4() {
lcd.clear();
lcd.print("Play MG Sound");
delay(6000);
digitalWrite(PlayB2, LOW);
digitalWrite(LeftB2, LOW);
digitalWrite(RightB2, LOW);
}
void loop() {
if (!digitalRead(rightB)){
menu++;
updatemenu();
delay(100);
while (!digitalRead(rightB));
digitalWrite(LeftB2, LOW);
digitalWrite(RightB2, LOW);
digitalWrite(PlayB2, LOW);
countUp++;

}
if (!digitalRead(leftB)){
menu--;
updatemenu();
delay(200);
while(!digitalRead(leftB));
digitalWrite(LeftB2, LOW);
digitalWrite(RightB2, LOW);
digitalWrite(PlayB2, LOW);
countUp--;

}
if (!digitalRead(selectButton) && countUp ==1)
{
updatemenu1();
delay(200);
while (!digitalRead(selectButton));
digitalWrite(PlayB2, HIGH);
digitalWrite(LeftB2, HIGH);
digitalWrite(RightB2, HIGH);
}

else if(!digitalRead(selectButton) && countUp == 2) {
  updatemenu2();
  delay(200);
  while(!digitalRead(selectButton));
  digitalWrite(PlayB2, HIGH);
  digitalWrite(LeftB2, HIGH);
  digitalWrite(RightB2, HIGH);
}
  
  else if(!digitalRead(selectButton) && countUp == 3) {
  updatemenu3();
  delay(200);
  while(!digitalRead(selectButton));
  digitalWrite(PlayB2, HIGH);
  digitalWrite(LeftB2, HIGH);
  digitalWrite(RightB2, HIGH);
  }
  
  else if(!digitalRead(selectButton) && countUp == 4) {
  updatemenu4();
  delay(200);
  while(!digitalRead(selectButton));
  digitalWrite(PlayB2, HIGH);
  digitalWrite(LeftB2, HIGH);
  digitalWrite(RightB2, HIGH);
      
}

if (!digitalRead(downButton)&& countUp == 1){
menu1++;
updatemenu1();
delay(200);
while(!digitalRead(downButton));
}
else if (!digitalRead(downButton)&& countUp == 2){
menu2++;
updatemenu2();
delay(200);
while(!digitalRead(downButton));
}
else if (!digitalRead(downButton)&& countUp == 3){
menu3++;
updatemenu3();
delay(200);
while(!digitalRead(downButton));
}
else if (!digitalRead(downButton)&& countUp == 4){
menu4++;
updatemenu4();
delay(200);
while(!digitalRead(downButton));
}

if (!digitalRead(upButton) && countUp == 1){
menu1--;
updatemenu1();
delay(200);
while(!digitalRead(upButton));
}
else if (!digitalRead(upButton)&& countUp == 2){
menu2--;
updatemenu2();
delay(200);
while(!digitalRead(upButton));
}
else if (!digitalRead(upButton)&& countUp == 3){
menu3--;
updatemenu3();
delay(200);
while(!digitalRead(upButton));
}
else if (!digitalRead(upButton)&& countUp == 4){
menu4--;
updatemenu4();
delay(200);
while(!digitalRead(upButton));
}

if (!digitalRead(PlayB)){
executeAction();
updatemenu();
delay(200);
while(!digitalRead(PlayB));
}
Serial.println(countUp); // Gibt den aktuellen Stand von countUp aus
}

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

int upButton = 12;
int downButton = 10;
int selectButton = 11;
int leftB = 13;
int rightB = 9;
int menu = 1;
int menu1 = 1;
int PlayB = 7;
int PlayB2 = 8;
int RightB2 = 6;
int LeftB2 =5;
int menu2 = 1;
int countUp =1;
int menu3 =1;
int menu4 =1;




void setup() {
lcd.init();
lcd.backlight();
Serial.begin(9600); // Verwende die serielle Schnittstelle, um die Nummer auszugeben
pinMode(upButton, INPUT_PULLUP);
pinMode(downButton, INPUT_PULLUP);
pinMode(selectButton, INPUT_PULLUP);
pinMode(rightB, INPUT_PULLUP);
pinMode(leftB,INPUT_PULLUP);
pinMode(PlayB, INPUT_PULLUP);
pinMode(PlayB2, OUTPUT);
pinMode(RightB2, OUTPUT);
pinMode(LeftB2, OUTPUT);
updatemenu4();
updatemenu3();
updatemenu2();
updatemenu1();
updatemenu();
int countUp(); 
}



void updatemenu() {
switch (menu) {
  case 0:
    menu = 1;
    break;
  case 1:
    lcd.clear();
    lcd.print("     MODELBORD");
    lcd.setCursor(0, 1);
    lcd.print("    ->Tiger1<-");
    lcd.setCursor(0,2);
    lcd.print("Sounds durch drucken ");
    lcd.setCursor(0,3);
    lcd.print(" von Enter anzeigen");
    break;
  case 2:
    lcd.clear();
    lcd.print("     MODELBORD");
    lcd.setCursor(0, 1);
    lcd.print("->Stuka/Junkers87<-");
    lcd.setCursor(0,2);
    lcd.print("Sounds durch drucken ");
    lcd.setCursor(0,3);
    lcd.print(" von Enter anzeigen");
    break;
  case 3:
    lcd.clear();
    lcd.print("     MODELBORD");
    lcd.setCursor(0, 1);
    lcd.print("   ->SDKFZ/251<-");
    lcd.setCursor(0,2);
    lcd.print("Sounds durch drucken ");
    lcd.setCursor(0,3);
    lcd.print(" von Enter anzeigen");
    break;
  case 4:
    lcd.clear();
    lcd.print("     MODELBORD");
    lcd.setCursor(0, 1);
    lcd.print("  ->FLAK36/PaK<-");
    lcd.setCursor(0,2);
    lcd.print("Sounds durch drucken ");
    lcd.setCursor(0,3);
    lcd.print(" von Enter anzeigen");
    break;
  case 5:
    menu = 4;
    break;
}
}





void updatemenu1(){
switch (menu1) {
  case 0:
  menu1 = 1;
  break;
  
   case 1:
    lcd.clear();
    lcd.print(" ->Motor" );
    lcd.setCursor(0, 1);
    lcd.print("   Geschuetz");
    lcd.setCursor(0,2);
    lcd.print("   Turm");
    lcd.setCursor(0,3);
    lcd.print("   MG");
    break;
  case 2:
    lcd.clear();
    lcd.print("   Motor" );
    lcd.setCursor(0, 1);
    lcd.print(" ->Geschuetz");
    lcd.setCursor(0,2);
    lcd.print("   Turm");
    lcd.setCursor(0,3);
    lcd.print("   MG");;
    break;
  case 3:
    lcd.clear();
    lcd.print("   Motor" );
    lcd.setCursor(0, 1);
    lcd.print("   Geschuetz");
    lcd.setCursor(0,2);
    lcd.print(" ->Turm");
    lcd.setCursor(0,3);
    lcd.print("   MG");
    break;
  case 4:
  lcd.clear();
    lcd.print("   Motor" );
    lcd.setCursor(0, 1);
    lcd.print("   Geschuetz");
    lcd.setCursor(0,2);
    lcd.print("   Turm");
    lcd.setCursor(0,3);
    lcd.print(" ->MG");
  break;
  case 5:
   menu1 = 4;
    break;
}
}
void updatemenu2(){
switch (menu2) {
  case 0:
  menu2 = 1;
  break;
  
   case 1:
    lcd.clear();
    lcd.print(" ->Motor" );
    lcd.setCursor(0, 1);
    lcd.print("   Flug");
    lcd.setCursor(0,2);
    lcd.print("   Bomben");
    lcd.setCursor(0,3);
    lcd.print("   MG");
    break;
  case 2:
    lcd.clear();
    lcd.print("   Motor" );
    lcd.setCursor(0, 1);
    lcd.print(" ->Flug");
    lcd.setCursor(0,2);
    lcd.print("   Bomben");
    lcd.setCursor(0,3);
    lcd.print("   MG");;
    break;
  case 3:
    lcd.clear();
    lcd.print("   Motor" );
    lcd.setCursor(0, 1);
    lcd.print("   Flug");
    lcd.setCursor(0,2);
    lcd.print(" ->Bomben");
    lcd.setCursor(0,3);
    lcd.print("   MG");
    break;
  case 4:
  lcd.clear();
    lcd.print("   Motor" );
    lcd.setCursor(0, 1);
    lcd.print("   Flug");
    lcd.setCursor(0,2);
    lcd.print("   Bomben");
    lcd.setCursor(0,3);
    lcd.print(" ->MG");
  break;
  case 5:
   menu2 = 4;
    break;
}
}

void updatemenu3(){
switch (menu3) {
  case 0:
  menu3 = 1;
  break;
  
   case 1:
    lcd.clear();
    lcd.print(" ->Anlassen" );
    lcd.setCursor(0, 1);
    lcd.print("   Motor");
    lcd.setCursor(0,2);
    lcd.print("   Fahrt");
    lcd.setCursor(0,3);
    lcd.print("   MG");
    break;
  case 2:
    lcd.clear();
    lcd.print("   Anlassen" );
    lcd.setCursor(0, 1);
    lcd.print(" ->Motor");
    lcd.setCursor(0,2);
    lcd.print("   Fahrt");
    lcd.setCursor(0,3);
    lcd.print("   MG");;
    break;
  case 3:
    lcd.clear();
    lcd.print("   Anlassen" );
    lcd.setCursor(0, 1);
    lcd.print("   Motor");
    lcd.setCursor(0,2);
    lcd.print(" ->Fahrt");
    lcd.setCursor(0,3);
    lcd.print("   MG");
    break;
  case 4:
  lcd.clear();
    lcd.print("   Anlassen" );
    lcd.setCursor(0, 1);
    lcd.print("   Motor");
    lcd.setCursor(0,2);
    lcd.print("   Fahrt");
    lcd.setCursor(0,3);
    lcd.print(" ->MG");
  break;
  case 5:
   menu3 = 4;
    break;
}
}

void updatemenu4(){
switch (menu4) {
  case 0:
  menu4 = 1;
  break;
  
   case 1:
    lcd.clear();
    lcd.print(" ->Drehen" );
    lcd.setCursor(0, 1);
    lcd.print("   Feuerbefehl");
    lcd.setCursor(0,2);
    lcd.print("   Geschuetz");
    lcd.setCursor(0,3);
    lcd.print("   Explosion");
    break;
  case 2:
    lcd.clear();
    lcd.print("   Drehen" );
    lcd.setCursor(0, 1);
    lcd.print(" ->Feuerbefehl");
    lcd.setCursor(0,2);
    lcd.print("   Geschuetz");
    lcd.setCursor(0,3);
    lcd.print("   Explosion");;
    break;
  case 3:
    lcd.clear();
    lcd.print("   Drehen" );
    lcd.setCursor(0, 1);
    lcd.print("   Feuerbefehl");
    lcd.setCursor(0,2);
    lcd.print(" ->Geschuetz");
    lcd.setCursor(0,3);
    lcd.print("   Explosion");
    break;
  case 4:
  lcd.clear();
    lcd.print("   Drehen" );
    lcd.setCursor(0, 1);
    lcd.print("   Feuerbefehl");
    lcd.setCursor(0,2);
    lcd.print("   Geschuetz");
    lcd.setCursor(0,3);
    lcd.print(" ->Explosion");
  break;
  case 5:
   menu2 = 4;
    break;
}
}

void executeAction() {
switch (menu1) {
  case 1:
    action1();
    break;
  case 2:
    action2();
    break;
  case 3:
    action3();
    break;
  case 4:
    action4();
    break;
}
}

void action1() {
lcd.clear();
lcd.print("Play Motor Sound");
delay(6000);
digitalWrite(PlayB2, LOW);
digitalWrite(LeftB2, LOW);
  digitalWrite(RightB2, LOW);
}
void action2() {
lcd.clear();
lcd.print("Play Geschuetz Sound");
delay(6000);
digitalWrite(PlayB2, LOW);
digitalWrite(LeftB2, LOW);
  digitalWrite(RightB2, LOW);
}
void action3() {
lcd.clear();
lcd.print("Play Turm Sound");
delay(6000);
digitalWrite(PlayB2, LOW);
digitalWrite(LeftB2, LOW);
  digitalWrite(RightB2, LOW);
}
void action4() {
lcd.clear();
lcd.print("Play MG Sound");
delay(6000);
digitalWrite(PlayB2, LOW);
digitalWrite(LeftB2, LOW);
  digitalWrite(RightB2, LOW);
}
void loop() {
if (!digitalRead(rightB)){
  menu++;
  updatemenu();
  delay(100);
  while (!digitalRead(rightB));
  digitalWrite(LeftB2, LOW);
  digitalWrite(RightB2, LOW);
  digitalWrite(PlayB2, LOW);
  countUp++;
  
}
if (!digitalRead(leftB)){
  menu--;
  updatemenu();
  delay(200);
  while(!digitalRead(leftB));
  digitalWrite(LeftB2, LOW);
  digitalWrite(RightB2, LOW);
  digitalWrite(PlayB2, LOW);
  countUp--;
  
}
if (!digitalRead(selectButton) && countUp ==1) 
 {
  updatemenu1();
  delay(200);
  while (!digitalRead(selectButton));
  digitalWrite(PlayB2, HIGH);
  digitalWrite(LeftB2, HIGH);
  digitalWrite(RightB2, HIGH);
  }
  
  else if(!digitalRead(selectButton) && countUp == 2) {
    updatemenu2();
    delay(200);
    while(!digitalRead(selectButton));
    digitalWrite(PlayB2, HIGH);
    digitalWrite(LeftB2, HIGH);
    digitalWrite(RightB2, HIGH);
  }
    
    else if(!digitalRead(selectButton) && countUp == 3) {
    updatemenu3();
    delay(200);
    while(!digitalRead(selectButton));
    digitalWrite(PlayB2, HIGH);
    digitalWrite(LeftB2, HIGH);
    digitalWrite(RightB2, HIGH);
    }
    
    else if(!digitalRead(selectButton) && countUp == 4) {
    updatemenu4();
    delay(200);
    while(!digitalRead(selectButton));
    digitalWrite(PlayB2, HIGH);
    digitalWrite(LeftB2, HIGH);
    digitalWrite(RightB2, HIGH);
        
  }
 


if (!digitalRead(downButton)&& countUp == 1){
  menu1++;
  updatemenu1();
  delay(200);
  while(!digitalRead(downButton));
}
else if (!digitalRead(downButton)&& countUp == 2){
  menu2++;
  updatemenu2();
  delay(200);
  while(!digitalRead(downButton));
}
 else if (!digitalRead(downButton)&& countUp == 3){
  menu3++;
  updatemenu3();
  delay(200);
  while(!digitalRead(downButton));
}
 else if (!digitalRead(downButton)&& countUp == 4){
  menu4++;
  updatemenu4();
  delay(200);
  while(!digitalRead(downButton));
}


if (!digitalRead(upButton) && countUp == 1){
  menu1--;
  updatemenu1();
  delay(200);
  while(!digitalRead(upButton));
}
else if  (!digitalRead(upButton)&& countUp == 2){
  menu2--;
  updatemenu2();
  delay(200);
  while(!digitalRead(upButton));
}
else if  (!digitalRead(upButton)&& countUp == 3){
  menu3--;
  updatemenu3();
  delay(200);
  while(!digitalRead(upButton));
}
else if  (!digitalRead(upButton)&& countUp == 4){
  menu4--;
  updatemenu4();
  delay(200);
  while(!digitalRead(upButton));
}

if (!digitalRead(PlayB)){
  executeAction();
  updatemenu();
  delay(200);
  while(!digitalRead(PlayB));
}
 Serial.println(countUp); // Gibt den aktuellen Stand von countUp aus
}


 


Ich sehe einige Probleme:

void action2() {
lcd.clear();
lcd.print("Play Geschuetz Sound");
delay(6000);

Spare RAM mit dem F() Makro.

lcd.print("Play Geschuetz Sound");

verbraucht RAM

lcd.print(F(("Play Geschuetz Sound"));

verbraucht keine RAM.

lcd.clear(); ist langsam. Es ist besser daß Du Leerzeichen druckst also daß der Text immer eine konstante Länge hat aufgefüllt mit Leerzeichen.

delay(6000); blockiert den Arduino für 6 Sekunden. Dieser reagiert auf gar nichts mehr. auch auf keine Tasteneingaben. Willst Du das?

Du schreibst viel Kode vielfach. Man kann da viel sparen indem man arrays verwendet und zB nur ein switch für alle Menus.

Grüße Uwe

mit dem While blockierst Du den Arduino solange die Taste gedrückt ist. Das ist unschön.

Grüße Uwe

das mit dem ram wuste ich nicht und werde ich gleich mal umsetzen
das mit dem clear befehl habe ich schoin öfters gelesen und wolte ich auch noch umsetzen
sprich lcd:clear raus und dafür lcd.print(LEHRZEICHEN); rein

ja das mit dem delay 6000 ist so gewolt da in der zeit über den dfplayermini ein passender sound laufen soll diese werte werden noch auf die länge des jeweilingen soundfile´s angepast

da ich noch blutiger anfänger bin würde ich erst mal so lassen und mich noch mal ransetzen wen ich mehr erfahrung habe

damit möchte ich ein zufäliges doppeln verhindern taster bekommt beim drücken und loslassen eventuel ein zweites signal und scollt zwei punkte weiter was ich aber nicht möchte

das er dadurch langsamer wird kann ich mit leben

Hallo
Ich habe deinen Sketch überflogen und ich denke, dass der Sketch ein gutes Beispiel für ein organisch gewachsenes Programm abgibt. Oder kurz gesagt Sketch alá Bolognese :slight_smile:
Was kann man anders und besser machen?
Ich benutzte gerne das EVA Modell um damit umfangreichere Programme zu struktuieren.

  1. E=Eingabe --> Tasten entprellen und einlesen
  2. V=Verarbeitung --> Tastenauswahl bewerten
  3. A=Ausgabe --> Ausgabe Sound und Menue basierend auf Tastenauswahlbewertung.

Die Programmiersprache C++ bringt für diese Umsetzung sehr geeignete Elemete mit, um diese strukturierte Vorgehensweise umzusetzen.
Wiederkehrende Datenstrukturen, zb. für die LCD-Menues, werden einmal in einem STRUCT deklariert und n-Mal genutzt. Auch die gezielte Anwending von ARRAY´s erleichert die Umsetzung. Und eine TimerFunktion ist extemst sinnvoll um die blockierenden DELAY´s zu vermeiden.
Am besten Du nimmst bunte Stifte und ein Stück Papier und zeichnet alle Daten- und Kontrollflüße einmal und/oder auch mehrfach auf, um eine strukturierte Lösung zu erhalten, bevor es an die Codierung geht.
Viel Erfolg und Spass bei der Umsetzung.

Ich bin faul, lasse den µC das machen und nutze den Pin BUSY:

  bool busy = !digitalRead(pinBUSY); // BUSY: LOW means playing