[Risolto] Problema Sotto menu...

Ciao a tutti stavo analizzando il codice scritto da Federico Vanzati…
Quello che sto cercando di fare è un menu per un display 16x4 e 4 pulsanti Più Meno Enter Esc
Il codice funziona a dovere ma volevo modificarlo per le mie esigenze…
Il problema nasce qui…
Muovendomi nelle varie pagine con i pulsanti più o meno praticamente mi sposto tra i vari case…
La mia esigenza sarebbe di creare uno o più sotto menu per i relativi case…
Ho provato ma non riesco a farlo.
Di seguito vi inoltro parte del codice così modificato ma non funzionante :disappointed_relieved:

case 2:			// Schermata Impostazione TInverno
lcd.setCursor(0, 0);
lcd.print("     Imp.Ora    ");
if (enter == HIGH && millis() - tempo_btn > debounce)	//Premendo "enter" si entra nella sotto-modalita'
{
    tempo_btn = millis();
    set = !set;
}
sub_menu = 0;
if (enter == HIGH && millis() - tempo_btn > debounce && cont_pag >= 0 && sub_menu< 3) {
    tempo_btn = millis();
    sub_menu++;
    if (sub_menu == 3)
	cont_pag = 0;
}
if (enter == HIGH && millis() - tempo_btn > debounce)	//Premendo "enter" si entra nella sotto-modalita'
{
    tempo_btn = millis();
    set = !set;
}
switch (sub_menu) {
case 0:			//impostazione ora
 /*===================IMPOSTO ORE======================================*/
    if (set == HIGH) {
	//Abilita l'ingresso in modalita' configurazione
	n_piu = 0;
	n_meno = 0;
	//Abilita i tasti "piu" e "meno" in modalita' incremento/decremento 
	piu_set = digitalRead(PIU);
	meno_set = digitalRead(MENO);
	if (piu_set == HIGH && millis() - tempo_btn > debounce)	//Incremento "variabile" se premo tasto "piu"
	{
	    tempo_btn = millis();
	    n_piu++;
	    piu_set = !piu_set;
	    if (h < 24)
		h++;
	}

	if (meno_set == HIGH && millis() - tempo_btn > debounce)	//Decremento "variabile" se premo tasto "meno"
	{
	    tempo_btn = millis();
	    n_meno++;
	    meno_set = !meno_set;
	    if (h > 0)
		h--;
	}

    }
    break;
 /*=================================================================*/
case 1:			//impostazione minuti
 /*================IMPOSTO MINUTI======================================*/
    if (set == HIGH) {
	//Abilita l'ingresso in modalita' configurazione
	n_piu = 0;
	n_meno = 0;
	//Abilita i tasti "piu" e "meno" in modalita' incremento/decremento 
	piu_set = digitalRead(PIU);
	meno_set = digitalRead(MENO);
	if (piu_set == HIGH && millis() - tempo_btn > debounce)	//Incremento "variabile" se premo tasto "piu"
	{
	    tempo_btn = millis();
	    n_piu++;
	    piu_set = !piu_set;
	    if (m < 60)
		m++;
	}

	if (meno_set == HIGH && millis() - tempo_btn > debounce)	//Decremento "variabile" se premo tasto "meno"
	{
	    tempo_btn = millis();
	    n_meno++;
	    meno_set = !meno_set;
	    if (m > 0)
		m--;
	}

    }
    break;
 /*========================================================*/
case 2:			//impostazione minuti
 /*==================IMPOSTO SECONDI=====================================*/
    if (set == HIGH) {
	//Abilita l'ingresso in modalita' configurazione
	n_piu = 0;
	n_meno = 0;
	//Abilita i tasti "piu" e "meno" in modalita' incremento/decremento 
	piu_set = digitalRead(PIU);
	meno_set = digitalRead(MENO);
	if (piu_set == HIGH && millis() - tempo_btn > debounce)	//Incremento "variabile" se premo tasto "piu"
	{
	    tempo_btn = millis();
	    n_piu++;
	    piu_set = !piu_set;
	    if (s < 60)
		s++;
	}

	if (meno_set == HIGH && millis() - tempo_btn > debounce)	//Decremento "variabile" se premo tasto "meno"
	{
	    tempo_btn = millis();
	    n_meno++;
	    meno_set = !meno_set;
	    if (s > 0)
		s--;
	}

    }
    break;
}				//switch sub_menu

Praticamente entrato nel secondo case premendo enter vorrei impostare ore minuti e secondi in tre variabili distinte (come se ore minuti e secondi fossero tre sotto menu del case 2) ed il cambio ore e minuti e secondi dovrebbe avvenire dopo l’impostazione del valore e della conferma con il pulsante enter…

Non riesco a capire dove sbaglio
Grazie a tutti!!!

so che la soddisfazione di scrivere una cosa da soli non si batte :) ma se hai voglia dai anche una occhiata alla mia libreria per la gestione di menu e gui su lcd.

https://github.com/brunialti/MENWIZ/downloads

Grazie per la risposta... Ci studierò sopra ma vorrei capire come farla da solo per imparare il funzionamento, la realizzazione e la gestione di un menù. Credo e penso che se non si impara a fondo un codice di programmazione non si possano realizzare progetti decenti...

Sante parole … :slight_smile:

A furia di sbattere la testa con gli switch case ho risolto così…

Posto parte del codice in modo tale che possa essere di aiuto ad altri utenti

void setup()
{
  pinMode(ENTER, INPUT);
  pinMode(ESC, INPUT);
  pinMode(PIU, INPUT);
  pinMode(MENO, INPUT);
  pinMode(CONTRAST, OUTPUT);
  lcd.clear();
 }  // setup()...
// =========================================BLOCO HOME PAGE===================================  
void menu1 ()
{
    //analogWrite(CONTRAST, cntr);
    //======================BLOCO ORA==================
    lcd.setCursor(0,0);  
    if(h < 10)  //Quando il numero è ad una sola cifra devo aggiungere uno spazio per mantenere il testo che viene dopo nella stessa posizione
    lcd.print("0"); 
    lcd.print(h);
    lcd.setCursor(2,0);  //Scrivo la temperatura che sto impostando
    lcd.print(":");
    lcd.setCursor(3,0);  //Scrivo la temperatura che sto impostando
    if(m < 10)  //Quando il numero è ad una sola cifra devo aggiungere uno spazio per mantenere il testo che viene dopo nella stessa posizione
    lcd.print("0"); 
    lcd.print(m);
    lcd.setCursor(5,0);
    lcd.print(" ");
    //======================BLOCO DATA==================
    lcd.setCursor(6,0);  
    if(giorno < 10)  //Quando il numero è ad una sola cifra devo aggiungere uno spazio per mantenere il testo che viene dopo nella stessa posizione
    lcd.print("0"); 
    lcd.print(giorno);
    lcd.setCursor(8,0);  
    lcd.print("/");
    lcd.setCursor(9,0);  //Scrivo la temperatura che sto impostando
    if(mese < 10)  //Quando il numero è ad una sola cifra devo aggiungere uno spazio per mantenere il testo che viene dopo nella stessa posizione
    lcd.print("0"); 
    lcd.print(mese);
    lcd.setCursor(11,0);  
    lcd.print("/");
    lcd.setCursor(12,0);  
    lcd.print(anno);
    //===================================================
   
    lcd.setCursor(-4,2);
    lcd.print("TEMP1:");
    sensors.requestTemperatures(); // Invia il comando di lettura delle temperatura
    lcd.setCursor(2, 2);
    lcd.print (sensors.getTempCByIndex(0));
    
}
//============================BLOCCO GESTIONE ORA=====================================
void menu2 ()
{
    lcd.setCursor(0,0);
    lcd.print("    OROLOGIO    ");
    lcd.setCursor(5,1); 
    if(h < 10)  //Quando il numero è ad una sola cifra devo aggiungere uno spazio per mantenere il testo che viene dopo nella stessa posizione
    lcd.print("0"); 
    lcd.print(h);
    lcd.setCursor(0,1);  //Scrivo la temperatura che sto impostando
    lcd.print("     ");
    lcd.setCursor(7,1);  //Scrivo la temperatura che sto impostando
    lcd.print(":");
    lcd.setCursor(8,1);  //Scrivo la temperatura che sto impostando
    if(m < 10)  //Quando il numero è ad una sola cifra devo aggiungere uno spazio per mantenere il testo che viene dopo nella stessa posizione
    lcd.print("0"); 
    lcd.print(m);
    lcd.setCursor(-4,2);
    lcd.print("                ");
    lcd.setCursor(-4,3);
    lcd.print("      SET       ");
    if(enter == HIGH && millis() - tempo_btn > debounce) 
     {
      tempo_btn = millis();
      lcd.clear();
      cont_pag = 21;
     }
}
void menu21 ()
{
    lcd.setCursor(0,0);
    lcd.print("ORE:");
    lcd.setCursor(4,0);
    if(h < 10)  //Quando il numero è ad una sola cifra devo aggiungere uno spazio per mantenere il testo che viene dopo nella stessa posizione
    lcd.print("0");
    lcd.print(h);
    lcd.setCursor(0,1);
    lcd.print("                ");
    lcd.setCursor(-4,2);
    lcd.print("                ");
    lcd.setCursor(-4,3);
    lcd.print("      SET       ");
    //Abilita l'ingresso in modalita' configurazione
    n_piu = 0;
    n_meno = 0;
    //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento 
    piu_set = digitalRead(PIU);
    meno_set = digitalRead(MENO);
    if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;
        if( h < 24 )
          h++;
      }
    if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;
        meno_set = !meno_set;
        if( h > 0 )
          h--;
      }
    
    if(enter == HIGH && millis() - tempo_btn > debounce) 
     {
      tempo_btn = millis();
      lcd.clear();
      cont_pag = 22;
     }
}
void menu22 ()
{
    lcd.setCursor(0,0);
    lcd.print("MINUTI:");
    lcd.setCursor(7,0);
    if(m < 10)  //Quando il numero è ad una sola cifra devo aggiungere uno spazio per mantenere il testo che viene dopo nella stessa posizione
    lcd.print("0");
    lcd.print(m);
    lcd.setCursor(0,1);
    lcd.print("                ");
    lcd.setCursor(-4,2);
    lcd.print("                ");
    lcd.setCursor(-4,3);
    lcd.print("      SET       ");
    //Abilita l'ingresso in modalita' configurazione
    n_piu = 0;
    n_meno = 0;
    //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento 
    piu_set = digitalRead(PIU);
    meno_set = digitalRead(MENO);
    if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;
        if( m < 60 )
          m++;
      }
    if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;
        meno_set = !meno_set;
        if( m > 0 )
          m--;
      }
    
    if(enter == HIGH && millis() - tempo_btn > debounce) 
     {
      tempo_btn = millis();
      lcd.clear();
      lcd.setCursor(5,1); 
      if(h < 10)  //Quando il numero è ad una sola cifra devo aggiungere uno spazio per mantenere il testo che viene dopo nella stessa posizione
      lcd.print("0"); 
      lcd.print(h);
      lcd.setCursor(0,1);  //Scrivo la temperatura che sto impostando
      lcd.print("     ");
      lcd.setCursor(7,1);  //Scrivo la temperatura che sto impostando
      lcd.print(":");
      lcd.setCursor(8,1);  //Scrivo la temperatura che sto impostando
      if(m < 10)  //Quando il numero è ad una sola cifra devo aggiungere uno spazio per mantenere il testo che viene dopo nella stessa posizione
      lcd.print("0"); 
      lcd.print(m);
      delay(1500);
      lcd.clear();
      cont_pag = 0;
     }
}
//============================BLOCCO GESTIONE DATA====================================
void menu3 ()
{
    lcd.setCursor(0,0);
    lcd.print("      DATA      ");
    lcd.setCursor(3,1);  
    if(giorno < 10)  //Quando il numero è ad una sola cifra devo aggiungere uno spazio per mantenere il testo che viene dopo nella stessa posizione
    lcd.print("0"); 
    lcd.print(giorno);
    lcd.setCursor(5,1);  
    lcd.print("/");
    lcd.setCursor(6,1);  //Scrivo la temperatura che sto impostando
    if(mese < 10)  //Quando il numero è ad una sola cifra devo aggiungere uno spazio per mantenere il testo che viene dopo nella stessa posizione
    lcd.print("0"); 
    lcd.print(mese);
    lcd.setCursor(8,1);  
    lcd.print("/");
    lcd.setCursor(9,1);  
    lcd.print(anno);
    lcd.setCursor(-4,2);
    lcd.print("                ");  
    lcd.setCursor(-4,3);
    lcd.print("      SET       ");
    if(enter == HIGH && millis() - tempo_btn > debounce) 
     {
      tempo_btn = millis();
      lcd.clear();
      cont_pag = 31;
     }
}

void menu31 ()
{
    lcd.setCursor(0,0);
    lcd.print("GIORNO:");
    lcd.setCursor(7,0);
    if(giorno < 10)  //Quando il numero è ad una sola cifra devo aggiungere uno spazio per mantenere il testo che viene dopo nella stessa posizione
    lcd.print("0");
    lcd.print(giorno);
    lcd.setCursor(0,1);
    lcd.print("                ");
    lcd.setCursor(-4,2);
    lcd.print("                ");
    lcd.setCursor(-4,3);
    lcd.print("      SET       ");
    //Abilita l'ingresso in modalita' configurazione
    n_piu = 0;
    n_meno = 0;
    //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento 
    piu_set = digitalRead(PIU);
    meno_set = digitalRead(MENO);
    if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;
        if( giorno < 31 )
          giorno++;
      }
    if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;
        meno_set = !meno_set;
        if( giorno > 0 )
          giorno--;
      }
    
    if(enter == HIGH && millis() - tempo_btn > debounce) 
     {
      tempo_btn = millis();
      lcd.clear();
      cont_pag = 32;
     }
}

void menu32 ()
{   
    lcd.setCursor(0,0);
    lcd.print("MESE:");
    lcd.setCursor(5,0);
    if(mese < 10)  //Quando il numero è ad una sola cifra devo aggiungere uno spazio per mantenere il testo che viene dopo nella stessa posizione
    lcd.print("0");
    lcd.print(mese);
    lcd.setCursor(0,1);
    lcd.print("                ");
    lcd.setCursor(-4,2);
    lcd.print("                ");
    lcd.setCursor(-4,3);
    lcd.print("      SET       ");
    //Abilita l'ingresso in modalita' configurazione
    n_piu = 0;
    n_meno = 0;
    //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento 
    piu_set = digitalRead(PIU);
    meno_set = digitalRead(MENO);
    if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;
        if( mese < 12 )
          mese++;
      }
    if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;
        meno_set = !meno_set;
        if( mese > 0 )
          mese--;
      }
    
    if(enter == HIGH && millis() - tempo_btn > debounce) 
     {
      tempo_btn = millis();
      lcd.clear();
      cont_pag = 33;
     }
}

void menu33 ()
{
  lcd.setCursor(0,0);
    lcd.print("ANNO:");
    lcd.setCursor(5,0);
    lcd.print(anno);
    lcd.setCursor(0,1);
    lcd.print("                ");
    lcd.setCursor(-4,2);
    lcd.print("                ");
    lcd.setCursor(-4,3);
    lcd.print("      SET       ");
    //Abilita l'ingresso in modalita' configurazione
    n_piu = 0;
    n_meno = 0;
    //Abilita i tasti "piu" e "meno" in modalita' incremento/decremento 
    piu_set = digitalRead(PIU);
    meno_set = digitalRead(MENO);
    if(piu_set == HIGH && millis() - tempo_btn > debounce)  //Incremento "variabile" se premo tasto "piu"
      {
        tempo_btn = millis();
        n_piu++;
        piu_set = !piu_set;
        if( anno < 3000 )
          anno++;
      }
    if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
      {
        tempo_btn = millis();
        n_meno++;
        meno_set = !meno_set;
        if( anno > 2012 )
          anno--;
      }
    
    if(enter == HIGH && millis() - tempo_btn > debounce) 
     {
      tempo_btn = millis();
      lcd.clear();
      lcd.setCursor(3,1);  
      if(giorno < 10)  //Quando il numero è ad una sola cifra devo aggiungere uno spazio per mantenere il testo che viene dopo nella stessa posizione
      lcd.print("0"); 
      lcd.print(giorno);
      lcd.setCursor(5,1);  
      lcd.print("/");
      lcd.setCursor(6,1);  //Scrivo la temperatura che sto impostando
      if(mese < 10)  //Quando il numero è ad una sola cifra devo aggiungere uno spazio per mantenere il testo che viene dopo nella stessa posizione
      lcd.print("0"); 
      lcd.print(mese);
      lcd.setCursor(8,1);  
      lcd.print("/");
      lcd.setCursor(9,1);  
      lcd.print(anno);
      delay(1500);
      lcd.clear();
      cont_pag = 0;
     }

}


void loop()
{
//Lettura dello stato di tutti i pulsanti
  if(set == LOW)
  {
    piu = digitalRead(PIU);
    meno = digitalRead(MENO);
  }
  enter = digitalRead(ENTER);
  esc = digitalRead(ESC);
  
//Se premo PIU incremento di uno il contatore pagine
  if(piu == HIGH && millis() - tempo_btn > debounce && cont_pag >= 0 && cont_pag < 3)
  {
    tempo_btn = millis();    
    cont_pag++;
    if(cont_pag == 3)
      cont_pag = 0;
   }
//Se premo MENO decremento il contatore pagine
  if(meno == HIGH && millis() - tempo_btn > debounce && cont_pag > 0 && cont_pag < 3)
  {
    tempo_btn = millis();    
    cont_pag--;
  }
  
//Se premo ESC torno alla schermata Home uscendo anche da tutti i sottomenu
  if(esc == HIGH && millis() - tempo_btn > debounce)  //Quando premo "esc" torno alla schermata HOME
  {
    tempo_btn = millis();
    cont_pag = 0;
    set = LOW;
  }

switch (cont_pag)
  {
   case 0:
   menu1();
   break;
   case 1:
   menu2();
   break;
   //============MENU 2===============
   case 21:
   menu21();
   break;
   case 22:
   menu22();
   break;
   //=============MENU 3===============
   case 2:
   menu3();
   break;
   case 31:
   menu31();
   break;
   case 32:
   menu32();
   break;
   case 33:
   menu33();
   break;
  } // switch
} // loop

Grazie a tutti

io quando ho dovuto fare la stessa cosa, ho preferito un'approccio un pò differente... cioè: giorno mese e anno partivano da un valore di base, poi all'interno del menù sull'lcd la data era su una sola riga del tipo 15/10/2012 ed attivando l'underscore "_" del cursore mi spostavo a destra o sinistra con i tasti , sulle cifre da modificare e con i tasti su e giù cambiavo il valore corrispondente alla variabile che avevo sopra il cursore, semplicemente sapevo che avevo sempre 2 cifre per giorno e mese (01/01 e non1/1) e che l'anno era da 4 quindi la funzione era del tipo :

se la posizione del cursore è al primo o al secondo carattere i tasti agiranno sulla variabile giorno se la posizione del cursore è al quarto o al quinto carattere i tasti agiranno sulla variabile mese se la posizione del cursore è al settimo ,ottavo,nono o decimo i tasti agiranno sulla variabile anno con questa logica del menù "mappato" riesci a fare tutto con un solo menù per la data, per esempio Chiaramente il discorso è valido solo per campi a lunghezza e posizione nota sul display.

Quoto brainbooster, anch’io faccio così.