Accesso a menu personalizzato

Buongiorno a tutti. Non essendo un guru della programmazione, ed essendomi avvicinato di recente alla piattaforma arduino, stò cercando di realizzare con qualche sforzo, un piccolo software per il controllo di alcuni termoriscaldatori da utilizzarsi per fermentazione della birra artiggianale. (Mi sono dato all'alcool :D) Ho cominciato ad approndare il software, ma mi sono reso conto (dopo un breve test sul campo) che alcune delle funzioni da me ipotizzate in fase di programmazione non vengono correttamente eseguite, e purtroppo dato la mia scarsa capacità di programmazione non riesco a capire dove si nascondono gli errori. Potreste cortesemente darmi una mano a capire dove sbaglio? In particolar modo avevo ipotizzato di poter effettuare i setpoint delle temperature entrando in un sottomenù e con dei tasti ingrementare e decrementare i valori. Tale funzione non l'ho ancora scritta, perchè non riesco a far funzionare la parte di accesso al menù. Avevo ipotizzato di portare ad "uno" la variabile "ONstup" a seguito della pressione di un pulsante, per bloccare la visualizzazione ciclica dei valori di temperatura sull'LCD e di far apparire i valori da impostare. Però alla pressione del tasto, il codice in esso viene eseguito, (ho provato a sostituirlo con un testo da visualizzare sull'LCD e viene regolarmente visualizzato) ma la variabile ONsetup resta sempre a "zero". Non riesco a capirne il motivo. Il codice l'ho inserto nel post successivo in quanto superavo il limite massimo di caratteri inseribili in un singolo post. Grazie per l'aiuto.

Qui di seguito il listato del programma.

 #include <OneWire.h>
 #include <DallasTemperature.h>
 #define ONE_WIRE_BUS 2
 #include <LiquidCrystal.h>
 LiquidCrystal lcd(8, 9, 4, 5, 6, 7); 
 OneWire oneWire(ONE_WIRE_BUS);
// -------------------Variabili per la gestione mutitasking---------------------------- 
 unsigned long int time;
 unsigned long int time_temperature;
 unsigned long int time_lcd_fer;
 unsigned long int time_lcd_forno;
 unsigned long int time_lcd_varie;
 unsigned long int time_reset_count;
// -------------------Variabili bool per l'attivazione della procedura di setup---------------------------- 
 int ONsetup =0; 
// -------------------Variabili per la gestione dei Valori di setup della temperatura-------------------------
 int Setup_Fer = 22;
 int Setup_Forno = 22;
 int lcd_key     = 0;
 int cont=0;
// -------------------Associazione dei relè alle uscite---------------------
 int Rele1 = A2;
 int Rele2 = A3;
 int Rele3 = A4;
 int Rele4 = A5;
// -------------------Variabili per la lettura dei sensori di temperatura------------------
 float temp_fer;
 float temp_forno;
 float temp_Telo1;
 float temp_Telo2;
 float temp_Amb;
 DallasTemperature sensors(&oneWire);//inizzializzo la libreria dallas
 // -------------------Seriali dei sensori dallas---------------------
 DeviceAddress Fermentatore = { 0x28, 0x2F, 0x3C, 0x7E, 0x02, 0x00, 0x00, 0xDB };
 DeviceAddress Forno =        { 0x28, 0xAC, 0x96, 0x38, 0x02, 0x00, 0x00, 0x0F };
 DeviceAddress Ambiente =     { 0x28, 0xB8, 0x4D, 0x7E, 0x02, 0x00, 0x00, 0x4F };
 DeviceAddress Telo1 =        { 0x28, 0x1C, 0x71, 0x38, 0x02, 0x00, 0x00, 0x83 };
 DeviceAddress Telo2 =        { 0x28, 0xE9, 0x9F, 0x38, 0x02, 0x00, 0x00, 0x62 };
void setup(void)
 {
 lcd.begin(20,4);//Inizzializzo la libreria del'LCD
 sensors.begin();
  // -------------Sincronizzazione delle variabili per il multitasking--------------------
 time_temperature=millis();
 time_lcd_fer=millis();
 time_lcd_forno=millis();
 time_lcd_varie=millis();
 time_reset_count=millis();
 // -------------------Definisco i pin di Input ed Output---------------------
 pinMode (A1, INPUT); // PIN Analogico configurato come OUT digitale
 pinMode (Rele1, OUTPUT); // PIN Analogico configurato come OUT digitale
 pinMode (Rele2, OUTPUT); // PIN Analogico configurato come OUT digitale
 pinMode (Rele3, OUTPUT); // PIN Analogico configurato come OUT digitale
 pinMode (Rele4, OUTPUT); // PIN Analogico configurato come OUT digitale 
 // -------------------Associo ad ogni sensore un nome univoco---------------------
 sensors.setResolution(Fermentatore, 10);
 sensors.setResolution(Forno, 10);
 sensors.setResolution(Ambiente, 10);
 sensors.setResolution(Telo1, 10);
 sensors.setResolution(Telo2, 10);
// -------------------Messaggio di benvenuto--------------------- 
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("Birrificazione"); 
 lcd.setCursor(0, 1);
 lcd.print("By Peppino"); 
 lcd.setCursor(0, 2);
 lcd.print("Inizzializzazione"); 
 lcd.setCursor(0, 3);
 lcd.print("Attendere prego"); 
 delay(2000);
 }
//------Gestione stampa simbolo °C------------------------------------------------------------------
 void st_char(){
 lcd.print(" ");
 lcd.print( (char) 223 );   // Stampa '°'
 lcd.print("C");
 }
//------Gestione ed associazione della lettura delle temperatura e dei relè--------------------------------- 
 void temperature()
 {
 sensors.requestTemperatures();
 temp_fer = sensors.getTempC(Fermentatore);   
 temp_forno = sensors.getTempC(Forno);
 temp_Telo1 = sensors.getTempC(Telo1);
 temp_Telo2 = sensors.getTempC(Telo2);
 temp_Amb = sensors.getTempC(Ambiente);
 //------Gestione relè fermentatore----------------------------------- 
 delay (30);
 if (temp_fer > Setup_Fer || temp_fer == -127.00){
 digitalWrite(Rele4,LOW);
 } else {
 digitalWrite(Rele4,HIGH);
 }
 //------Gestione relè forno----------------------------------------- 
 delay (30);
 if (temp_forno > Setup_Forno  || temp_fer == -127.00)  {
 digitalWrite(Rele3,LOW);
 } else {
 digitalWrite(Rele3,HIGH);
 }
 }
void loop(void)
 {
 //-------Eseguo la procedura di lettura delle temperature e gestione relè ogni secondo----------------------------------------------  
 time=millis();
 if(time>time_temperature+1000){
 temperature();
 time_temperature=millis();
 }
 lcd_key=analogRead(0);
//--Eseguo l'aggiornamento dei valori LCD ogni 2 secondi ma solo se sono fuori della procedura di setup----
 if (ONsetup==0){//Verifica se sono fuori della procedura di setup
 if (time>time_lcd_fer+2000 && cont==0){ //eseguo l'aggiornamento dei valori del fermentatore sull'LCD ogni 2 secondi
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("Temp. Fermentatore: ");
 if (temp_fer == -127.00) {
 lcd.setCursor(0, 1);
 lcd.print("Non rilevata");
 lcd.setCursor(0, 2);
 lcd.print("verificare sensore");
 lcd.setCursor(0, 3);
 lcd.print("e connes. elettriche");
 } else {
 lcd.setCursor(0, 1);
 lcd.print("Rilevata:  ");
 lcd.print(temp_fer);
 st_char();
 lcd.setCursor(0, 2);
 lcd.print("Preset:    ");
 lcd.print(Setup_Fer);
 st_char();
 lcd.setCursor(0, 3);
 if (temp_fer > Setup_Fer) {
 lcd.print("Stato Rele OFF");
 } else {
 lcd.print("Stato Rele ON ");
 }
 }
 delay(2000);
 time_lcd_fer=millis();
 cont=1;
 }
//-------Forno--------------------------------------------------------------  
 if(time>time_lcd_forno+4000 && cont==1){ //eseguo l'aggiornamento dei valori del forno sull'LCD ogni 2 secondi
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("Temp. Forno: ");
 lcd.setCursor(0, 1);
 if (temp_forno == -127.00) {
 lcd.setCursor(0, 1);
 lcd.print("Non rilevata");
 lcd.setCursor(0, 2);
 lcd.print("verificare sensore");
 lcd.setCursor(0, 3);
 lcd.print("e connes. elettriche");
 } else {
 lcd.setCursor(0, 1);
 lcd.print("Rilevata:  ");
 lcd.print(temp_forno);
 st_char();
 lcd.setCursor(0, 2);
 lcd.print("Preset:    ");
 lcd.print(Setup_Forno);
 lcd.print(" ");
 lcd.print( (char) 223 );   // Stampa '°'
 lcd.print("C");
 lcd.setCursor(0, 3);
 if (temp_forno > Setup_Forno) {
 lcd.print("Stato Rele OFF");
 } else {
 lcd.print("Stato Rele ON ");
 }
 }
 time_lcd_forno=millis();
 cont=2;
 }
 //-------Telo1 & Telo2 ed ambiente--------------------------------------------------------------  
 if(time>time_lcd_varie+6000 && cont==2){ //eseguo l'aggiornamento dei valori dei teli sull'LCD ogni 2 secondi
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("Teli riscaldanti : ");
 lcd.setCursor(0, 1);
 if (temp_Telo1 == -127.00) {
 lcd.print("Telo 1 non rilevata.");
 } else {
 lcd.print("Telo 1:   ");
 lcd.print(temp_Telo1);
 st_char();
 }
 lcd.setCursor(0, 2);
 if (temp_Telo2 == -127.00) {
 lcd.print("Telo 2 non rilevata.");
 } else {
 lcd.print("Telo 2:   ");
 lcd.print(temp_Telo2);
 st_char();
 }
 //-------Ambiente--------------------------------------------------------------  
 lcd.setCursor(0, 3);
 lcd.print("Ambiente");
 lcd.setCursor(10, 3);
 if (temp_Amb == -127.00) {
 lcd.print("non rilev.");
 } else {
 lcd.print(temp_Amb);
 st_char();
 }
 time_lcd_varie=millis();
 }
 if (time>time_reset_count+8000){
 cont=0;
 time_reset_count=millis();
 }
 }
 //---------------Tasto select--------------------------------------- 
  if (lcd_key<50){
     ONsetup==1;  
     lcd.clear();
 }  
//---------------Programmazione valori---------------------------------------
  if (ONsetup==1){
     lcd.setCursor(0, 0);
     lcd.print("Prog. parametri");
     lcd.setCursor(0, 1);
     lcd.print("Fermentatore: ");
     lcd.print(Setup_Fer);
     st_char(); 
     lcd.setCursor(0, 2);
     lcd.print("Forno:        ");
     lcd.print(Setup_Forno);
     st_char();
//---------------Tasto + Fermentatore---------------------------------------
}
 //------------------------------------------------------------------------ 
}

Ho provato a leggere il tuo codice ma non ci capisco nulla. Mi spiace, ma senza indentazione, non sono comprensibili le divisioni fra i vari blocchi di codice.

Grazie per aver guardato il mio codice.
Cercherò di spiegare neglio il problema.
Alla fine del codice, ho inserito un controllo “if” per verificare la pressione del tasto, (collegato all’ingresso analogico 0 che ho chiamato “lcd_key” e che controllo con l’istruzione if (lcd_key<50)) ed il quale dovrebbe portare ad uno la variabile ONsetup.
Il codice all’interno dell’if viene eseguito regolarmente alla pressione del tasto perchè lcd viene cancellato, ma la variabile ONsetup resta a zero, in quanto il codice inserito nell’ If ONsetup==1 non viene eseguito.

//---------------Tasto select--------------------------------------- 
  if (lcd_key<50){
     ONsetup==1;  
     lcd.clear();
 }  
//---------------Programmazione valori---------------------------------------
  if (ONsetup==1){
     lcd.setCursor(0, 0);
     lcd.print("Prog. parametri");
     lcd.setCursor(0, 1);
     lcd.print("Fermentatore: ");
     lcd.print(Setup_Fer);
     st_char(); 
     lcd.setCursor(0, 2);
     lcd.print("Forno:        ");
     lcd.print(Setup_Forno);
     st_char();

Non riesco a capirne il motivo in quanto da nessuna altra parte porto a zero tale variabile, pertanto dovrebbe restare sempre ad uno.
Ho provato anche ad inserire una pausa di 5 secondi per essere sicuro che il codice venisse eseguito e non essere ingannato dalla velocità di esecuzione dem microprocessore.

//---------------Tasto select--------------------------------------- 
  if (lcd_key<50){
     ONsetup==1;  
     lcd.clear();
 }  
//---------------Programmazione valori---------------------------------------
  if (ONsetup==1){
     lcd.setCursor(0, 0);
     lcd.print("Prog. parametri");
     lcd.setCursor(0, 1);
     lcd.print("Fermentatore: ");
     lcd.print(Setup_Fer);
     st_char(); 
     lcd.setCursor(0, 2);
     lcd.print("Forno:        ");
     lcd.print(Setup_Forno);
     st_char();
    delay(5000);
if (lcd_key<50){
     ONsetup==1;  
     lcd.clear();
 }

Questa non è un’assegnazione ma un confronto di uguaglianza.
L’assegnazione si fa con un solo simbolo “=”, mentre il confronto si fa con 2 simboli, quindi “==”.

Grazie mille per l'aiuto.