Go Down

Topic: Piccolo consiglio su gestione menù (Read 1 time) previous topic - next topic

9six4

Ciao a tutti,
da alcuni giorni sto cercando di creare un piccolo menù nidificato da gestire con Arduino UNO su un banale LCD 20X4. Il menù lo sto gestendo come i moderni telefonini in cui ci sono 3 tasti generici la cui funzione cambia in base alla schermata. Per gestire questo menù sto utilizzando un ciclo switch - case.
In pratica il default del ciclo è la schermata di partenza e alla pressione di un tasto esso passa alla schermata successiva, modificando un contatore che individua il "case" e quindi la schermata.
Questo è il codice e per il momento sembra funzionare.

Code: [Select]
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
void setup()
{
  Serial.begin (9600); 
  lcd.begin(20, 4);
  pinMode (8, INPUT);
  pinMode (9, INPUT);
  pinMode (10, INPUT);
 
}

void loop()
{
int push1 = digitalRead (8);
int push2 = digitalRead (9);
int push3 = digitalRead (10);
int menuIndex = (push1 + (push2*2) + (push3*3));
 
 
  Serial.println (menuIndex);
 
  switch (menuIndex)
  {
    case 1:
       menuIndex = 1;
       switch (menuIndex)
       {
          case 11:
             menuIndex = 1;
          break;
          case 12:
             menuIndex = 2;
             lcd.clear ();
             lcd.print("2");
           break;
          case 13:
             menuIndex = 3;
             lcd.clear ();
             lcd.print("3");
          break;
          case 1:
             lcd.clear ();
             lcd.setCursor(1, 0);
             lcd.print("Intervallo di log");
             lcd.setCursor(1, 4);
             lcd.print("ESC");
             lcd.setCursor(9, 4);
             lcd.print("OK");
             lcd.setCursor(16, 4);
             lcd.print(">");
             delay (10000);
          break;
       }   
    case 2:
       menuIndex = 2;
       lcd.clear ();
       lcd.print("2");
       break;
    case 3:
       menuIndex = 3;
       lcd.clear ();
       lcd.print("3");
       break;
    default:
       lcd.clear();
       lcd.setCursor(1, 0);
       lcd.print("pH : 7.01");
       lcd.setCursor(1, 4);
       lcd.print("LOG");
       lcd.setCursor(7, 4);
       lcd.print("MENU");
       lcd.setCursor(14, 4);
       lcd.print("PRINT");
       delay (1000);
  }
}


Scusate se non è commentato ma è ancora una bozza. Volevo chiedervi se per voi sono sulla strada giusta oppure se il case per vari motivi, sia impossibile da nidificare.
Tra l'altro, non volendo, ho fatto una cosa carina, nel senso che se su una sotto-schermata non si preme nulla per alcuni secondi, esso torna alla schermata iniziale.
Sono curioso di sapere il vostro parere,
grazie!

ZioWally

Ho poca esperienza, ma in passato ho avuto anch'io la necessità di gestire dei menù.

Forse già lo sai, ma esiste una libreria che si chiama menubackend che si occupa proprio di questo.
Quando ci ho provato io ho trovato che la creazione dei menù era abbastanza intuitiva, ho avuto più difficoltà nella gestione delle funzioni annidate.

Alla fine mi sono rassegnato ad un sistema più semplice che richiama una funzione al momento che premi un tasto di una keypad ( e adesso sto cercando il modo di togliere la keypad tradizionale e sostituirla con un telecomando IR... ma questa è un'altra storia...)

9six4

Ci avevo pensato anch'io ma mi servirebbero troppi tasti, in più ogni funzione mi piacerebbe avesse un minimo di possibilità di gestione.

Del menubackend avevo già letto, l'ho guardato, ma onestamente non ci ho capito una mazza!
Onestamente da inesperto credevo di poter gestire tutto con uno switch-case nidificato, ma trovo difficoltà nell'indicizzare i sottomenù  :~

Grazie lo stesso comunque!

leo72

Ogni menu deve essere uno switch..case a sé stante.
Quindi, il primo switch..case per gestire il menu principale. Se clicchi su un'opzione, vedi avviare un'altra subroutine dove, con un altro switch..case gestisci le possibilità dell'opzione oppure fai apparire un successivo menu. E così avanti.
Questo è il modo più rozzo ma più semplice.

9six4

Grazie Leo,
quindi non va bene nidificarli come stavo facendo io? Come faccio a farne partire un altro distinto dal primo?

Subia75

Ci sono sviluppi riguardo al codice per i menù.

9six4

Si, purtroppo ho abbandonato la strada switch...case perchè non sono riuscito a creare un indice che potesse consentirmi di navigare agevolmente tra le varie schermate di menù. Sono passato al classico e già citato menu backend che sembra stabile e una volta compreso il funzionamento non è molto difficile da personalizzare.
Ti consiglio questa lettura:

http://www.coagula.org/content/it/pages/tutorial-come-gestire-menu-e-display-lcd-con-arduino

Dai un occhio anche al suo progetto per capire come si usa:

http://www.coagula.org/content/it/pages/coagula-midi-ribbon-controller-20-2

Subia75

grazie
avevo già visto questi articoli.
Prima o poi provo a fare questo menù.

Go Up