Accesso a menu personalizzato

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---------------------------------------
}
 //------------------------------------------------------------------------ 
}