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