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