Richiesta aiuto per creare semplici menù con display LCD

Ciao a tutti,

ho montato sopra ad arduino uno la shield Keypad lcd e con i pin liberi ho collegato un sensore DHT11; con questa configurazione vorrei visualizzare sul display LCD dei semplici menù di configurazione, per poi decidere come utilizzarli.
Allego in relativo codice:

#include "DHT.h"
#include <LiquidCrystal.h>

int tempo=200;
int colonna=0;
int count;	
// variabili per gestione menù
int currentMenuItem=0;  
int lastState=0;		//variabile stato menù
#define DHTPIN A1
#define DHTTYPE DHT11

#define RIGHT_KEY 1
#define UP_KEY 2
#define DOWN_KEY 3
#define LEFT_KEY 4
#define SELECT_KEY 5

DHT dht(DHTPIN,DHTTYPE);

// pin usati dal display LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

byte smiley[8] = {
        0b11111,
	0b11111,
	0b11111,
	0b11111,
	0b11111,
	0b11111,
	0b11111,
	0b11111
};
void setup() {
  // put your setup code here, to run once:
  //inizializzo la porta seriale.
  Serial.begin(9600);
  lcd.begin(16, 2);              // start the library
  lcd.print("ArduTemp V1.0");
	//progressBar
  for (colonna=0; colonna<=24; colonna++)
  {
    lcd.createChar(0, smiley);
    lcd.setCursor(colonna,2);
    lcd.write(byte(0));
    delay(tempo);
  }
  dht.begin();
  clearPrintTitle();
}
void loop() {
  // put your main code here, to run repeatedly:
 
   //delay(500);
  //lcd.clear();
  float temperature,humidity;
  
  humidity=dht.readHumidity();
  temperature=dht.readTemperature();
  //temperature=temperature-6;
  
  
  char tempF[6];
  char humF[6];
  
  dtostrf(temperature,5,1,tempF);
  dtostrf(humidity,2,0,humF);
  lcd.setCursor(0, 0);
  //lcd.print("ciao");
  lcd.print("T:");
  lcd.print(tempF);
  lcd.print((char)223);
  lcd.print("C ");
  lcd.print("H: ");
  lcd.print(humF);
  lcd.print("%");  
  
  //ContaTempo();
  //letturaTasto ();
  mainMenu();
 
 }
 
int ContaTempo()  //funzione conta tempo
{
	if ((tempo +500)<millis())
  	{
  	  for(count=0; count<30;count++)
  	  {
  	    lcd.setCursor(0,2);
  	    //lcd.print(count);
  	  //  delay(1000);
  	  }
  	}
}
void mainMenu()			//funzione per la gestione dei menù
{
 int state=0;				//varibile per sapere dove sono nei menù
 int x=analogRead(0);
 Serial.println(x);
 lcd.setCursor(1,1);
 lcd.print("SETTINGS");
 
  if (x==0)		//valore verificato
  {
      //tasto right
    state=RIGHT_KEY;
    //lcd.setCursor(1,1);
    //lcd.print("right");
    //lcd.print("         ");

   }
    else if (x==98 || x==99 )		//valore verificato
   {
      //tasto up
      state=UP_KEY;
    }
    else if (x==255 ||x==256)		//valore verificato
    {
      //tasto down
      state=DOWN_KEY;
     }
    else if (x==407)		//valore verificato
    {
      //tasto left
      state=LEFT_KEY;
    }
    else if (x==638 ||x==639)		//valore verificato
    {
      //tasto select
      state=SELECT_KEY;
    }
  if (currentMenuItem < 0 || currentMenuItem > 4)
  {
      currentMenuItem = 0;
  }
 if (state!=lastState)
 {
    if (state==UP_KEY) //tasto up
	{
	  currentMenuItem=currentMenuItem-1;
	  displayMenu(currentMenuItem);
	}
	else if (state==DOWN_KEY) //tasto down
	{
	   currentMenuItem=currentMenuItem+1;
	   displayMenu(currentMenuItem);
	}
	else if (state==SELECT_KEY) //tasto select
        {
	   selectMenu(currentMenuItem);
	}
	   //Save the last State to compare.
	   lastState = state;
  }
	//Small delay
	delay(5);
}
void displayMenu(int x) //funzione gestione menù in base all'indice 
{
	switch (x) 
	{
	    case 1:
	  	clearPrintTitle();
		lcd.print ("-> Menu Option 1");
	    break;
	    case 2:
	 	clearPrintTitle();
		lcd.print ("-> Menu Option 2");
	    break;
	    case 3:
	  	clearPrintTitle();
		lcd.print ("-> Menu Option 3");
	    break;
	    case 4:
		clearPrintTitle();
		lcd.print ("-> Menu Option 4");
	    break;
            
	}
}

//Print a basic header on Row 1.

void clearPrintTitle() {

 lcd.clear();

 lcd.setCursor(0,0);

 lcd.print("test Menù");

 lcd.setCursor(0,1);

}

void selectMenu(int x) 	//fun<ione gestione sottomenù 
{
		switch (x) 
		{
			case 1:
			      clearPrintTitle();
			      lcd.print ("Selected Opt 1");				//sottomenù Option 1
			break;
			case 2:
			      clearPrintTitle();
			      lcd.print ("Selected Opt 2");				//sottomenù Option 2
			break;
			case 3:
			      clearPrintTitle();
		              lcd.print ("Selected Opt 3");				//sottomenù Option 3
			break;
			case 4:
		              clearPrintTitle();
			      lcd.print ("Selected Opt 4");				//sottomenù Option 4		
			break;	
                        
		}
}

int letturaTasto ()		//funzione lettura tasti 
{
  int tasto=0;
  int contatore=0;
  tasto=analogRead(0);	//lettura A0
    for (contatore=0; contatore<=20; contatore++)
    {
      lcd.setCursor(0, 2);
      //lcd.print(tasto);
      Serial.println(tasto);
      delay(200);
    }
}

il problema è questo: quando premo i tasti non viene visualizzato nessun menù; tenete presente che quello che vorrei fare è che la prima riga del display LCD rimanga fissa e mi visualizzi temperatura e umidità, mentre la seconda riga mi permetta di selezionare il menù e i relativi sottomenù.
I valori che vedete che identificato la pressione dei vari tasti sono corretti in quanto tramite al funzione letturaTasto li ho identificati ( tutti i testi sono collegato all’ingresso A0 di arduino con partitori differenti per poter riconoscere valori di tensione differenti in base al tasto premuto)

Spero di essere stato abbastanza chiaro.

Grazie a tutti

Ciao
fiodavid

L'hai sempre avuto davanti agli occhi, nella sezione Megatopic http://forum.arduino.cc/index.php?topic=115498.0

sto provando la libreria che mi dici tu; ho creato un shield vuoto e ho copiato gli include come da pdf allegato allo zip della libreria e cioè:
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <buttons.h>
#include <EEPROM.h>
#include <MENWIZ.h>

prova a colpilare per vedere se trova le librerie e mi da il seguente errore:

ProvaMenu.ino:2:17: fatal error: LCD.h: No such file or directory
compilation terminated.
Errore durante la compilazione

Da dentro l’ide, ho caricato la libreria dal menù Add zip library. (ide che utilizzo 1.6.3)
Dentro allo zip della libreria c’è un altro zip che le librerie richieste e ho installato anche quelle, ma mi da sempre errore.
Curiosità che non ho ancora capito: dove vanno messe le librerie di arduino che si scaricano?
perchè in documenti,arduino, c’è una cartella che si chiama “libraries” e anche in programmi, arduino c’è una cartella che si chiamo “libraries”. Quale è la differenza, e quando scarico un libreria da internet dove devo metterla?

grazie

ciao
fiodavid

il problema della libreria l’ho risolto.
Adesso devo testare un codice che ho creato, utilizzando la libreria MENWIZ ( con delle modifiche per la gestione di più tasti collegati ad un unico ingresso analogico di arduino) e qui sotto vi posto il codice:

#include <Wire.h>
#include <LCD.h>
//#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
#include <buttons.h>
#include <EEPROM.h>
#include <MENWIZ.h>
#include "DHT.h"

menwiz menu;

int tempo=200;
int colonna=0;
int count;
#define DHTPIN A1
#define DHTTYPE DHT11
DHT dht(DHTPIN,DHTTYPE);
// pin usati dal display LCD
LiquidCrystal LCD(8, 9, 4, 5, 6, 7);
#define RIGHT_KEY 1
#define UP_KEY 2
#define DOWN_KEY 3
#define LEFT_KEY 4
#define SELECT_KEY 5

byte smiley[8] = {
        0b11111,
	0b11111,
	0b11111,
	0b11111,
	0b11111,
	0b11111,
	0b11111,
	0b11111
};	
boolean wr=0; // Instantiate global variables to bind to menu

const int buttonPin = A0;             // 10 button switch circuit input connected to analog pin 0
//const int led13Pin = 13;              // the number of the LED output pin

boolean buttonBlock = 0;
boolean buttonAct = 0; // flag 1
boolean stopMenu = 0; // flag 2
byte buttonPressed = 0;  // which button was pressed
byte lastButtonPressed = 0; // prev button pressed
int buttonValue = 0;  // read value from analog port for the 4 navigation pushbuttons
long menuOffTime = 0;  //used for timer

extern byte MW_navbtn;  //needed to run the software key navigation in Menwiz

// pin usati dal display LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
menwiz tree; //menwiz object
int list,sp=110; // sp variable has 110 as default value
_menu *r,*s1,*s2; //ptr to nodes to be created (1 for each level)

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);              // start the library
  lcd.print("ArduTemp V1.0");
	//progressBar
  for (colonna=0; colonna<=24; colonna++)
  {
    lcd.createChar(0, smiley);
    lcd.setCursor(colonna,2);
    lcd.write(byte(0));
    delay(tempo);
  }
  dht.begin();
  digitalWrite((A0), HIGH);  // enable the 20k internal pullup for UNO based board for analog port A0
  
  //++++++++++++++++++++Menu and LCD  
 char b[84];
 _menu *r,*s1,*s2;

 // initialize the menu object ( 4 x rows x 20 colums LCD)
 menu.begin(&lcd,20,2);      //display 2 righe
 menu.addUsrNav(navMenu,6);
 MW_navbtn=6;  // force 4 or 6 buttons mode for menu navigation -> MW_navbtn=4; or MW_navbtn=6;

 //create the menu tree
 r=menu.addMenu(MW_ROOT,NULL,F("MAIN MENU"));                      //create a root menu at first (required)

 //---------------  
 s1=menu.addMenu(MW_SUBMENU,r,F("SET1"));                     //add a submenu node 1 to the root menu
 s2=menu.addMenu(MW_VAR,s1,F("MD"));                         //add a terminal node in the menu tree (that is "variable");
 s2=menu.addMenu(MW_VAR,s1,F("BR"));                         //add a terminal node in the menu tree (that is "variable");
 s2=menu.addMenu(MW_VAR,s1,F("RH"));                         //add a terminal node in the menu tree (that is "variable");

 //---------------
 s1=menu.addMenu(MW_SUBMENU,r,F("SET2"));                    //add a submenu node 2 to the root menu
 s2=menu.addMenu(MW_VAR,s1,F("CP"));                         //add a terminal node in the menu tree (that is "variable");
 s2=menu.addMenu(MW_VAR,s1,F("DB"));                         //add a terminal node in the menu tree (that is "variable");
 s2=menu.addMenu(MW_VAR,s1,F("SQ"));                         //add a terminal node in the menu tree (that is "variable");

 //---------------
 s1=menu.addMenu(MW_SUBMENU,r,F("SET3"));                    //add a submenu node 3 to the root menu
 s2=menu.addMenu(MW_VAR,s1,F("RS"));                         //add a terminal node in the menu tree (that is "variable");
 s2=menu.addMenu(MW_VAR,s1,F("RCALIB"));                     //add a terminal node in the menu tree (that is "variable");
 s2=menu.addMenu(MW_VAR,s1,F("SCALIB"));                     //add a terminal node in the menu tree (that is "variable");


 //++++++ Splash screen +++++++
 
 sprintf(menu.sbuf,"TEST minimum menu\nwith 4 or 6\nanalog push buttons\n",1);
 menu.addSplash((char *) menu.sbuf, 1000);

 //++++++ Userscreen ++++++++++
 // create an user define screen callback to activate after X secs since last button push
 menu.addUsrScreen(msc,3000);

 //pinMode(led13Pin, OUTPUT);                // initialize the led as a output control pin
}


void loop() {
  
 float temperature,humidity;
  
  humidity=dht.readHumidity();
  temperature=dht.readTemperature();
  //temperature=temperature-6;
  
  
  char tempF[6];
  char humF[6];
  
  dtostrf(temperature,5,1,tempF);
  dtostrf(humidity,2,0,humF);
  lcd.setCursor(0, 0);
  //lcd.print("ciao");
  lcd.print("T:");
  lcd.print(tempF);
  lcd.print((char)223);
  lcd.print("C ");
  lcd.print("H: ");
  lcd.print(humF);
  lcd.print("%");  
  
 // NAVIGATION MANAGEMENT & DRAWING ON LCD. NOT BLOCKING has to be the first in the void loop
  menu.draw();

  readButtons();

}

//  ++++++ functions +++++++

void readButtons()

// ++++ Control 5 buttons ++++
{
 lastButtonPressed = buttonPressed;

 /*
 Analog values representing the pushbutton value are depending on the resitor value used.
  Test the values first with the serial.monitor
  */
 buttonValue = analogRead(buttonPin); //analog value to simulate the pushed buttons

 if(buttonValue==0)
 {
   buttonPressed = RIGHT_KEY;
   noButtonPressed(); // is calling an extra fucntion
 }
 else  if(buttonValue == 98 || buttonValue == 99)
 {
   buttonPressed = UP_KEY ;
   buttonAct = 1; // set the menu flag1
   
 }
 else if(buttonValue == 255 || buttonValue ==256)
 {    
   buttonPressed = DOWN_KEY;
   buttonAct = 1; // set the menu flag1
 }
 else if(buttonValue == 407)
 {    
   buttonPressed = LEFT_KEY;
   buttonAct = 1; // set the menu flag1
 }
 else if(buttonValue == 638 || buttonValue ==639)
 {    
   buttonPressed = SELECT_KEY;
   buttonAct = 1; // set the menu flag1
 }
}

int noButtonPressed()
{
 return MW_BTNULL;
}

int navMenu() // called from menu.draw
{
 /*
  As soon as a button is pushed the first time flag 1 is set to HIGH and if the buttonnumber is not 0 then a timer is started.
  The menu action then should only be performed once.
  After 2000 msecs the flag will be set to LOW and a new buttonpush can be processed.
  Menu action is blocked for 2000 msec even if the same button is being kept pressed for 2000 msecs by flag2.
  */

 long menublockTime = millis();

 if (buttonAct == 1 && buttonPressed != 0 && stopMenu == 0)  // we have a state were we process a menu navigation step once and block it for 2 secs
 {
  // digitalWrite(led13Pin,HIGH);  // set timer led ON
   menuOffTime = menublockTime  + 2000; //start the timer. You can change this blocking time to your convenience but do not make it lower aa 200 msecs
   stopMenu = 1;

   switch (buttonPressed)
   {
   case 1: // RIGHT
     return MW_BTL;
     break;
   case 2: // UP
     return MW_BTU;
     break;
   case 3: // Down
     return MW_BTD;
     break;    
   case 4: // LEFT
     return MW_BTR;
     break;
   case 5: // CONFIRM
     return MW_BTC;
     break; 
 }
 }

 if (menuOffTime != 0  &&  menublockTime  > menuOffTime)  //  Reset of the timer so a new menu action can be processed
 {
   buttonAct = 0; // resets the flag 1
   buttonPressed = 0;
   menuOffTime = 0;  // resets timer to zero
   stopMenu = 0;
 //  digitalWrite(led13Pin,LOW);  // set timer led OFF
 }
}

// user defined default screen.
void msc()
{
 sprintf(menu.sbuf,"User screen\nUptime (s): %ld\nFree mem  : %d\n\n",millis()/1000,(int)menu.freeRam());
 menu.drawUsrScreen(menu.sbuf);
}

Spero funzioni adesso.
Qualcuno sicuramente più esperto di me, potrebbe gentilmente dargli un occhiata e dirmi se può andare bene?

grazie a tutti

ciao
fiodavid

Qualcuno riesce a darmi una mano per capire se ho implementato correttamente la libreria nel mio codice?

Grazie a tutti

ciao
fiodavid