Go Down

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

Go Up