Progetto Maturità 2009 menu gestione LCD

Salve a tutti quanti, ho deciso di sviluppare per la tesina di maturità un termostato a 3 zone indipendenti, con visualizzazione delle temperature istantanee su un lcd 2x16, mentre ogni ora in 24 ore esegue la media dei tre sensori di temperatura, e la invia in seriale al pc che immagazzina i dati in un data logger sotto forma di testo.
I problemi sono iniziati quando ho messo mano ai sotto menu da sviluppare, vi posto il mio programma, ovviamente non è finito è solo una prova per vedere se il pulsante funziona…
e il pulsante non funziona, o meglio, funziona se dichiaro all’inizio del loop menumode = 0, in questo caso riesco a visualizzare i 2 stati con diversi print sull’lcd ma poi ovviamente al secondo giro di loop, si resetta il menumode a 0 e quindi il menu ritorna sulla prima schermata…
Grazie mille a chiunque mi aiuterà!

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 2, 7, 8, 9, 10);
//LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)

int potPin = 4;
int potPin2 = 5;
float temperature;
float temperature2;
int val;
int val2;
int puls = 3;
int state;
int state2;
int buttonState;
int menumode = 0;

void setup() {
pinMode(potPin,INPUT);
pinMode(potPin2,INPUT);
pinMode(puls,INPUT);
Serial.begin(9600);
buttonState = digitalRead(puls);
}

void loop() {

val = analogRead(potPin);
temperature = ((5.0 * val * 100.0)/1023.0);

val2 = analogRead(potPin2);
temperature2 = ((5.0 * val2 * 100.0)/1023.0);
delay(1000);
state = digitalRead(puls);
delay(10);
state2 = digitalRead(puls);
if (state != state2) {
if (state != buttonState) {
if (state == HIGH) {
if (state2 == LOW) {
if (menumode == 0){
menumode = 0;
} else {
if (menumode == 1){
menumode = 1;
buttonState = val;
}
}
}
}
}
}

if (menumode == 0) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Temp1: “);
lcd.print(temperature);
lcd.print(” C”);
}
if (menumode == 1) {
lcd.clear();
lcd.setCursor(0,1);
lcd.print(“Temp2: “);
lcd.print(temperature2);
lcd.print(” C”);
}
delay(50);
}

void setup() {
pinMode(potPin,INPUT);
pinMode(potPin2,INPUT);
pinMode(puls,INPUT);
Serial.begin(9600);
buttonState = digitalRead(puls);
}

perche mettere "buttonState = digitalRead(puls);" nel setup? ti ricordo che viene eseguito una sola volta il void setup

e poi la variabile menumode non verra mai portata a 1 se prima nn viene messa a 1 ciò e un paradosso secondo il tuo codice

Perchè poi lo richiama nel loop, e appena acceso per lo meno registra il suo stato iniziale, cioè zero... Dimmi se sbaglio ;)

allora fammi capire tu hai 2 menu giusto? e vuoi passare da uno all'alltro tramite un pulsante giusto?

Per il momento si, poi avrò 3 pulsanti e un trimmer, 2 di navigazione (su,giu) tra le schermate dei 3 sensori, uno di selezione per impostare il range minimo massimo della temperatura desiderata tramite il trimmer. Grazie Luca

ti conviene gestire i tasti tramite interrupt perché cosi di sicuro non funziona il codice per quelle 2 cose che ti ho detto se vuoi posso darti una mano in skype

ok ti mando il mio contatto skype con pm ;) grazie

Salve ragazzi :wink:
grazie a camba192 siamo riusciti a sviluppare tutti i menu e sottomenu del programma! lo ringrazio infinitamente! :wink:
Purtroppo è sorto un problema, come ogni termostato, deve attivare/spegnere o una stufa o un condizionatore, per simularne il funzionamento ho pensato a 6 led, 2 per ogni zona, che indicano l’attivazione o meno dei sistemi di riscaldamento/raffreddamento, a disposizione avevo solo 3 porte però, quindi mi son visto costretto ad utilizzare un mux (HCF4051BE) in questo modo ho ottenuto fino a 8 uscite con 3 ingressi di selezione.
Ho riportato il funzionamento per i led nel programma, ma a quanto pare questo spezzone di software non va giù al restante.
Sta di fatto che il programma non funziona come dovrebbe… qualcuno mi può aiutare?
grazie mille per l’attenzione
Luca

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 2, 7, 8, 9, 10);
//LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)

int potPin = 4;
int potPin2 = 5;
int potPin3 = 3;
float temperature=0;
float temperature2=0;
float temperature3=0;
float t1min,t2min,t3min,t1max,t2max,t3max;
int val;
int val2;
int val3;
float valtrim;
int puls = 3;
int puls2 = 5;
int trimmer =2;
int state=0;
int state2=0;
int state3=0;
int state4=0;
int menumode = 0;
int i,cost;
int A = 13;
int B = 6;
int C = 4;

void setup() {
pinMode(potPin,INPUT);
pinMode(potPin2,INPUT);
pinMode(potPin3,INPUT);
pinMode(puls,INPUT);
pinMode(puls2,INPUT);
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
Serial.begin(9600);
}

void loop() {

val = analogRead(potPin);
temperature = ((5.0 * val * 100.0)/1023.0);

val2 = analogRead(potPin2);
temperature2 = ((5.0 * val2 * 100.0)/1023.0);

val3 = analogRead(potPin3);
temperature3 = ((5.0 * val3 * 100.0)/1023.0);

menu();
delay(1500);

state = digitalRead(puls);
delay(100);
if (state == HIGH) {
if (menumode == 0){
menumode = 1;
} else {
if (menumode == 1){
menumode = 2;
}else{
if (menumode == 2){
menumode = 0;
} } } }

if (state == LOW) {
if (menumode == 0){
menumode = 0;
} else {
if (menumode == 1){
menumode = 1;
}else{
if (menumode == 2){
menumode = 2;
} } } }

menu();

state2 = digitalRead(puls2);
delay(100);
if (state2 == HIGH) {
if (menumode == 0){
menumode = 3;
while(state3==0 || state4==0){
menu();
if(analogRead(trimmer)<512){
cost=0;
menu();
if(digitalRead(puls)==HIGH && digitalRead(puls2)==0){
while(digitalRead(puls2)==0){
t1min=analogRead(trimmer)/10;
menu();
delay(100);
}
menu();
}}
if(analogRead(trimmer)>=512){
cost=1;
menu();
if(digitalRead(puls)==HIGH){
while(digitalRead(puls2)==0){
t1max=analogRead(trimmer)/10;
menu();
delay(100);
}
menu();
}}
state3 = digitalRead(puls);
state4 = digitalRead(puls2);
delay(1500);
} menumode=0;state3=0;state4=0;
}

else {
if (menumode == 1){
menumode = 4;
while(state3==0 || state4==0){
menu();
if(analogRead(trimmer)<512){
cost=0;
menu();
if(digitalRead(puls)==HIGH && digitalRead(puls2)==0){
while(digitalRead(puls2)==0){
t2min=analogRead(trimmer)/10;
menu();
delay(100);
}
menu();
}}
if(analogRead(trimmer)>=512){
cost=1;
menu();
if(digitalRead(puls)==HIGH){
while(digitalRead(puls2)==0){
t2max=analogRead(trimmer)/10;
menu();
delay(100);
}
menu();
}}
state3 = digitalRead(puls);
state4 = digitalRead(puls2);
delay(1500);
} menumode=0;state3=0;state4=0;
}

else{
if (menumode == 2){
menumode = 5;
while(state3==0 || state4==0){
menu();
if(analogRead(trimmer)<512){
cost=0;
menu();
if(digitalRead(puls)==HIGH && digitalRead(puls2)==0){
while(digitalRead(puls2)==0){
t3min=analogRead(trimmer)/10;
menu();
delay(100);
}
menu();
}}
if(analogRead(trimmer)>=512){
cost=1;
menu();
if(digitalRead(puls)==HIGH){
while(digitalRead(puls2)==0){
t3max=analogRead(trimmer)/10;
menu();
delay(100);
}
menu();
}}
state3 = digitalRead(puls);
state4 = digitalRead(puls2);
delay(1500);
} menumode=0;state3=0;state4=0;
}
} } }

delay(50);
}
int led(){
if (temperature <= t1min) {
digitalWrite(A, HIGH);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
}
if (temperature >= t1max) {
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
}
if (temperature2 <= t2min) {
digitalWrite(A, HIGH);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
}
if (temperature2 >= t2max) {
digitalWrite(A, LOW);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
}
if (temperature3 <= t3min) {
digitalWrite(A, LOW);
digitalWrite(B, HIGH);
digitalWrite(C, HIGH);
}
if (temperature3 >= t3max) {
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
}
}
int menu(){

if (menumode == 0) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Temperatura 1");
lcd.setCursor(0,1);
lcd.print(temperature);
lcd.print(" C");
}
if (menumode == 1) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Temperatura 2");
lcd.setCursor(0,1);
lcd.print(temperature2);
lcd.print(" C");
}
if (menumode == 2) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Temperatura 3");
lcd.setCursor(0,1);
lcd.print(temperature3);
lcd.print(" C");
}
if (menumode == 3) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Temp MIN:”);
lcd.print(t1min);
lcd.print(“C”);
if(cost==0){
lcd.print("<-");
}
lcd.setCursor(0,1);
lcd.print(“Temp MAX:”);
lcd.print(t1max);
lcd.print(“C”);
if(cost==1){
lcd.print("<-");
}
}
if (menumode == 4) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Temp MIN:”);
lcd.print(t2min);
lcd.print(“C”);
if(cost==0){
lcd.print("<-");
}
lcd.setCursor(0,1);
lcd.print(“Temp MAX:”);
lcd.print(t2max);
lcd.print(“C”);
if(cost==1){
lcd.print("<-");
}
}
if (menumode == 5) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Temp MIN:”);
lcd.print(t3min);
lcd.print(“C”);
if(cost==0){
lcd.print("<-");
}
lcd.setCursor(0,1);
lcd.print(“Temp MAX:”);
lcd.print(t3max);
lcd.print(“C”);
if(cost==1){
lcd.print("<-");
}
}}

Il circuito su breadboard