Pages: [1]   Go Down
Author Topic: [Risolto] Problema Sotto menu...  (Read 745 times)
0 Members and 1 Guest are viewing this topic.
italy
Offline Offline
Newbie
*
Karma: 1
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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!!!


« Last Edit: October 14, 2012, 06:06:53 pm by windsky » Logged

rome
Offline Offline
Sr. Member
****
Karma: 17
Posts: 481
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

so che la soddisfazione di scrivere una cosa da soli non si batte  smiley
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
Logged

italy
Offline Offline
Newbie
*
Karma: 1
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

rome
Offline Offline
Sr. Member
****
Karma: 17
Posts: 481
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sante parole ...  :-)
Logged

italy
Offline Offline
Newbie
*
Karma: 1
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

italy
Offline Offline
Newbie
*
Karma: 1
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
//============================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
Logged

Deep south of Italy
Offline Offline
Faraday Member
**
Karma: 8
Posts: 2955
The quieter you become, the more you can hear
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: October 15, 2012, 09:27:10 am by BrainBooster » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quoto brainbooster, anch'io faccio così.
Logged


Pages: [1]   Go Up
Jump to: