MenuBackend + LiquidCrystal LCD KeyPad shield

Salve a tutti,

Ho realizzato vari progetti e finora modificavo dei valori tipo delay() tramite Computer, ma adesso sono arrivato al punto di volermi staccare dal cordone ombelicale, ho cercato in rete e finora ho trovato e capito +o- o come impostare un menù o come scrivere su un lcd, ma creare un menu setting è ben più complesso, o così credo, ma forse perché in rete ci sono solo progetti già terminati o con centinaia di righe di comando, e molti sono nuovi per me!

dei programmi già compilati per altre applicazioni l’ho trovato, ma la maggior parte per scorrere i menu usano ingressi digitali, mentre io avendo acquistato un LCD KeyPad shield http://handsonarduinomega.blogspot.it/2012/08/first-test-with-lcd-keypad-shield.html e quindi ho 1 ingresso analogico.

Quindi per cominciare ho fatto un programma “Ibrido” prendendo due programmi base che non avendo modificato nessuna stringa non fa quello che vorrei!

So benissimo cosa fa un programma e cosa fa l’altro, ma far comparire sul’lcd e scorrere i vari menu ho modificato alcune stringhe ma non và.

vi posto quello di base.

Anticipo per differenziare un programma dall’altro ho scritto //ProgramBtn

#include <MenuBackend.h>
#include <LiquidCrystal.h>                         //ProgramBtn
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);               //ProgramBtn
 
#define btnRIGHT  0                                //ProgramBtn
#define btnUP     1                                //ProgramBtn                                
#define btnDOWN   2                                //ProgramBtn
#define btnLEFT   3                                //ProgramBtn
#define btnSELECT 4                                //ProgramBtn
#define btnNONE   5                                //ProgramBtn
 
int read_buttons() {                                //ProgramBtn
  
int adc_key_in = analogRead(0);                     //ProgramBtn
 
 if (adc_key_in > 1000) return btnNONE;             //ProgramBtn
 if (adc_key_in < 50)   return btnRIGHT;            //ProgramBtn
 if (adc_key_in < 195)  return btnUP;               //ProgramBtn
 if (adc_key_in < 380)  return btnDOWN;             //ProgramBtn
 if (adc_key_in < 555)  return btnLEFT;             //ProgramBtn
 if (adc_key_in < 790)  return btnSELECT;           //ProgramBtn
}   


/*
	This is the structure of the modelled menu
	
	Settings
		Pin
		Debug
	Options
		Delay (D)
			100 ms
			200 ms
			300 ms
			400 ms
*/

//this controls the menu backend and the event generation
MenuBackend menu = MenuBackend(menuUseEvent,menuChangeEvent);
	//beneath is list of menu items needed to build the menu
	MenuItem settings = MenuItem("Settings");
		MenuItem pin = MenuItem("Pin");
		MenuItem debug = MenuItem("Debug");
	MenuItem options = MenuItem("Options");
		MenuItem setDelay = MenuItem("Delay",'D');
			MenuItem d100 = MenuItem("100 ms");
			MenuItem d200 = MenuItem("200 ms");
			MenuItem d300 = MenuItem("300 ms");
			MenuItem d400 = MenuItem("400 ms");
	
//this function builds the menu and connects the correct items together
void menuSetup()
{
	Serial.println("Setting up menu...");
	//add the file menu to the menu root
	menu.getRoot().add(settings); 
		//setup the settings menu item
		settings.addRight(pin);
			//we want looping both up and down
			pin.addBefore(debug);
			pin.addAfter(debug);
			debug.addAfter(pin);
			//we want a left movement to pint to settings from anywhere
			debug.addLeft(settings);
			pin.addLeft(settings);
	settings.addBefore(options);
	settings.addAfter(options);
		options.addRight(setDelay);
			setDelay.addLeft(options);
			setDelay.addRight(d100);
				d100.addBefore(d100); //loop to d400 
				d100.addAfter(d200);
				d200.addAfter(d300);
				d300.addAfter(d400);
				d400.addAfter(d100); //loop back to d100
				//we want left to always be bak to delay
				d100.addLeft(setDelay);
				d200.addLeft(setDelay);
				d300.addLeft(setDelay);
				d400.addLeft(setDelay);
	options.addAfter(options);
}

/*
	This is an important function
	Here all use events are handled
	
	This is where you define a behaviour for a menu item
*/
void menuUseEvent(MenuUseEvent used)
{
	Serial.print("Menu use ");
	Serial.println(used.item.getName());
	if (used.item == setDelay) //comparison agains a known item
	{
		Serial.println("menuUseEvent found Dealy (D)");
	}
}

/*
	This is an important function
	Here we get a notification whenever the user changes the menu
	That is, when the menu is navigated
*/
void menuChangeEvent(MenuChangeEvent changed)
{
	Serial.print("Menu change ");
	Serial.print(changed.from.getName());
	Serial.print(" ");
	Serial.println(changed.to.getName());
}

void setup()
{
	Serial.begin(9600);
	
	menuSetup();
	Serial.println("Starting navigation:\r\nUp: w   Down: s   Left: a   Right: d   Use: e");

        lcd.begin(16, 2);                                  //ProgramBtn
        lcd.setCursor(0,0);                                //ProgramBtn
        lcd.print("Keypad demo");                          //ProgramBtn

}

void loop()
{
  
  lcd.setCursor(0,1);                                //ProgramBtn
  lcd.print("Pressed:");                             //ProgramBtn
 
  int buttons = read_buttons();                      //ProgramBtn
  lcd.setCursor(9, 1);                               //ProgramBtn
  if(buttons == btnRIGHT)       lcd.print("RIGHT "); //ProgramBtn
  else if(buttons == btnLEFT)   lcd.print("LEFT  "); //ProgramBtn                   
  else if(buttons == btnUP)     lcd.print("UP    "); //ProgramBtn                               
  else if(buttons == btnDOWN)   lcd.print("DOWN  "); //ProgramBtn                               
  else if(buttons == btnSELECT) lcd.print("SELECT"); //ProgramBtn                               
  else if(buttons == btnNONE)   lcd.print("NONE  "); //ProgramBtn
 
 
 
	if (Serial.available()) {
		byte read = Serial.read();
		switch (read) {
			case 'w': menu.moveUp(); break;
			case 's': menu.moveDown(); break;
			case 'd': menu.moveRight(); break;
			case 'a': menu.moveLeft(); break;
			case 'e': menu.use(); break;
		}
	}
}

Ringrazio in anticipo e spero in una vs risposta.

Rieccomi,

sono andato avanti e ho risolto molto dei miei dubbi,

adesso ho un’ultimo problema…
quando defeziono lo stato Blink 100 … blink 1000, ho difficoltà e ritornare nel menù,
posso sapere dove sbaglio???

#include <MenuBackend.h>
#include <LiquidCrystal.h>                         //ProgramBtn
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);               //ProgramBtn


int backLight   = 10;  //Luminosità LCD Pin10
int led = 13;

int Stato = 00;

#define btnRIGHT  0                                //ProgramBtn
#define btnUP     1                                //ProgramBtn                                
#define btnDOWN   2                                //ProgramBtn
#define btnLEFT   3                                //ProgramBtn
#define btnSELECT 4                                //ProgramBtn
#define btnNONE   5                                //ProgramBtn

 int read_buttons() {                                //ProgramBtn
  
 int adc_key_in = analogRead(0);                     //ProgramBtn
 delay(10);
 if (adc_key_in != analogRead(0)) return btnNONE;  // double checks the keypress. If the two readings are not equal after debounce delay, it tries again.
 if (adc_key_in > 1000) return btnNONE;             //ProgramBtn
 if (adc_key_in < 50)   return btnRIGHT;            //ProgramBtn
 if (adc_key_in < 195)  return btnUP;               //ProgramBtn
 if (adc_key_in < 380)  return btnDOWN;             //ProgramBtn
 if (adc_key_in < 555)  return btnLEFT;             //ProgramBtn
 if (adc_key_in < 790)  return btnSELECT;           //ProgramBtn
 
}   



MenuBackend menu = MenuBackend(menuUsed, menuChanged);
   //beneath is list of menu items needed to build the menu
   MenuItem Item1= MenuItem("Statico");
      MenuItem Item1Sub1 = MenuItem("Accendere Led");
      MenuItem Item1Sub2 = MenuItem("Spegnere Led");
   MenuItem Item2 = MenuItem("Dinamico");
      MenuItem Item2Sub1 = MenuItem("Blink 100");
      MenuItem Item2Sub2 = MenuItem("Blink 200");
      MenuItem Item2Sub3 = MenuItem("Blink 300");
      MenuItem Item2Sub4 = MenuItem("Blink 1000");
         
void menuSetup()
{
		menu.getRoot().add(Item1); 
                Item1.addRight(Item2);
                      Item1.add(Item1Sub1).addRight(Item1Sub2).addRight(Item1Sub1);
                Item2.add(Item2Sub1).addRight(Item2Sub2).addRight(Item2Sub3).addRight(Item2Sub4); //.addRight(Item1);
}
void menuUsed(MenuUseEvent used)
{
	Serial.print("Menu use ");
	Serial.println(used.item.getName());
        
	if (used.item == Item1Sub1){ lcd.clear(); lcd.setCursor(0,1); lcd.print("LED ON");     Stato = 10; }
   else if (used.item == Item1Sub2){ lcd.clear(); lcd.setCursor(0,1); lcd.print("LED OFF");    Stato = 20; }
   else if (used.item == Item2Sub1){ lcd.clear(); lcd.setCursor(0,1); lcd.print("Blink 100");  Stato = 30; }
   else if (used.item == Item2Sub2){ lcd.clear(); lcd.setCursor(0,1); lcd.print("Blink 200");  Stato = 40; }
   else if (used.item == Item2Sub3){ lcd.clear(); lcd.setCursor(0,1); lcd.print("Blink 300");  Stato = 50; }
   else if (used.item == Item2Sub4){ lcd.clear(); lcd.setCursor(0,1); lcd.print("Blink 1000"); Stato = 60; }
   
}

void menuChanged(MenuChangeEvent changed)
{
   MenuItem newMenuItem = changed.to; //get the destination menu
  lcd.setCursor(0,1); //set the start position for lcd printing to the second row

       //if (newMenuItem.getName() == menu.getRoot()){ lcd.clear(); lcd.setCursor(0,1); lcd.print("Settings");}
  //else if (newMenuItem.getName() == "Blink 100"){ lcd.clear(); lcd.setCursor(0,1); lcd.print("Blink 100"); digitalWrite(led, HIGH); delay(100); digitalWrite(led, LOW); delay(100);}   
    
	Serial.print("Menu change ");
	Serial.print(changed.from.getName());
	Serial.print(" ");
	Serial.println(changed.to.getName());
        lcd.setCursor(0,1);
        lcd.clear();
        lcd.print(changed.to.getName());
        
       
}

void setup()
{
        analogWrite(backLight, 40);
        pinMode(led, OUTPUT);
	Serial.begin(9600);
	
	menuSetup();

        lcd.begin(16, 2);                                  //ProgramBtn
        lcd.setCursor(0,0);        //ProgramBtn
        lcd.clear();
        delay(3000);
        lcd.print("Avvio");
        
}

void loop()
{
  int buttons = read_buttons();                      
  
       if(buttons == btnRIGHT)  { menu.moveRight();   delay(300);}    
  else if(buttons == btnLEFT)   { menu.moveLeft();    delay(300);}    
  else if(buttons == btnUP)     { menu.moveUp();      delay(300);}        
  else if(buttons == btnDOWN)   { menu.moveDown();    delay(300);}                          
  else if(buttons == btnSELECT) { menu.use();                   ;}    
  else if(buttons == btnNONE){  };    
  
        if (Stato == 10) { digitalWrite(led, HIGH); }
   else if (Stato == 20) { digitalWrite(led, LOW); }
   else if (Stato == 30) { digitalWrite(led, HIGH); delay(100); digitalWrite(led, LOW); delay(100); }
   else if (Stato == 40) { digitalWrite(led, HIGH); delay(200); digitalWrite(led, LOW); delay(200); }
   else if (Stato == 50) { digitalWrite(led, HIGH); delay(300); digitalWrite(led, LOW); delay(300); }
   else if (Stato == 60) { digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); }
                            

}

scusate come scrivo il programma ma faccio tutt’altro nella vita!

:slight_smile:

Oppure per risolvere il problema dovrei usare un comando Millis (), in modo da non interrompere il ciclo di controllo pulsante???

Per quanto riguarda lo “… scusate come scrivo il programma” … intanto impara ad usare la voce che hai nel menu Tools → Auto Format … che, automaticamente, ti sistema il codice in modo più corretto è leggibile :

#include <MenuBackend.h>
#include <LiquidCrystal.h>                         //ProgramBtn
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);               //ProgramBtn

int backLight = 10;                                //Luminosità LCD Pin10
int led = 13;
int Stato = 00;

#define btnRIGHT  0                                //ProgramBtn
#define btnUP     1                                //ProgramBtn                                
#define btnDOWN   2                                //ProgramBtn
#define btnLEFT   3                                //ProgramBtn
#define btnSELECT 4                                //ProgramBtn
#define btnNONE   5                                //ProgramBtn

int read_buttons() {                               //ProgramBtn

   int adc_key_in = analogRead(0);                 //ProgramBtn
   delay(10);
   if (adc_key_in != analogRead(0)) return btnNONE;   // double checks the keypress. If the two readings are not equal after debounce delay, it tries again.
   if (adc_key_in > 1000) return btnNONE;             //ProgramBtn
   if (adc_key_in < 50)   return btnRIGHT;            //ProgramBtn
   if (adc_key_in < 195)  return btnUP;               //ProgramBtn
   if (adc_key_in < 380)  return btnDOWN;             //ProgramBtn
   if (adc_key_in < 555)  return btnLEFT;             //ProgramBtn
   if (adc_key_in < 790)  return btnSELECT;           //ProgramBtn

}   

MenuBackend menu = MenuBackend(menuUsed, menuChanged);
//beneath is list of menu items needed to build the menu
MenuItem Item1= MenuItem("Statico");
MenuItem Item1Sub1 = MenuItem("Accendere Led");
MenuItem Item1Sub2 = MenuItem("Spegnere Led");
MenuItem Item2 = MenuItem("Dinamico");
MenuItem Item2Sub1 = MenuItem("Blink 100");
MenuItem Item2Sub2 = MenuItem("Blink 200");
MenuItem Item2Sub3 = MenuItem("Blink 300");
MenuItem Item2Sub4 = MenuItem("Blink 1000");

void menuSetup()
{
   menu.getRoot().add(Item1); 
   Item1.addRight(Item2);
   Item1.add(Item1Sub1).addRight(Item1Sub2).addRight(Item1Sub1);
   Item2.add(Item2Sub1).addRight(Item2Sub2).addRight(Item2Sub3).addRight(Item2Sub4); //.addRight(Item1);
}

void menuUsed(MenuUseEvent used)
{
   Serial.print("Menu use ");
   Serial.println(used.item.getName());

   if (used.item == Item1Sub1){ 
      lcd.clear(); 
      lcd.setCursor(0,1); 
      lcd.print("LED ON");     
      Stato = 10; 
   }
   else if (used.item == Item1Sub2){ 
      lcd.clear(); 
      lcd.setCursor(0,1); 
      lcd.print("LED OFF");    
      Stato = 20; 
   }
   else if (used.item == Item2Sub1){ 
      lcd.clear(); 
      lcd.setCursor(0,1); 
      lcd.print("Blink 100");  
      Stato = 30; 
   }
   else if (used.item == Item2Sub2){ 
      lcd.clear(); 
      lcd.setCursor(0,1); 
      lcd.print("Blink 200");  
      Stato = 40; 
   }
   else if (used.item == Item2Sub3){ 
      lcd.clear(); 
      lcd.setCursor(0,1); 
      lcd.print("Blink 300");  
      Stato = 50; 
   }
   else if (used.item == Item2Sub4){ 
      lcd.clear(); 
      lcd.setCursor(0,1); 
      lcd.print("Blink 1000"); 
      Stato = 60; 
   }
}

void menuChanged(MenuChangeEvent changed)
{
   MenuItem newMenuItem = changed.to; //get the destination menu
   lcd.setCursor(0,1); //set the start position for lcd printing to the second row

   //if (newMenuItem.getName() == menu.getRoot()){ lcd.clear(); lcd.setCursor(0,1); lcd.print("Settings");}
   //else if (newMenuItem.getName() == "Blink 100"){ lcd.clear(); lcd.setCursor(0,1); lcd.print("Blink 100"); digitalWrite(led, HIGH); delay(100); digitalWrite(led, LOW); delay(100);}   

   Serial.print("Menu change ");
   Serial.print(changed.from.getName());
   Serial.print(" ");
   Serial.println(changed.to.getName());
   lcd.setCursor(0,1);
   lcd.clear();
   lcd.print(changed.to.getName());
}

void setup()
{
   analogWrite(backLight, 40);
   pinMode(led, OUTPUT);
   Serial.begin(9600);

   menuSetup();

   lcd.begin(16, 2);                                  //ProgramBtn
   lcd.setCursor(0,0);        //ProgramBtn
   lcd.clear();
   delay(3000);
   lcd.print("Avvio");
}

void loop()
{
   int buttons = read_buttons();                      

   if(buttons == btnRIGHT)  { 
      menu.moveRight();   
      delay(300);
   }    
   else if(buttons == btnLEFT)   { 
      menu.moveLeft();    
      delay(300);
   }    
   else if(buttons == btnUP)     { 
      menu.moveUp();      
      delay(300);
   }        
   else if(buttons == btnDOWN)   { 
      menu.moveDown();    
      delay(300);
   }                          
   else if(buttons == btnSELECT) { 
      menu.use();                   
      ;
   }    
   else if(buttons == btnNONE){  
   };    

   if (Stato == 10) { 
      digitalWrite(led, HIGH); 
   }
   else if (Stato == 20) { 
      digitalWrite(led, LOW); 
   }
   else if (Stato == 30) { 
      digitalWrite(led, HIGH); 
      delay(100); 
      digitalWrite(led, LOW); 
      delay(100); 
   }
   else if (Stato == 40) { 
      digitalWrite(led, HIGH); 
      delay(200); 
      digitalWrite(led, LOW); 
      delay(200); 
   }
   else if (Stato == 50) { 
      digitalWrite(led, HIGH); 
      delay(300); 
      digitalWrite(led, LOW); 
      delay(300); 
   }
   else if (Stato == 60) { 
      digitalWrite(led, HIGH); 
      delay(1000); 
      digitalWrite(led, LOW); 
      delay(1000); 
   }
}

… per il resto … vedi tu, ricordando sempre che durante una delay() il tutto è congelato, quindi … non vengono lette eventuali pressioni di bottoni o altri eventi esterni (… salvo quelli gestiti da interrupts). Se tu hai condizioni in cui questo non deve avvenire, allora l’unica soluzione è usare opportunamente la millis(), se invece non hai queste condizioni … allora si può usare la delay().

A te valutare le necessità del tuo codice … :roll_eyes:

Guglielmo

Grazie mille del supporto e grazie per il comando Auto Format .. che non conoscevo!

Saluti Fabio

farotol:
Grazie mille del supporto e grazie per il comando Auto Format … che non conoscevo!

Lo so … quasi nessuno si accorge di questo utile comando … che, specie per chi inizia, è molto utile ed educativo … :slight_smile:

Per quanto riguarda millis(), magari li hai già visti, comunque ti segnalo due articoli del nostro moderatore Leo … QUESTO e poi QUESTO :wink:

Guglielmo

Questo è il programma funzionante (Di Base)

ma giusto per capire come funziona per poi applicare tutti i sottoprogrammi desiderati.

Grazie a tutti!!

#include <MenuBackend.h>
#include <LiquidCrystal.h>                         //ProgramBtn
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);               //ProgramBtn


int backLight   = 10;  //Luminosità LCD Pin10
int led = 13;

int Stato = 00;
int value = LOW;
long previousMillis = 0;
long interval;


#define btnRIGHT  0                                //ProgramBtn
#define btnUP     1                                //ProgramBtn                                
#define btnDOWN   2                                //ProgramBtn
#define btnLEFT   3                                //ProgramBtn
#define btnSELECT 4                                //ProgramBtn
#define btnNONE   5                                //ProgramBtn

int read_buttons() {                                //ProgramBtn

  int adc_key_in = analogRead(0);                     //ProgramBtn
  delay(10);
  if (adc_key_in != analogRead(0)) return btnNONE;  // double checks the keypress. If the two readings are not equal after debounce delay, it tries again.
  if (adc_key_in > 1000) return btnNONE;             //ProgramBtn
  if (adc_key_in < 50)   return btnRIGHT;            //ProgramBtn
  if (adc_key_in < 195)  return btnUP;               //ProgramBtn
  if (adc_key_in < 380)  return btnDOWN;             //ProgramBtn
  if (adc_key_in < 555)  return btnLEFT;             //ProgramBtn
  if (adc_key_in < 790)  return btnSELECT;           //ProgramBtn

}   



MenuBackend menu = MenuBackend(menuUsed, menuChanged);
//beneath is list of menu items needed to build the menu
MenuItem Item1= MenuItem("Statico");
MenuItem Item1Sub1 = MenuItem("Accendere Led");
MenuItem Item1Sub2 = MenuItem("Spegnere Led");
MenuItem Item2 = MenuItem("Dinamico");
MenuItem Item2Sub1 = MenuItem("Blink 100");
MenuItem Item2Sub2 = MenuItem("Blink 200");
MenuItem Item2Sub3 = MenuItem("Blink 300");
MenuItem Item2Sub4 = MenuItem("Blink 1000");

void menuSetup()
{
  menu.getRoot().add(Item1); 
  Item1.addRight(Item2);
  Item1.add(Item1Sub1).addRight(Item1Sub2).addRight(Item1Sub1);
  Item2.add(Item2Sub1).addRight(Item2Sub2).addRight(Item2Sub3).addRight(Item2Sub4); //.addRight(Item1);
}
void menuUsed(MenuUseEvent used)
{
  Serial.print("Menu use ");
  Serial.println(used.item.getName());

  if (used.item == Item1Sub1){ 
    lcd.clear(); 
    lcd.setCursor(0,1); 
    lcd.print("LED ON");     
    Stato = 10; 
  }
  else if (used.item == Item1Sub2){ 
    lcd.clear(); 
    lcd.setCursor(0,1); 
    lcd.print("LED OFF");    
    Stato = 20; 
  }
  else if (used.item == Item2Sub1){ 
    lcd.clear(); 
    lcd.setCursor(0,1); 
    lcd.print("Blink 100");  
    Stato = 30; 
    interval = 100; 
  }
  else if (used.item == Item2Sub2){ 
    lcd.clear(); 
    lcd.setCursor(0,1); 
    lcd.print("Blink 200");  
    Stato = 30; 
    interval = 200; 
  }
  else if (used.item == Item2Sub3){ 
    lcd.clear(); 
    lcd.setCursor(0,1); 
    lcd.print("Blink 300");  
    Stato = 30; 
    interval = 300; 
  }
  else if (used.item == Item2Sub4){ 
    lcd.clear(); 
    lcd.setCursor(0,1); 
    lcd.print("Blink 1000"); 
    Stato = 30; 
    interval = 1000; 
  }

}

void menuChanged(MenuChangeEvent changed)
{
  MenuItem newMenuItem = changed.to; //get the destination menu
  lcd.setCursor(0,1); //set the start position for lcd printing to the second row

  //if (newMenuItem.getName() == menu.getRoot()){ lcd.clear(); lcd.setCursor(0,1); lcd.print("Settings");}
  //else if (newMenuItem.getName() == "Blink 100"){ lcd.clear(); lcd.setCursor(0,1); lcd.print("Blink 100"); digitalWrite(led, HIGH); delay(100); digitalWrite(led, LOW); delay(100);}   

  Serial.print("Menu change ");
  Serial.print(changed.from.getName());
  Serial.print(" ");
  Serial.println(changed.to.getName());
  lcd.setCursor(0,1);
  lcd.clear();
  lcd.print(changed.to.getName());


}

void setup()
{
  analogWrite(backLight, 10);
  pinMode(led, OUTPUT);
  Serial.begin(9600);

  menuSetup();

  lcd.begin(16, 2);                                  //ProgramBtn
  lcd.setCursor(0,0);        //ProgramBtn
  lcd.clear();
  delay(3000);
  lcd.print("Avvio");

}

void loop()
{
  int buttons = read_buttons();                      

  if(buttons == btnRIGHT)  { 
    menu.moveRight();   
    delay(300);
  }    
  else if(buttons == btnLEFT)   { 
    menu.moveLeft();    
    delay(300);
  }    
  else if(buttons == btnUP)     { 
    menu.moveUp();      
    delay(300);
  }        
  else if(buttons == btnDOWN)   { 
    menu.moveDown();    
    delay(300);
  }                          
  else if(buttons == btnSELECT) { 
    menu.use();                   
    ;
  }    
  else if(buttons == btnNONE){  
  };    

  if (Stato == 10) { 
    digitalWrite(led, HIGH); 
    analogWrite(backLight, 255); 
  }
  else if (Stato == 20) { 
    digitalWrite(led, LOW);  
    analogWrite(backLight,  10); 
  }
  else if (Stato == 30) { 
    if (millis() - previousMillis > interval) { 
      previousMillis = millis(); 
      if (value == LOW) value = HIGH; 
      else value = LOW; 
      digitalWrite(led, value); 
    } 
  }


}