Go Down

Topic: Menu lcd con lettura sensori (Read 4110 times) previous topic - next topic

zinco_mp

Salve. Sono nuovo del forum e sono alle prime da programmatore. Comunque mi sto cimentando in un progetto che, per semplificare, consente di navigare in menu e sottomenu visualizzati su un lcd mediante pulsanti per la visualizzazione di vari sensori ed altre informazioni.
Il mio 1° problema sta qua: per la visualizzazione dei menu ho incluso la libreria MenuBackend, solo che con la pressione del pulsante denominato ESC vorrei tornare alla radice del menu anziché ripercorrere al contrario le varie pagine dei menu.  
2° problema: non riesco in alcun modo a visualizzare nei menu corrispondenti la lettura dei vari sensori. Pur non dandomi errore nella compilazione, sull'lcd non compare nulla.
Attendo aiuti!!!
Grazie

Brado

Ciao, essendo nuovo ti conviene presentarti prima che arrivino i grandi capi. ;)

Poi, essendo noi non ancora dotati di poteri soprannaturali, come facciamo a sapere quali problemi ha il tuo sketch se non lo posti ?

simonenascivera

Se vuoi guarda qui che c'è una libreria per i menu sul lcd fatta da un utente del forum
http://forum.arduino.cc/index.php?topic=115498.0

zinco_mp

Giustissimo!!!
Mi chiamo Michele e sono della prov. di Bari.
Sono un elettricista e come accennato sto cercando di programmare con Arduino Mega, un impianto di termoregolazione fatto di sonde, sensori di temperature, co2 ecc., il tutto visualizzabile da menu e sottomenu su lcd.
Spremendo le meningi e con la libreria MenuBackend di Menwiz sono riuscito ad avere una prima bozza di menu.
Il mi primo problema sta in questo: quando nel menu corrispondente dell'lcd compare la temperatura di un dato sensore, questa non varia ma rimane fissa sino a quando, con i pulsanti di navigazione, non mi sposto in altri menu e poi ritorno sullo stesso di prima. Spero di essermi spiegato (SONO ALLE PRIME ARMI).
Ecco lo sketch semplificato che ho realizzato.



zinco_mp

Code: [Select]
#include <DHT.h>
#include <MenuBackend.h>
#include <LiquidCrystal.h>  //this library is included in the Arduino IDE
#define THingresso 23 //indico che il sensore posizionato in INGRESSO-BIBLIOTECA è collegato al pin 22
#define TH2sala 25
#define DHTTYPE DHT11 // dht11 è il tipo di sensore che uso

DHT dht1(THingresso, DHTTYPE); //nel programma i sensori posizionati nelle zone prenderanno il nome di dht1-dht2...
DHT dht2(TH2sala, DHTTYPE);

const int buttonPinLeft = 44;      // pin for the Up button
const int buttonPinRight = 46;    // pin for the Down button
const int buttonPinEsc = 50;     // pin for the Esc button
const int buttonPinEnter = 48;   // pin for the Enter button

int lastButtonPushed = 0;

int lastButtonEnterState = LOW;   // the previous reading from the Enter input pin
int lastButtonEscState = LOW;   // the previous reading from the Esc input pin
int lastButtonLeftState = LOW;   // the previous reading from the Left input pin
int lastButtonRightState = LOW;   // the previous reading from the Right input pin

long lastEnterDebounceTime = 0;  // the last time the output pin was toggled
long lastEscDebounceTime = 0;  // the last time the output pin was toggled
long lastLeftDebounceTime = 0;  // the last time the output pin was toggled
long lastRightDebounceTime = 0;  // the last time the output pin was toggled
long debounceDelay = 100;    // the debounce time

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

//Menu variables
MenuBackend menu = MenuBackend(menuUsed,menuChanged);
//initialize menuitems
MenuItem menu1Item1 = MenuItem("Item1");
MenuItem menuItem1SubItem1 = MenuItem("Item1SubItem1");
MenuItem menuItem1SubItem2 = MenuItem("Item1SubItem2");
MenuItem menu1Item2 = MenuItem("Item2");
MenuItem menuItem2SubItem1 = MenuItem("Item2SubItem1");
MenuItem menuItem2SubItem2 = MenuItem("Item2SubItem2");
MenuItem menuItem2SubItem3 = MenuItem("Item2SubItem3");
MenuItem menu1Item3 = MenuItem("Item3");

void setup()
{
 pinMode(buttonPinLeft, INPUT);
 pinMode(buttonPinRight, INPUT);
 pinMode(buttonPinEnter, INPUT);
 pinMode(buttonPinEsc, INPUT);

 lcd.begin(20, 4);
 dht1.begin();

 //configure menu
 menu.getRoot().add(menu1Item1);
 menu1Item1.addRight(menu1Item2).addRight(menu1Item3);
 menu1Item1.add(menuItem1SubItem1).addRight(menuItem1SubItem2);
 menu1Item2.add(menuItem2SubItem1).addRight(menuItem2SubItem2).addRight(menuItem2SubItem3);
 //menu.toRoot();
 lcd.setCursor(0,0);  
 lcd.print("Termoregolazione");

}  // setup()...

void loop()
{

 readButtons();  //I splitted button reading and navigation in two procedures because
 navigateMenus();  //in some situations I want to use the button for other purpose (eg. to change some settings)

} //loop()...

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
 
 float tINGRESSO = dht1.readTemperature();
 float hINGRESSO = dht1.readHumidity();

 float t2SALA = dht2.readTemperature();
 float h2SALA = dht2.readHumidity();
 
 if(newMenuItem.getName()==menu.getRoot()){
   lcd.clear();  
   lcd.print("Termoregolazione       ");
 }
 else if(newMenuItem.getName()=="Item1"){
   lcd.clear();  
   lcd.print("Zone           ");
 }

 else if(newMenuItem.getName()=="Item1SubItem1"){
   lcd.clear();  
   lcd.print("Seconda Sala");
   lcd.setCursor(0,1);
   lcd.print("Temp. = ");
   lcd.print(t2SALA);
   lcd.print(char(223));
   lcd.print("C");
   lcd.setCursor(0,2);
   lcd.print("Umidità = ");
   lcd.print(h2SALA);
   lcd.print("%");


 }
 else if(newMenuItem.getName()=="Item1SubItem2"){
   lcd.clear();  
   lcd.print("Ingresso   ");
   lcd.setCursor(0,1);
   lcd.print("Temp. = ");
   lcd.print(tINGRESSO);
   lcd.print(char(223));
   lcd.print("C");
   lcd.setCursor(0,2);
   lcd.print("Umidità = ");
   lcd.print(hINGRESSO);
   lcd.print("%");
 }
 else if(newMenuItem.getName()=="Item2"){
   lcd.clear();  
   lcd.print("Sonde           ");
 }
 else if(newMenuItem.getName()=="Item2SubItem1"){
   lcd.clear();  
   lcd.print("Mandata 1   ");
 }
 else if(newMenuItem.getName()=="Item2SubItem2"){
   lcd.clear();  
   lcd.print("Mandata 2   ");
 }
 else if(newMenuItem.getName()=="Item2SubItem3"){
   lcd.clear();  
   lcd.print("Mandata Rec   ");
 }
 else if(newMenuItem.getName()=="Item3"){
   lcd.clear();  
   lcd.print("Valvole           ");
 }
}

void menuUsed(MenuUseEvent used){
 lcd.clear();
 lcd.setCursor(0,0);  
 lcd.print("You used        ");
 lcd.setCursor(0,1);
 lcd.print(used.item.getName());
 delay(3000);  //delay to allow message reading
 //lcd.setCursor(0,0);  
 //lcd.print("www.coagula.org");
 menu.getRoot();  //back to Main
}

void  readButtons(){  //read buttons status
 int reading;
 int buttonEnterState=LOW;             // the current reading from the Enter input pin
 int buttonEscState=LOW;             // the current reading from the input pin
 int buttonLeftState=LOW;             // the current reading from the input pin
 int buttonRightState=LOW;             // the current reading from the input pin

 //Enter button
 reading = digitalRead(buttonPinEnter);

 if (reading != lastButtonEnterState) {
   // reset the debouncing timer
   lastEnterDebounceTime = millis();
 }

 if ((millis() - lastEnterDebounceTime) > debounceDelay) {
   // whatever the reading is at, it's been there for longer
   // than the debounce delay, so take it as the actual current state:
   buttonEnterState=reading;
   lastEnterDebounceTime=millis();
 }

   lastButtonEnterState = reading;


 //Esc button              

 reading = digitalRead(buttonPinEsc);

 
 // If the switch changed, due to noise or pressing:
 if (reading != lastButtonEscState) {
   // reset the debouncing timer
   lastEscDebounceTime = millis();
 }

 if ((millis() - lastEscDebounceTime) > debounceDelay) {
   // whatever the reading is at, it's been there for longer
   // than the debounce delay, so take it as the actual current state:
   buttonEscState = reading;
   lastEscDebounceTime=millis();
 }

 // save the reading.  Next time through the loop,
 // it'll be the lastButtonState:
 lastButtonEscState = reading;


 //Down button              
   reading = digitalRead(buttonPinRight);

 
 // If the switch changed, due to noise or pressing:
 if (reading != lastButtonRightState) {
   // reset the debouncing timer
   lastRightDebounceTime = millis();
 }

 if ((millis() - lastRightDebounceTime) > debounceDelay) {
   // whatever the reading is at, it's been there for longer
   // than the debounce delay, so take it as the actual current state:
   buttonRightState = reading;
   lastRightDebounceTime =millis();
 }

   lastButtonRightState = reading;                  


 //Up button              
 reading = digitalRead(buttonPinLeft);

 
 // If the switch changed, due to noise or pressing:
 if (reading != lastButtonLeftState) {
   // reset the debouncing timer
   lastLeftDebounceTime = millis();
 }

 if ((millis() - lastLeftDebounceTime) > debounceDelay) {
   // whatever the reading is at, it's been there for longer
   // than the debounce delay, so take it as the actual current state:
   buttonLeftState = reading;
   lastLeftDebounceTime=millis();
   ;
 }

   lastButtonLeftState = reading;  

 //records which button has been pressed
 if (buttonEnterState==HIGH){
   lastButtonPushed=buttonPinEnter;

 }
 else if(buttonEscState==HIGH){
   lastButtonPushed=buttonPinEsc;

 }
 else if(buttonRightState==HIGH){
   lastButtonPushed=buttonPinRight;

 }
 else if(buttonLeftState==HIGH){
   lastButtonPushed=buttonPinLeft;

 }
 else{
   lastButtonPushed=0;
 }                  
}

void navigateMenus() {

 MenuItem currentMenu=menu.getCurrent();

 switch (lastButtonPushed){
 case buttonPinEnter:
   if(!(currentMenu.moveDown())){  //if the current menu has a child and has been pressed enter then menu navigate to item below
     menu.use();
   }
   else{  //otherwise, if menu has no child and has been pressed enter the current menu is used
     menu.moveDown();
   }
   break;
 case buttonPinEsc:
   //menu.moveUp();
   menu.toRoot();  //back to main
   break;
 case buttonPinRight:
   menu.moveRight();
   break;      
 case buttonPinLeft:
   menu.moveLeft();
   break;      
 }

 lastButtonPushed=0; //reset the lastButtonPushed variable
}

Brado

Da una prima occhiata, imposti tINGRESSO, hINGRESSO, t2SALA, h2SALA solo quando viene eseguita la sub MenuChanged.
Tale sub viene chiamate una sola volta, in questa riga:
MenuBackend menu = MenuBackend(menuUsed,menuChanged);
che è inserita nella definizione delle variabili, quindi ti vengono riportati i valori trovati all'accensione di arduino.

zinco_mp

Grazie per la risposta Brado. Quindi per poter avere una lettura costante dei sensori dovrei inserirla nel loop?
Però poi come la chiamo nella funzione dei menu?

simonenascivera

Secondo me potresti fare una cosa tipo:
Code: [Select]

float tINGRESSO = 0;
void setup(){
....
}
void loop(){
        tINGRESSO = dht1.readTemperature();
}
void menu(){......

metti la variabile tINGRESSO come globale cosi ogni volta che il loop riparte aggiorna i valori

nid69ita


Salve. Sono nuovo del forum ...

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento
- qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- qui le pinout delle varie schede by xxxPighi: Pinout
- qui una serie di link generali utili: Link Utili
my name is IGOR, not AIGOR

zinco_mp

Fatto...sia la mia presentazione che  la modifica allo sketch.
Grazie per l'intervento Simonenascivera, solo che accade qualcosa di strano. Mentre prima alla pressione dei pulsanti, immediatamente cambiavano i menù, ora per navigare nei menù devo mantenere premuto i pulsanti per qualche secondo e comunque le letture restano sempre invariate. Qualcuno sa spiegarmi? Grazie

Brado

Dalla sub void menuChanged devi togliere la definizione della variabile, in quanto dichiarata come globale.
Da così:
Code: [Select]

....
  float tINGRESSO = dht1.readTemperature();
  float hINGRESSO = dht1.readHumidity();

  float t2SALA = dht2.readTemperature();
  float h2SALA = dht2.readHumidity();
....


a così:
Code: [Select]

....
  tINGRESSO = dht1.readTemperature();
  hINGRESSO = dht1.readHumidity();

  t2SALA = dht2.readTemperature();
  h2SALA = dht2.readHumidity();
....

zinco_mp

Niente da fare...tutto come prima:
-La lettura dei sensori rimane fissa tranne se cambio menu e poi ritorno sullo stesso
-Cambio menu solo se premo i pulsanti corrispondenti per 2-3 secondi...

Brado


Niente da fare...tutto come prima:
-La lettura dei sensori rimane fissa tranne se cambio menu e poi ritorno sullo stesso
-Cambio menu solo se premo i pulsanti corrispondenti per 2-3 secondi...


Per la prima sì, perchè la "stampa" su lcd la fai una volta sola quando cambi menù.
Dovresti fare una procedura che aggiorna continuamente i valori mostrati, passando come valore il menù da ricaricare continuamente.

Per la seconda, dev'esserci qualche delay che blocca lo sketch, mi viene in mente solo questo per una non risposta immediata.

simonenascivera

Hai tolto vero la misurazione nella funzione menu change?

zinco_mp

Grazie per le risposte.
Cmq sì, ho tolto le misurazioni dalla funzione menu change.
Finora, però, solo quando inserisco le letture SOLO nella funzione menu change, i pulsanti sembrano funzionare correttamente...tralasciando il fatto che le letture cambiano solo al cambiare dei menu.
Non so proprio come fare...

Go Up