Go Down

Topic: [Risolto] Problema Sotto menu... (Read 895 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy