Switch Case mit Bedingung verlassen

Hallo, ich habe mir für ein Schulprojekt ein kleines Menü auf dem Arduino Uno angelegt durch das ich mit zwei Tastern hoch und runter steuern kann. Mit einem dritten Taster, wähle ich dann die entsprechenden Menü Punkte aus. Das Ganze wird auf einem 16x2 LCD Display mit I2C Backpack angezeigt.
Im Moment ist es noch so, dass man 5 Sekunden in dem Menüpunkt steht und dann automatisch wieder ins Ausgangsmenü kommt.

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

LiquidCrystal_I2C lcd(0x27, 16, 2);

int upButton = 10;
int downButton = 11;
int selectButton = 12;
int menu = 1;

void setup() {
  lcd.begin();
  lcd.backlight();
  pinMode(upButton, INPUT_PULLUP);
  pinMode(downButton, INPUT_PULLUP);
  pinMode(selectButton, INPUT_PULLUP);
  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));
  }

  input_val = analogRead(LDR);
}

void updateMenu() {
  switch (menu) {
    case 0:
      menu = 1;
      break;
    case 1:
      lcd.clear();
      lcd.print(">Menu1");
      lcd.setCursor(0, 1);
      lcd.print(" Menu2");
      break;
    case 2:
      lcd.clear();
      lcd.print(" Menu1");
      lcd.setCursor(0, 1);
      lcd.print(">Menu2");
      break;
    case 3:
      lcd.clear();
      lcd.print(">Menu3");
      lcd.setCursor(0, 1);
      lcd.print(" Menu4");
      break;
    case 4:
      lcd.clear();
      lcd.print(" Menu3");
      lcd.setCursor(0, 1);
      lcd.print(">Menu4");
      break;
    case 5:
      menu = 4;
      break;
  }
}

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

void action1() {
  lcd.clear();
  lcd.print("Menu1:");
  delay(5000);
}
void action2() {
  lcd.clear();
  lcd.print("Menu2:");
  delay(5000);
}
void action3() {
  lcd.clear();
  lcd.print("Menu3:");
  delay(5000);
}
void action4() {
  lcd.clear();
  lcd.print("Menu4:");
  delay(5000);
}

Nun möchte ich es aber so haben das man erst wieder zurück kommt, nachdem man den "Select" Taster erneut betätigt. Habe schon ein bisschen was mit While-Schleifen ausprobiert, was bis jetzt aber noch nicht so richtig funktionieren wollte.
Kann mir da eventuell jemand behilflich sein?

So wird das nichts. Du musst anders denken und einen Zustandsautomaten programmieren. Und nicht-blockierend ohne delay()

loop() ist schon eine Schleife. Mehr braucht man nicht. Je nach dem aktuellen Zustand kann man dann andere Dinge tun. Oder auch nichts.

Hallo,

genau. Im Grunde musst du nur deine Taster entprellen und auf den Pegelwechsel der Taster reagieren. Dabei lernst du den Umgang mit millis. Wenn gar nichts geht nimm die Bounce2 Lib für die Taster. Danach alle delays aus dem Sketch werfen und nur noch mit den Zustandsänderungen der Taster usw. arbeiten. Ob du mit den Zustandsänderungen einen Zähler inkrementierst oder durch ein Menü springst ist dann Jacke wie Hose.

@TO
... wo schon ein neuer Thread angefangen wurde - geht's hier auch Mal weiter?
Oder zumindest, daß sich Das hier erledigt hat?

Oh sorry, hatte das aus den Augen verloren.^^ Das hier hat sich erledigt.
Danke für die Hilfe.