#include <LiquidCrystal_I2C.h> //libreria LCD con convertitore I2C
#include <OneWire.h> //libreria per sensori OneWire
#include <DallasTemperature.h> //libreria dedicata ai sensori Dallas (DS18B20)
#include <DHT.h> //libreria del sensore dht22
#include <Wire.h> //libreria propedeutica al max6675 per termocoppia
#include <max6675.h> //libreria del modulo max6675 per termocoppie k
LiquidCrystal_I2C lcd(0x27, 20, 4); //address, colonne e righe del LCD
// Variabili per la gestione della retroilluminazione
unsigned long backlightOffMillis = 0;
const unsigned long backlightDuration = 5000; // Durata retroilluminazione in millisecondi
#define BKLIGHT_BUTTON 7 //definisce la variabile con il pid digitale del pulsante per la backlight del lcd
#define ONE_WIRE_BUS 2 //definisce la variabile con il pin digitale di lettura temperatura
OneWire oneWire(ONE_WIRE_BUS); //indica il pin di collegamento per la comunicazione col sensore onewire
DallasTemperature sensors(&oneWire); //referenza onewire alla libreria Dallas Temperature
#define dhtpin 3 //definisce il pin del sensore dht
#define dhttype DHT22 //definisce il tipo di sensore dht
DHT dht (dhtpin, dhttype); //inizializza l'oggetto dht
//indirizzi dei sensori di temperatura DS18B20
DeviceAddress Puff_H_address = {"9F9D876799C4F701"};
DeviceAddress Puff_M_address = {"9F9D876799C4F702"};
DeviceAddress Puff_L_address = {"9F9D876799C4F703"};
DeviceAddress Boil_H_address = {"9F9D876799C4F704"};
DeviceAddress Boil_L_address = {"9F9D876799C4F705"};
//definizione variabili e funzione lettura termocoppia
int termoCLK = 6;
int termoSO = 4;
int termoCS = 5;
MAX6675 thermocouple(termoCLK, termoSO, termoCS);
//variabili del progetto
#define SELECT_BUTTON 13 //definisce il pin del bottone di selezione schermata
int select_counter = 1; //stato iniziale del selettore (pagina 0)
float temp_fumes; //variabile temperatura fumi
float room_hum; //variabile umidità stanza
float room_temp; //variabile temperatura stanza
void setup() {
// put your setup code here, to run once:
lcd.init(); //definisce i pin di collegamento I2C lcd (standard SDA-A4 e SCL-A5)
Serial.begin(9600); //inizializza la comunicazione seriale
sensors.begin(); //avvia la lettura dei sensori onewire
dht.begin(); //avvia la lettura del sensore dht
delay(2000); //da il tempo per stabilizzare le connessioni
}
void loop() {
// put your main code here, to run repeatedly:
sensors.requestTemperatures(); //lettura della temperatura
//salva nelle variabili la temperatura in °C
int temp_Puff_H = sensors.getTempC(Puff_H_address);
int temp_Puff_M = sensors.getTempC(Puff_M_address);
int temp_Puff_L = sensors.getTempC(Puff_L_address);
int temp_Boil_H = sensors.getTempC(Boil_H_address);
int temp_Boil_L = sensors.getTempC(Boil_L_address);
//lettura derl sensore dht
room_hum = dht.readHumidity();
room_temp = dht.readTemperature();
//lettura termocoppia k
temp_fumes = thermocouple.readCelsius();
Serial.print("C = ");
Serial.println(thermocouple.readCelsius());
Serial.print(digitalRead(SELECT_BUTTON));
Serial.println(temp_fumes);
if (digitalRead(SELECT_BUTTON) == HIGH) {
select_counter = select_counter + 1;} //verifica della pressione del bottone
Serial.print(select_counter);
if (select_counter==1) {
//pagina 1
lcd.setCursor(0, 0);
lcd.print("Puffer Temp. ^C");
lcd.setCursor(0, 1);
lcd.print(String(temp_Puff_H)+"|"+String(temp_Puff_M)+"|"+String(temp_Puff_L) );
}
if (select_counter==2) {
//pagina 2
lcd.setCursor(0, 0);
lcd.print("Boiler Temp. ^C");
lcd.setCursor(0, 1);
lcd.print(String(temp_Boil_H)+"|"+String(temp_Boil_L)+" ");
lcd.setCursor(0, 2);
lcd.print(String(temp_fumes));
}
if (select_counter==3) {
//pagina 3
lcd.setCursor(0, 0);
lcd.print("Room T^C " + String(room_temp)+" ");
lcd.setCursor(0, 1);
lcd.print("Room H% " + String(room_hum)+" ");
}
if (select_counter>3){
select_counter=1;
}
// Gestione della retroilluminazione - attiva all'uso dei tasti
if (digitalRead(BKLIGHT_BUTTON) == HIGH || digitalRead(SELECT_BUTTON) == HIGH) {
lcd.backlight();
backlightOffMillis = millis() + backlightDuration;
}
if (millis() > backlightOffMillis) {
lcd.noBacklight();
}
delay(300); //necessario alla lettura di MAX6675 ritardo minimo di 250ms
}
//funzione per visualizzare la temperatura
void printTemperature(String label, float value) {
if (value != DEVICE_DISCONNECTED_C) {
Serial.println(label + ": " + String(value) + "°C");
} else {
Serial.println("Impossibile rilevare la temperatura");
}
}