Go Down

Topic: [Risolto] Problema Sotto menu... (Read 864 times) previous topic - next topic

windsky

Oct 10, 2012, 06:34 pm Last Edit: Oct 15, 2012, 01:06 am by windsky Reason: 1
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  :smiley-sad-blue:


Code: [Select]
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!!!



brunialti

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

windsky

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...


brunialti


windsky

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

Code: [Select]

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;
    }
}

windsky

Code: [Select]

//============================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

BrainBooster

#6
Oct 15, 2012, 09:24 am Last Edit: Oct 15, 2012, 04:27 pm by BrainBooster Reason: 1
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.

leo72

Quoto brainbooster, anch'io faccio così.

Go Up