Pages: [1] 2   Go Down
Author Topic: Gestione di un menu  (Read 5217 times)
0 Members and 1 Guest are viewing this topic.
Padova
Offline Offline
Jr. Member
**
Karma: 0
Posts: 73
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 61
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Stiamo cercando di fare la stessa cosa smiley-wink
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)
Logged

Padova
Offline Offline
Jr. Member
**
Karma: 0
Posts: 73
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Edison Member
*
Karma: 24
Posts: 2319
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Padova
Offline Offline
Jr. Member
**
Karma: 0
Posts: 73
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 61
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sono riuscito a impostare i menu principali, ma non riesco a creare i sottomenu. Ecco il codice:
Code:
//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
Logged

Global Moderator
Milano, Italy
Offline Offline
Edison Member
*****
Karma: 23
Posts: 1180
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@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
« Last Edit: July 27, 2010, 09:13:03 am by Federico_Vanzati » Logged

F

0
Offline Offline
Sr. Member
****
Karma: 0
Posts: 489
Arduino addicted
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset




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

Campagne Aretine
Offline Offline
God Member
*****
Karma: 0
Posts: 816
Arduino è una figata
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

io ho ripreso lo sketch da federico vanzati e l'ho leggermente modificato smiley-grin
Logged

Global Moderator
Milano, Italy
Offline Offline
Edison Member
*****
Karma: 23
Posts: 1180
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Includerei anche i molluschi ^^  ;D
Logged

F

Padova
Offline Offline
Jr. Member
**
Karma: 0
Posts: 73
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
/*-------------------------------------------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
Logged

Naples (IT)
Offline Offline
God Member
*****
Karma: 6
Posts: 716
Andrea E.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

per i menu, io li ho sempre fatti con lo switch case: pulito, semplice ma soprattutto leggibile!
Logged

Arduino, MODs e DIY: blackstufflabs.com

Padova
Offline Offline
Jr. Member
**
Karma: 0
Posts: 73
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Milano, Italy
Offline Offline
Edison Member
*****
Karma: 23
Posts: 1180
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

In riferimento a http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1241310950/30
Code:
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
« Last Edit: August 02, 2010, 11:30:07 am by Federico_Vanzati » Logged

F

Naples (IT)
Offline Offline
God Member
*****
Karma: 6
Posts: 716
Andrea E.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Arduino, MODs e DIY: blackstufflabs.com

Pages: [1] 2   Go Up
Jump to: