Go Down

Topic: Gestione di un menu (Read 5551 times) previous topic - next topic

@miky

Salve,
sono alle prese con la creazione di un menu per la gestione del controller dell'acquario.
Ho queste visualizzazioni:
1 Visualizzazione Carcia sistema .... solo in fase di setup.
2 Schermata di default (data, ora, temperatura vasca e una parte di messaggi)
Da questa premendo * vado ad un menu configurazioni (Secona schermata) con:
1 - Data e ora
2 - Variabili
premendo o 1 o 2 andrei ad eseguire le operazioni.
Ho poi un terzo menu con:
1 - Accedere a menu dei relay
2 - Altre misurazioni vasca

..... insomma un casin!!!

Avete qualche link per prendere spunto? Questo penso potrebbe andare bene ma dovrei sezionarlo http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1273349195/0#0 .

Andrea96

Stiamo cercando di fare la stessa cosa ;)
Per intanto ti posto  bozza schema logico del menu http://img85.imageshack.us/img85/6141/menuef.jpg

L'idea e di utilizzare solo 4 pulsani: 2 freccie direzionale un "enter" ed un "esc"

Il code sta cercando di farlo mio figlio :-?

Ciao Renato (il papà di Andrea)

@miky

Ciao Renato,
fortunato te che hai il figlio che ti aiuta ... per il mio pendo di dover aspettare almeno qualche decennio ... (6 mesi oggi).

Si la cosa è la stessa vediam cosa produce il pupo e poi vediamo,
io ho un tastierino per poter evetnualemtne imputare anche dei dati quindi utilizzerei quelli.
I pulsanti invece li uso per funzioni più veloci tipo lo spegnere le pompe per la pappa, spegnere lo skim per la pulizia ... intervenire direttamente sulle luci.

pitusso

ciao,
ricordo che Calamaro, con il suo bromografo DIY, aveva affrontato la questione dei menu.
Magari potrebbe tornarvi utile...
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1241310950/30

@miky

Grazie.
Lo avevo trovato in una precedente ricerca ma poi non lo avevo più trovato.

Andrea96

Sono riuscito a impostare i menu principali, ma non riesco a creare i sottomenu. Ecco il codice:
Code: [Select]
//Includi librerie
#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#include "AnalogButtons.h"
#define ANALOG_PIN 1
//Dichiara le vaie cose
int button_pin = 1;
int button_enter_state = 0;
int button_exit_state = 0;
int button_right_state = 0;
int button_left_state = 0;
int button_value;
float temp;
int temp_pin = 0;
unsigned int cont_pag = 0;
long previousMillis = 0;
long interval = 0;
int led_pin = 13;
byte array_left[8] = {
 B00001,
 B00011,
 B00111,
 B01111,
 B00111,
 B00011,
 B00001,
 B00000,
};
byte array_right[8] = {
 B10000,
 B11000,
 B11100,
 B11110,
 B11100,
 B11000,
 B10000,
 B00000,
};


void setup() {
//Impostazioni di SETUP
lcd.createChar(0, array_left);
lcd.createChar(1, array_right);
pinMode(button_pin, INPUT);
pinMode(led_pin, OUTPUT);
lcd.begin(16, 2);

}

void loop() {
button_enter_state = LOW;
button_exit_state = LOW;
button_right_state = LOW;
button_left_state =LOW;
 button_value = analogRead(button_pin);          
if(button_value > 944 && button_value < 947){
 button_left_state = HIGH;
}
else if(button_value > 965 && button_value < 971){
button_right_state = HIGH;
}
else if(button_value > 988 && button_value < 993){
button_enter_state = HIGH;
}
else if(button_value > 999 && button_value < 1003){
button_exit_state = HIGH;
}
 
 if(button_exit_state == HIGH && button_right_state == LOW && button_left_state == LOW &&  button_enter_state == LOW && millis() - previousMillis > interval + 250 ){
 cont_pag = 0; //Se premo tasto EXIT torna al menu base
 }
    if(button_right_state == HIGH && button_left_state == LOW && button_exit_state == LOW &&  button_enter_state == LOW && millis() - previousMillis > interval + 250 ){
   previousMillis = millis();  
  cont_pag++; //Se premo PIU incrementa numero pagina
   if(cont_pag == 4){
     cont_pag = 1; //Se incremento a più di 3(4) portami al primo menu (non il menu base)
 }
}
else if(button_left_state == HIGH && button_right_state == LOW && button_exit_state == LOW &&  button_enter_state == LOW && millis() - previousMillis > interval + 250 ){
  previousMillis = millis();
 cont_pag--; //Se premo MENO diminuisci numero pagina
  if(cont_pag == 0){
     cont_pag = 3; //Se incremento a menodi 1(0) portami al terzo menu
 }
}
  switch (cont_pag) {
    case 0: //Se il numero della pagina è su menu base
   
 temp = analogRead(temp_pin);          
 temp = (5.0 * temp * 100.0)/1024.0;
if(cont_pag == 0 &&  millis() - previousMillis > interval + 1000){
 previousMillis = millis();
 lcd.setCursor(0, 0);
 lcd.print("                ");
 lcd.setCursor(0, 1);
 lcd.print("                ");
 lcd.setCursor(1, 0);
 lcd.print(RTC.get(DS1307_HR,true));
 lcd.setCursor(3, 0);
 lcd.print(":");
 lcd.setCursor(4, 0);
 lcd.print(RTC.get(DS1307_MIN,false));
 lcd.setCursor(10, 0);
 lcd.print(RTC.get(DS1307_DATE,false));
 lcd.setCursor(12, 0);
 lcd.print("/");
 lcd.setCursor(13, 0);
 lcd.print(RTC.get(DS1307_MTH,false));
 lcd.setCursor(2, 1);
 lcd.print("Temp:");
 lcd.setCursor(7, 1);
 lcd.print(temp);
 lcd.setCursor(13, 1);
 lcd.print("C");
 }
break;

   case 1: //Se il numero della pagina è sul primo menu
   
   lcd.setCursor(0, 0);
   lcd.print("   LUCE SUMP    ");
   lcd.setCursor(0, 1);
   lcd.print("                ");  
   lcd.setCursor(0, 1);
   lcd.write(0);
   lcd.setCursor(15, 1);
   lcd.write(1);
  break;  
   
   case 2: //Se il numero della pagina è sul secondo menu
   
   lcd.setCursor(0, 0);
   lcd.print(" RABBOCCO POMPA ");
   lcd.setCursor(0, 1);
   lcd.print("                ");
   lcd.setCursor(0, 1);
   lcd.write(0);
   lcd.setCursor(15, 1);
   lcd.write(1);
   break;
   
   case 3: //Se il numero della pagina è sul terzo menu
   
   lcd.setCursor(0, 0);
   lcd.print("   POMPA SUMP   ");
   lcd.setCursor(0, 1);
   lcd.print("                ");
   lcd.setCursor(0, 1);
   lcd.write(0);
   lcd.setCursor(15, 1);
   lcd.write(1);
   
   
}

}




Lo schema logico di funzionamento è già stato postato nel secondo messaggio( http://img85.imageshack.us/img85/6141/menuef.jpg)
Qualcuno protrebbe provare un sottomenu che funzioni implementato nel codice, poi ci penserò io ad applicarlo a tutti i sottomenu. Ciao a tutti.

Andrea

Federico Vanzati

#6
Jul 27, 2010, 04:11 pm Last Edit: Jul 27, 2010, 04:13 pm by Federico_Vanzati Reason: 1
@Andrea96:

nel link che ha postato Pitusso c'è un'idea di menu che avevo creato io...abbastanza semplice e sicuramente migliorabile.
Il sottomenu che avevo sviluppato era parecchio semplice, cioè all'interno di una pagina se veniva premuto enter si attivava la possibilità di usare i tasti "+" e "-" per far incrementare o decrementare una variabile.
Prova a darci un'occhio potrebbe fare al caso tuo
F

NetWorm




[glow]* nessun pesce è stato oggetto di maltrattamenti durante la fase di test di questo menu *[/glow]

Calamaro

io ho ripreso lo sketch da federico vanzati e l'ho leggermente modificato :D

Federico Vanzati

Includerei anche i molluschi ^^  ;D
F

@miky

Renato alla fine qualche cosa io sono risucito a fare, anche se non so se son peggio come programmatore o elettrrico.
Comunque qui sotto il codice ancora con tutta la cacca che mi serve per la verifica, ho fatto solo il primo livello dei menu adesso pulisco e faccio il secondo intanto se vuoi vedere ...
grazie pitusso e ovviamente il codice di calamaro mi è servito per cercare di capire ....

Code: [Select]
/*-------------------------------------------Definizione inclusioni ----------------------------------------------*/
#include <Wire.h>
#include <LCDi2cR.h>                       //   robot-electronics.co.uk
LCDi2cR lcd = LCDi2cR(4,40,0x63,0);
#define VERSION "1.24"
/*========================================================================== Variabili di temporizzazione =======================================================================*/
//long tempo_btn = 0, debounce = 300;  //Tempo tra due letture successive di un bottone (300 ms)
int keyInput, livello, menu, ritorno;
/*===============================================================================================================================================================================*/
void setup()
{
 lcd.clear();
 lcd.init();                           // Init the display, clears the display

 lcd.print("Keypad Ver ");             // Show Version
 lcd.print (VERSION);
 keyInput=40;
 livello=0;
 menu=0;
 ritorno=0;
 delay(5000);
}  //setup
void loop ()  //Start Loop
{
if(ritorno == 1)
{
 keyInput = 20;
 }
else
{                                                     //Lettura stato tastiera per determinare cosa fare
 keyInput=lcd.keypad();
  }

 if(keyInput == 40 && livello==0)                    // Ciclo menu di funzionamento nulla di premuto
 {
   lcd.clear ();
   lcd.setCursor(0,0);        
   lcd.print("CICLO FUNZIONI   ");  
   lcd.setCursor(2,0);
   lcd.print("key input   ");
   lcd.print(keyInput);
   lcd.setCursor(3,0);
   lcd.print("liv ");
   lcd.print(livello);
   lcd.print(" menu  ");
   lcd.print(menu);
   delay (1000);
 }
  if(keyInput == 20 && livello==0)                     // Se premo * (20) e il livello è 0
 {
   lcd.clear ();
   livello = 1;                                      //Definisco che sono a livello 1
   menu=1;                                           //Menu 1 MENU PRINCIPALE
   ritorno = 0;
   lcd.setCursor(0,0);        
   lcd.print("MENU PRINCIPALE   ");            
   lcd.setCursor(1,0);        
   lcd.print("1 REGOLAZIONI");
   lcd.setCursor(2,0);
   lcd.print("2 ACCENSIONI ");
   lcd.setCursor(3,0);
   lcd.print("liv ");    
   lcd.print(livello);
   lcd.print(" key ");
   lcd.print(keyInput);
   lcd.print(" men ");
   lcd.print(menu);
 }
 
 if(menu==1 && livello ==1 && ritorno ==0)                   //Se sei nel menu 1 e livello 1
 {
 keyInput=lcd.keypad();  //Leggi pressione del tastp
 
 switch (keyInput)
 {
 case 1:                                                     // Premi uno per regolare ora
     lcd.clear ();
     lcd.setCursor (0,0);
     lcd.print ("1 IMPOSTA ORA");
     lcd.setCursor (1,0);
     lcd.print ("2 IMPOSTA VARIABILI");
     lcd.setCursor (2,0);
     lcd.print ("# MENU PRECEDENTE");
     lcd.setCursor (3,0);
     livello = 2;
     lcd.print("liv ");    
     lcd.print(livello);
     lcd.print(" menu  ");
     lcd.print(menu);
     break;
 
case 2:                                                        //Menu accensioni
   lcd.clear ();
   lcd.setCursor(0,0);        
   lcd.print("MENU ACCENSIONI   ");                            // Clear prev entry
   lcd.setCursor (2,0);
   lcd.print ("# MENU PRECEDENTE");
   lcd.setCursor (3,0);
   livello = 2;
   lcd.print("liv ");    
   lcd.print(livello);
   lcd.print(" menu  ");
   lcd.print(menu);
   break;
     
}                                             // End switch
}                                             // End if menu 1 livello 1

if(livello==2 && menu ==1 )
 {
 keyInput=lcd.keypad();
 switch (keyInput)
 {  
 case 30:
 livello = 0;
 ritorno = 1;
 lcd.clear ();
 lcd.setCursor(0,0);        
 lcd.print("sei nella cacca   ");
 lcd.setCursor (3,0);
 lcd.print("liv ");    
 lcd.print(livello);
 lcd.print(" menu  ");
 lcd.print(menu);
 break;
 }
 }
} //Loop


Accetto volentieri consigli su come migliorare .. direi che ne ho proprio bisogno ..

M

AnTrea

per i menu, io li ho sempre fatti con lo switch case: pulito, semplice ma soprattutto leggibile!
Arduino, MODs e DIY: blackstufflabs.com

@miky

Si ma come hai fatto a gestire i sottolivelli. Non penso tu sia riuscito a fare tutto con un solo switch case. Oppure hai delle variabili che ti tengono traccia della selezione che fai sui tasti e poi le gestisci con lo switch ....

Decisamente è un po' incasinato da leggere e sopratuto da manutentare in questo modo ..... hai degli esempi dove hai usato switch ...

Federico Vanzati

#13
Aug 02, 2010, 06:29 pm Last Edit: Aug 02, 2010, 06:30 pm by Federico_Vanzati Reason: 1
In riferimento a http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1241310950/30
Code: [Select]
case 2:   // Schermata Impostazione TInverno
   lcd.setCursor(0,0);
   lcd.print("    Pagina 3    ");

   if(enter == HIGH && millis() - tempo_btn > debounce)  //Premendo "enter" si entra nella sotto-modalita'
   {
     tempo_btn = millis();
     set = !set;
   }

   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( variabile < 50 )
         variabile++;
     }

     if(meno_set == HIGH && millis() - tempo_btn > debounce)  //Decremento "variabile" se premo tasto "meno"
     {
       tempo_btn = millis();
       n_meno++;
       meno_set = !meno_set;
       if( variabile > 0 )
         variabile--;
     }
   }
   lcd.setCursor(0,1);  //Scrivo la temperatura che sto impostando
   lcd.print(variabile);
   if(variabile < 10)  //Quando il numero è ad una sola cifra devo aggiungere uno spazio per mantenere il testo che viene dopo nella stessa posizione
     lcd.print(" ");
   if(set == LOW)
     lcd.print("           SET");
   else
     lcd.print("            OK");

   break;


Questa è una delle possibili soluzioni che avevi sotto il naso
F

AnTrea

Per gestire i sottolivelli potresti usare le procedure.
Ovvero, nello switch case principale fai delle chiamate a procedure e per ogni procedura c'è un altro switch case che gestisce i livelli più interni.
Magari così ti incasini di meno e la cosa è più modulare.
Arduino, MODs e DIY: blackstufflabs.com

Go Up