Problema con sottomenu

salve a tutti,
spero di non aver sbagliato qualche sosa sul caricare il mio primo codice qui...
Sto cercando di creare un progetto sketch, una lavatrice. Sto usando la programmazioni a stati, ho creato un menu' principale il tutto comandato da un encoder (codice che devo perfezionare).
il mio problema sono i sotto menu, non riesco a farlo funzionare, entro nel sottomenu creato anchesso con swtch case ma se provo a selezionare mi esce fuori nel menu principale.
vi posto il codice

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

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

// Caratteri LCD
byte freccia[8]  = {B00000, B01110, B01110, B01110, B11111, B01110, B00100}; 
byte pallino[8] = {B00000, B00000, B00110, B01111, B01111, B00110, B00000};

//void LavaggioRapido();

const int upButton = 3;
const int downButton = 2;
const int selectButton = 8;

 int stato = 1 ;


int stopstato = 4;
int start = 5;


int pin2=9;   //Entrada 2 del L293D
int pin7=10;  //Entrada 7 del L293D

int buzzer=12; //buzzer

void setup() {
  Serial.begin(9600);
  lcd.begin(20,4);
  lcd.backlight();
  lcd.createChar(0, pallino);
  lcd.createChar(1, freccia);
  
  pinMode(upButton, INPUT_PULLUP);
  pinMode(downButton, INPUT_PULLUP);
  pinMode(selectButton, INPUT_PULLUP);
   pinMode(stopstato, INPUT);
    pinMode(start, INPUT);
    pinMode(53, OUTPUT);
 lavaggiMenu();

}
 

}
void loop() {

   if (!digitalRead(downButton)){
    //delay(50);
    stato++;
    lavaggiMenu();    
    delay(100);
    while (!digitalRead(downButton));
  }
 if (!digitalRead(upButton)){
    delay(100);
    stato--;
    lavaggiMenu();
    delay(100);
    while(!digitalRead(upButton));
  }
  if (!digitalRead(selectButton)){// tasto encoder seleziona
 
     lavaggiMenu();
      scelta();     
    delay(100);
    while (!digitalRead(selectButton));
  }

   }
 

//funzione menu programmi lavaggi
void lavaggiMenu() {
          
 switch (stato) {
   case 0:
     stato = 1;
  break;
  case 1:
    lcd.clear();
   lcd.setCursor(0, 0);lcd.write(byte(0));
   lcd.setCursor(2, 0);lcd.print("LAVAGGIO RAPIDO"); 
   lcd.setCursor(2, 1);lcd.print("LAVAGGIO LENTO");
   lcd.setCursor(2, 2);lcd.print("LAVAGGIO DELICATI");
   lcd.setCursor(2, 3);lcd.print("LAVAGGIO ECO");
  break;
  case 2:
   lcd.clear();
   lcd.setCursor(0,1);lcd.write(byte(0));
   lcd.setCursor(2, 0);lcd.print("LAVAGGIO RAPIDO"); 
   lcd.setCursor(2, 1);lcd.print("LAVAGGIO LENTO");
   lcd.setCursor(2, 2);lcd.print("LAVAGGIO DELICATI");
   lcd.setCursor(2, 3);lcd.print("LAVAGGIO ECO");
  break;
  case 3:
   lcd.clear();
   lcd.setCursor(0, 2);lcd.write(byte(0));
   lcd.setCursor(2, 0);lcd.print("LAVAGGIO RAPIDO"); 
   lcd.setCursor(2, 1);lcd.print("LAVAGGIO LENTO");
   lcd.setCursor(2, 2);lcd.print("LAVAGGIO DELICATI");
   lcd.setCursor(2, 3);lcd.print("LAVAGGIO ECO");  
  break;
  case 4:
   lcd.clear();
   lcd.setCursor(0, 3);lcd.write(byte(0));
   lcd.setCursor(2, 0);lcd.print("LAVAGGIO RAPIDO"); 
   lcd.setCursor(2, 1);lcd.print("LAVAGGIO LENTO");
   lcd.setCursor(2, 2);lcd.print("LAVAGGIO DELICATI");
   lcd.setCursor(2, 3);lcd.print("LAVAGGIO ECO");
  break;
  case 5:
   lcd.clear();
   lcd.setCursor(0, 0);lcd.write(byte(0));
   lcd.setCursor(2, 0); lcd.print("risciacquo");
   lcd.setCursor(2, 1); lcd.print("Centrifuga");
   lcd.setCursor(2, 2); lcd.print("Scarico");
   lcd.setCursor(2, 3); lcd.print("Esci");
  break;
  case 6:
   lcd.clear();
   lcd.setCursor(0, 1); lcd.write(byte(0));
   lcd.setCursor(2, 0); lcd.print("risciacquo");
   lcd.setCursor(2, 1); lcd.print("Centrifuga");
   lcd.setCursor(2, 2); lcd.print("Scarico");
   lcd.setCursor(2, 3); lcd.print("Esci");
  break;
  case 7:
   lcd.clear();
   lcd.setCursor(0, 2); lcd.write(byte(0));
   lcd.setCursor(2, 0); lcd.print("risciacquo");
   lcd.setCursor(2, 1); lcd.print("Centrifuga");
   lcd.setCursor(2, 2); lcd.print("Scarico");
   lcd.setCursor(2, 3); lcd.print("Esci");
  break;
  case 8:
   lcd.clear();
   lcd.setCursor(0, 3);lcd.write(byte(1));
   lcd.setCursor(2, 0); lcd.print("risciacquo");
   lcd.setCursor(2, 1); lcd.print("Centrifuga");
   lcd.setCursor(2, 2); lcd.print("Scarico");
   lcd.setCursor(2, 3); lcd.print("Esci");
  break;
  case 9:
   stato = 8;
  break; 
  
  }
  
}

// scelta menu 
void scelta() {
    //int stato = 1;
 
  switch (stato) {
    case 1:
      LavaggioRapido();
      break;
      
    case 2:
      LavaggioLento();
      break;
    case 3:
      CapiDelicati();
      break;
    case 4:
      Lavaggioeco();
      break;
      case 5:
    risciacquo();
      break;     
      case 6:
    centrifuga();
      break;
       case 7:       
    scarico();
      break;      
       case 8:      
       esci();
      break;
  
  }
}

 int sez = 20;
void LavaggioRapido() { 
 
  if (!digitalRead(downButton)){
    sez++;    
    LavaggioRapido();      
    delay(100);
    while (!digitalRead(downButton));
  }
 if (!digitalRead(upButton)){
    delay(100);
      sez--;    
    LavaggioRapido();   
    delay(100);
    while(!digitalRead(upButton));
  } 
switch (sez) {
  
 case 20:
   lcd.clear();
   lcd.setCursor(0, 3); lcd.write(byte(0));
   lcd.setCursor(2, 0); lcd.print("LAVAGGIO RAPIDO");
   lcd.setCursor(2, 1); lcd.print("55 minuti");
   lcd.setCursor(1, 3); lcd.print("Avvio");
   lcd.setCursor(16, 3); lcd.print("Esci");
  break;
   case 21:
    lcd.clear();
   lcd.setCursor(15, 3); lcd.write(byte(0));
   lcd.setCursor(2, 0); lcd.print("LAVAGGIO RAPIDO");
   lcd.setCursor(2, 1); lcd.print("55 minuti");
   lcd.setCursor(1, 3); lcd.print("Avvio");
   lcd.setCursor(16, 3); lcd.print("Esci");
   break;}

      
}

void LavaggioLento() {
  lcd.clear();
  lcd.print("Lavaggio Lento");
  delay(1500);
   lavaggiMenu();
    
}
void CapiDelicati() {
  lcd.clear();
  lcd.print("Capi Delicati");
  delay(1500);
}
void Lavaggioeco() {
  lcd.clear();
  lcd.print("Centrifuga");
  delay(1500);
}

void risciacquo() {
  lcd.clear();
  lcd.print("Centrifuga");
  delay(1500);
}
void centrifuga() {
  lcd.clear();
  lcd.print("Centrifuga");
  delay(1500);
}
void scarico() {
  lcd.clear();
  lcd.print("Centrifuga");
  delay(1500);
}
void esci() {
  lcd.clear();
   delay(1500);
  avvio();
}

Secondo me il menu e la selezione delle funzioni è pensata male e non funziona. Tu premi un pulsante cambia stato e visualizzi scritte, ma non hai selezionato niente, cambiando stato avrai già una funzione corrispondente.

Allora io vedrei una funzione menu che ti stampa le possibili scelte, con un ciclo while(true) infinito che resta sempre nella funzione, tramite un tre pulsanti "possono essere gli stessi usati per altri scopi", uno aumento il valore di una variabile, l'altro diminuisco la variabile, il terzo conferma e esegue un break che fa uscire dal while e dalla funzione.

Io in realtà rivedrei tutto il programma...

void Menu(){

    char testo[4][20]={"LAVAGGIO RAPIDO","LAVAGGIO LENTO","LAVAGGIO DELICATI","LAVAGGIO ECO"};
    while(true){
        if(digitalRead(pulsante1)==0)
            stato++;
        else if(digitalRead(pulsante2)==0)
            stato--;
         else if(digitalRead(pulsante3)==0)
             break; // esco dal while e dalla funzione
         lcd.setCursor(2, 0);lcd.print(testo[stato]); 
        delay(300); // Un rallentamento della stampa su lcd, altrimenti sarebbe ogni millisecondi
    }


 }
type or paste code here

Grazie.... da questo menu vorrei passare ad un sotto menu,uso sempre la stessa tecnica?
Esempio seleziono "lavaggio rapido" il quale mi porta in un altro menu dove mi appare " la durata del lavaggio e due opzioni, continua o esci.
Naturalmente se esco mi porta al menu principale.
Sto usando un encoder con pulsante per muovermi nel sistema

Si io farei i sotto menu allo stesso modo, un ciclo infinito che continua fino a che non si preme un pulsante che genera un break.
Se hai delle variabili globali dichiarate fuori da ogni funzione, la modifica che fai nei sotto menu a queste variabili, sono visibili in tutto il programma e usarle per i tuoi scopi.

Se esci da una funzione, un sottomenu, torni alla funzione loop()

Farei una modifica al menu. Andiamo ad incrementare e diminuire la variabile e visualizziamo l'elemento dell'array di stringhe, ma potremmo arrivare a un numero maggiore di 4 elementi che non esisto o a meno di zero, che anche non esistono. Risolviamo il problema.

void Menu(){

    char testo[4][20]={"LAVAGGIO RAPIDO","LAVAGGIO LENTO","LAVAGGIO DELICATI","LAVAGGIO ECO"};
    while(true){
        if(digitalRead(pulsante1)==0){
            stato++;
            if(stato>3)stato=0; // Se arriva all'ultimo elemento torna al primo
        }else if(digitalRead(pulsante2)==0){
            stato--;
            if(stato<0)stato=3; // Se è meno di zero torna al massimo
         }else if(digitalRead(pulsante3)==0)
             break; // esco dal while e dalla funzione
         lcd.setCursor(2, 0);lcd.print(testo[stato]); 
        delay(300); // Un rallentamento della stampa su lcd, altrimenti sarebbe ogni millisecondi
    }

Ok, come faccio a collegare il menu principale con il sottomenu?
Scusami, ma sto studiando uno sviluppo a macchine a stati con switch case.
Quedyo con i vettori mi è più difficile. Tipo quando richiamo lavaggio rapido, nel sottomenu dovrò far partire un altra funzione corrispondente.