#include <EEPROM.h>
#define NUM_KEYS 5 //A0
//#define ThermistorPIN 1 // Analog Pin 1
#include <LiquidCrystal.h>
#include "DHT.h"
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#define OLED_ADDR 0x3C //verificare che sia corretto per il proprio modello
#define SCREEN_WIDTH 128 // Larghezza del display OLED in pixels
#define SCREEN_HEIGHT 64 // Altezza del display OLED in pixels
// Creiamo istanza del display connesso tramite I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT);
#define DHT9PIN 2 //temperatura aria stufa a pellet TESI
#define DHT1PIN 14
#define DHT2PIN 15
#define DHT3PIN 16
#define DHT4PIN 17
#define DHT5PIN 18
#define DHT6PIN 19
#define DHT7PIN 20
#define DHT8PIN 21
//#define DHTTYPE DHT11
#define DHT9TYPE DHT11
#define DHT1TYPE DHT11
#define DHT2TYPE DHT11
#define DHT3TYPE DHT11
#define DHT4TYPE DHT11
#define DHT5TYPE DHT11
#define DHT6TYPE DHT11
#define DHT7TYPE DHT11
#define DHT8TYPE DHT11
DHT dht9(DHT9PIN, DHT9TYPE); //temperatura rilevata da stufa a pallet accesa verde dht0
DHT dht1(DHT1PIN, DHT1TYPE); //temperatura generale marrone/verde dht1
DHT dht2(DHT2PIN, DHT2TYPE); //cucina bianco dht2
DHT dht3(DHT3PIN, DHT3TYPE); //soggiorno bianco dht3
DHT dht4(DHT4PIN, DHT4TYPE); //corridoio bianco dht4
DHT dht5(DHT5PIN, DHT5TYPE); //bagno grande bianco dht5
DHT dht6(DHT6PIN, DHT6TYPE); //bagno piccolo bianco dht6
DHT dht7(DHT7PIN, DHT7TYPE); //camera DX bianco dht7
DHT dht8(DHT8PIN, DHT8TYPE); //camera SX bianco dht8
int temp9 = dht9.readTemperature(); //temperatura aria mandata TESI
int hum9 = dht9.readHumidity();
int temp1 = dht1.readTemperature(); //temperatura generale
int hum1 = dht1.readHumidity();
int temp2 = dht2.readTemperature(); //cucina
int hum2 = dht2.readHumidity();
int temp3 = dht3.readTemperature(); //soggiorno
int hum3 = dht3.readHumidity();
int temp4 = dht4.readTemperature(); //corridoio
int hum4 = dht4.readHumidity();
int temp5 = dht5.readTemperature(); //bagno grande
int hum5 = dht5.readHumidity();
int temp6 = dht6.readTemperature(); //bagno piccolo
int hum6 = dht6.readHumidity();
int temp7 = dht7.readTemperature(); //camera DX
int hum7 = dht7.readHumidity();
int temp8 = dht8.readTemperature(); //camera SX
int hum8 = dht8.readHumidity();
//// tipo di arduino MEGA 2560 o MEGA ADK
/// tipo di programmatore USBasp
/// arduino 1.0.5-r2
/// arduino 1.0.6
///
int rele1 = 23; // 8 relay module K1 libero
int rele2 = 25; // 8 relay module K2 libero
int rele3 = 27; // 8 relay module K3 (cassetta derivazione corridoio) relè ventola turbo
int rele4 = 29; // 8 relay module K4 (cassetta derivazione corridoio) relè ventola corridoio
int rele5 = 31; // 8 relay module K5 (cassetta derivazione corridoio) relè ventola bagno grande
int rele6 = 33; // 8 relay module K6 (cassetta derivazione corridoio) relè ventola bagno piccolo
int rele7 = 35; // 8 relay module K7 (cassetta derivazione corridoio) relè ventola camera DX
int rele8 = 37; // 8 relay module K8 (cassetta derivazione corridoio) relè ventola camera SX
int rele9 = 39; // relay K_9 (cassetta derivazione cucina dietro stfa a pellet) relè deviazione aria soggiorno/corridoio ( relè OFF deviazione verso soggiorno relè ON deviazione verso corridoio )
int rele10 = 41; // relay K_10 (cassetta derivazione cucina dietro stfa a pellet) relè ventola soggiorno
int rele11 = 43; // relay K_11 (cassetta derivazione cucina dietro stfa a pellet) relè controllo accensione TESI AIR
///aggiunto 2023
int ledPin = 13;
int ledState = LOW;
unsigned long timeOfLastLedEvent = 0;
int intervalON = 1800000; // per quanto tempo vogliamo che il LED rimanga acceso (1800000ms = 30minuti)
int intervalOFF = 1800000; // per quanto tempo vogliamo che il LED rimanga spento (1800000ms = 30minuti)
//tempo durata
///aggiunto 2023
/*
Circuito del dispaly LCD:
LCD RS pin to digital pin 8
LCD Enable pin to digital pin 9
LCD D4 pin to digital pin 4
LCD D5 pin to digital pin 5
LCD D6 pin to digital pin 6
LCD D7 pin to digital pin 7
LCD BL pin to digital pin 10
KEY pin to analogl pin 0
Esquema del sensor de temperatura:
[Ground] -- [10k-pad-resistor] -- | -- [10k thermistor] --[Vcc (5v)]
|
Analog Pin 1
*/
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //D4=bianco D5=viola D6=verde D7=rosa D8=giallo D9=grigio
const int numeroDeMenus = 25;
char tituloMenu[numeroDeMenus][16] = {
" ",
"Imp. Temperat.:",
"Imp. Tempo: ",
"Delta T. Aria :",
"Soglia minima: ",
"Soglia massima:",
"T. Cucina ",
"T. Soggiorno ",
"T. Corridoio ",
"T.Bagno Piccolo",
"T. Bagno Grande",
"T. Camera DX ",
"T. Camera SX ",
" MAN=0 AUT=1",
"COR=0 DEV SOG=1",
"OFF=0 SOG ON=1 ",
"OFF=0 COR ON=1 ",
"OFF=0 B.PI ON=1",
"OFF=0 B.GR ON=1",
"OFF=0 C.DX ON=1",
"OFF=0 C.SX ON=1",
"OFF=0 TURB ON=1",
"TEMP. ARIA TESI",
"TEMP.MAND. ARIA",
" LUM. DISPLAY: ",
};
int adc_key_val[5] = {
50, 200, 400, 600, 800
};
int adc_key_in;
int key = -1;
int oldkey = -1;
boolean Illuminazione_Display = true;
boolean cursorActivo = false;
boolean enMenu = false;
unsigned long time;
unsigned long time1;
int x = 0;
int maximo, minimo, diferencia, t1, t2, t3;
byte Temp_impostata = 21;
byte Temp_impostata_mandata_aria = 35; //imposto la minima temperatura alla quale le ventole devono partire quando sentono aria calda dalla TESI
int tempo = 1;
byte kp = 1;
byte soglia_min = 1;
byte soglia_max = 1;
byte Intensita_Display = 10;
int delta_T = 0;
boolean modo_funzionamento;
boolean dev_corridoio_soggiorno;
boolean ventola_soggiorno;
boolean ventola_corridoio;
boolean ventola_bagno_piccolo;
boolean ventola_bagno_grande;
boolean ventola_camera_DX;
boolean ventola_camera_SX;
boolean ventola_turbo;
void setup()
{
pinMode(23, OUTPUT); // K1 relè deviazione verso corridoio
pinMode(25, OUTPUT); // K2 ventola soggiorno
pinMode(27, OUTPUT); // K3 ventola turbo
pinMode(29, OUTPUT); // K4 ventola corridoio
pinMode(31, OUTPUT); // K5 ventola bagno_piccolo
pinMode(33, OUTPUT); // K6 ventola bagno_grande
pinMode(35, OUTPUT); // K7 ventola bagno_grande
pinMode(37, OUTPUT); // K8 ventola camera_SX
pinMode(39, OUTPUT); // K9 ventola camera_DX
pinMode(41, OUTPUT); // K10 rele deviazione soggiorno/corridoio
pinMode(43, OUTPUT); // K11 ventola soggiorno
digitalWrite( rele1, HIGH ); //
digitalWrite( rele2, HIGH ); //
digitalWrite( rele3, HIGH ); // ventola turbo
digitalWrite( rele4, HIGH ); // ventola corridoio
digitalWrite( rele5, HIGH ); // ventola bagno_piccolo
digitalWrite( rele6, HIGH ); // ventola bagno_grande
digitalWrite( rele7, HIGH ); // ventola camera_SX
digitalWrite( rele8, HIGH); // ventola camera_DX
digitalWrite( rele9, HIGH ); // rele deviazione soggiorno/corridoio
digitalWrite( rele10, HIGH ); // ventola soggiorno
digitalWrite( rele11, HIGH ); //
cargarConfig();
pinMode(10, OUTPUT);
analogWrite(10, Intensita_Display * 25);
Serial.begin(9600);
lcd.clear();
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("*TESI AIR 2023*");
lcd.setCursor(0, 1);
lcd.print(" RISCALDAMENTO ");
delay(500);
}
void loop()
{
if (millis() - time > 15000) { // dopo 15 secondi spengo la luce del display
digitalWrite(10, LOW);
Illuminazione_Display = false;
}
if (millis() - time > 20000) { // dopo 20 secondi ripasso alla pagina principale del menu'
if (enMenu) guardarConfig();
enMenu = false;
x = 0;
time = millis();
// }
// if (!enMenu) {
// lcd.clear();
// lcd.setCursor(0, 0);
// lcd.print("Temp.:");
// lcd.setCursor(6, 0);
// lcd.print(dht1.readTemperature());
// lcd.setCursor(10, 0);
// lcd.print((char)223);
// lcd.setCursor(0, 1);
// lcd.print("Umid.:");
// lcd.setCursor(6, 1);
// lcd.print(dht1.readHumidity());
// lcd.setCursor(10, 1);
// lcd.print("%");
}
if (millis() - time > 5000) { // dopo 5 secondi spengo il cursore che lampeggia
lcd.noBlink();
cursorActivo = false;
}
adc_key_in = analogRead(0); // Leggere il valore della pulsazione
key = get_key(adc_key_in); // Prendi il pulsante premuto verso il basso
if (key != oldkey) // se viene rilevato pressione di un tasto
{
delay(50); // Attendere per evitare rimbalzo pulsazioni
adc_key_in = analogRead(0); // Leggere il valore della pulsazione
key = get_key(adc_key_in); // Prendi il pulsante premuto verso il basso
if (key != oldkey)
{
time = millis(); // TODO: manca verificare se il tempo è andato in overflow
if (!Illuminazione_Display) { // pressione di uno qualsiasi chiave girare sullo schermo
analogWrite(10, Intensita_Display * 25);
Illuminazione_Display = true;
}
else { // se il display è acceso continuare ad operare normalmente
oldkey = key;
char accion = 0;
if (key >= 0) { // Se si è premuto un tasto qualsiasi
lcd.blink(); // Visualizza il cursore lampeggiante
cursorActivo = true;
}
if ((key == 0) && (enMenu)) { // è stato premuto il tasto destro
x++;
if (x > numeroDeMenus - 1) x = numeroDeMenus - 1;
}
if ((key == 1) && (enMenu)) { // tasto è stato premuto alto
accion++;
}
if ((key == 2) && (enMenu)) { // tasto è stato premuto basso
accion = accion - 1;
}
if ((key == 3) && (enMenu)) { // è stato premuto il tasto sinistro
x--;
if (x < 0) x = 0;
}
if (key == 4) { // è stato premuto il tasto di selezione
}
enMenu = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(tituloMenu[x]);
lcd.setCursor(0, 1);
switch (x) {
case 0: // Lettura Temperatura ed Umidità Generale
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("* Temp.:");
lcd.setCursor(8, 0);
lcd.print(dht1.readTemperature()+1);
lcd.setCursor(13, 0);
lcd.print((char)223);
lcd.setCursor(15, 0);
lcd.print("*");
lcd.setCursor(0, 1);
lcd.print("* Umid.:");
lcd.setCursor(8, 1);
lcd.print(dht1.readHumidity());
lcd.setCursor(13, 1);
lcd.print("%");
lcd.setCursor(15, 1);
lcd.print("*");
break;
case 1: // imposto la temperatura
Temp_impostata += accion;
lcd.setCursor(6, 1);
lcd.print(Temp_impostata);
lcd.print((char)223);
lcd.print("C");
break;
case 2: // Imposto il tempo
tempo += accion;
lcd.print(tempo);
lcd.print("0 secondi.");
break;
case 3: // Impost il Delta T
delta_T += accion;
lcd.setCursor(6, 1);
lcd.print(delta_T);
lcd.setCursor(8, 1);
lcd.print((char)223);
lcd.setCursor(9, 1);
lcd.print("C");
break;
case 4: // Impost soglia minima
soglia_min += accion;
lcd.print(soglia_min);
break;
case 5: // Impost soglia massima
soglia_max += accion;
lcd.print(soglia_max);
break;
case 6: //visualizzazione temperatura ed umidita' cucina
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.setCursor(2, 1);
lcd.print(dht2.readTemperature());
lcd.setCursor(6, 1);
lcd.print((char)223);
lcd.setCursor(8, 1);
lcd.print("H:");
lcd.setCursor(10, 1);
lcd.print(dht2.readHumidity());
lcd.setCursor(14, 1);
lcd.print("%");
break;
case 7: //visualizzazione temperatura ed umidita' soggiorno
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.setCursor(2, 1);
lcd.print(dht3.readTemperature());
lcd.setCursor(6, 1);
lcd.print((char)223);
lcd.setCursor(8, 1);
lcd.print("H:");
lcd.setCursor(10, 1);
lcd.print(dht3.readHumidity());
lcd.setCursor(14, 1);
lcd.print("%");
break;
case 8: //visualizzazione temperatura ed umidita' corridoio
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.setCursor(2, 1);
lcd.print(dht4.readTemperature());
lcd.setCursor(6, 1);
lcd.print((char)223);
lcd.setCursor(8, 1);
lcd.print("H:");
lcd.setCursor(10, 1);
lcd.print(dht4.readHumidity());
lcd.setCursor(14, 1);
lcd.print("%");
break;
case 9: //visualizzazione temperatura ed umidita' bagno grande
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.setCursor(2, 1);
lcd.print(dht5.readTemperature());
lcd.setCursor(6, 1);
lcd.print((char)223);
lcd.setCursor(8, 1);
lcd.print("H:");
lcd.setCursor(10, 1);
lcd.print(dht5.readHumidity());
lcd.setCursor(14, 1);
lcd.print("%");
break;
case 10: //visualizzazione temperatura ed umidita' bagno piccolo
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.setCursor(2, 1);
lcd.print(dht6.readTemperature());
lcd.setCursor(6, 1);
lcd.print((char)223);
lcd.setCursor(8, 1);
lcd.print("H:");
lcd.setCursor(10, 1);
lcd.print(dht6.readHumidity());
lcd.setCursor(14, 1);
lcd.print("%");
break;
case 11: //visualizzazione temperatura ed umidita' camera DX
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.setCursor(2, 1);
lcd.print(dht7.readTemperature());
lcd.setCursor(6, 1);
lcd.print((char)223);
lcd.setCursor(8, 1);
lcd.print("H:");
lcd.setCursor(10, 1);
lcd.print(dht7.readHumidity());
lcd.setCursor(14, 1);
lcd.print("%");
break;
case 12: //visualizzazione temperatura ed umidita' camera SX
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.setCursor(2, 1);
lcd.print(dht8.readTemperature());
lcd.setCursor(6, 1);
lcd.print((char)223);
lcd.setCursor(8, 1);
lcd.print("H:");
lcd.setCursor(10, 1);
lcd.print(dht8.readHumidity());
lcd.setCursor(14, 1);
lcd.print("%");
break;
case 13: //selezione automatico/manuale aut=1 man=0
modo_funzionamento += accion;
lcd.setCursor(7, 1);
lcd.print(modo_funzionamento);
break;
case 14: //visualizzazione saracinesca corridoio/soggiorno
if (modo_funzionamento > 0)
{
temp3 = dht3.readTemperature();
if (temp3 < Temp_impostata)
{
lcd.setCursor(0, 1);
lcd.print(">>SOGG.");
}
if (temp3 > Temp_impostata)
{
lcd.setCursor(0, 1);
lcd.print(">>CORR.");
}
if (temp3 == Temp_impostata)
{
lcd.setCursor(0, 1);
lcd.print("TEMP.OK ");
}
}
else {
dev_corridoio_soggiorno += accion;
lcd.setCursor(1, 1);
lcd.print("motore");
lcd.setCursor(12, 1);
lcd.print(dev_corridoio_soggiorno);
}
break;
case 15: //ventola_soggiorno
if (modo_funzionamento < 1)
{
ventola_soggiorno += accion;
lcd.setCursor(1, 1);
lcd.print("ventola");
lcd.setCursor(12, 1);
lcd.print(ventola_soggiorno);
}
else
lcd.print("*IN AUTOMATICO*");
break;
case 16: //ventola_corridoio
if (modo_funzionamento < 1)
{
ventola_corridoio += accion;
lcd.setCursor(1, 1);
lcd.print("ventola");
lcd.setCursor(12, 1);
lcd.print(ventola_corridoio);
}
else
lcd.print("*IN AUTOMATICO*");
break;
case 17: //ventola_bagno_piccolo
if (modo_funzionamento < 1)
{
ventola_bagno_piccolo += accion;
lcd.setCursor(1, 1);
lcd.print("ventola");
lcd.setCursor(12, 1);
lcd.print(ventola_bagno_piccolo);
}
else
lcd.print("*IN AUTOMATICO*");
break;
case 18: //ventola_bagno_grande
if (modo_funzionamento < 1)
{
ventola_bagno_grande += accion;
lcd.setCursor(1, 1);
lcd.print("ventola");
lcd.setCursor(12, 1);
lcd.print(ventola_bagno_grande);
}
else
lcd.print("*IN AUTOMATICO*");
break;
case 19: //ventola_camera_DX
if (modo_funzionamento < 1)
{
ventola_camera_DX += accion;
lcd.setCursor(1, 1);
lcd.print("ventola");
lcd.setCursor(12, 1);
lcd.print(ventola_camera_DX);
}
else
lcd.print("*IN AUTOMATICO*");
break;
case 20: //ventola_camera_SX
if (modo_funzionamento < 1)
{
ventola_camera_SX += accion;
lcd.setCursor(1, 1);
lcd.print("ventola");
lcd.setCursor(12, 1);
lcd.print(ventola_camera_SX);
}
else
lcd.print("*IN AUTOMATICO*");
break;
case 21: //ventola_turbo
if (modo_funzionamento < 1)
{
ventola_turbo += accion;
lcd.setCursor(1, 1);
lcd.print("ventola");
lcd.setCursor(12, 1);
lcd.print(ventola_turbo);
}
else
lcd.print("*IN AUTOMATICO*");
break;
case 22: //visualizzazione temperatura aria stufa TESI
lcd.setCursor(0, 1);
lcd.print("T:");
lcd.setCursor(2, 1);
lcd.print(dht9.readTemperature());
lcd.setCursor(6, 1);
lcd.print((char)223);
lcd.setCursor(8, 1);
lcd.print("H:");
lcd.setCursor(10, 1);
lcd.print(dht9.readHumidity());
lcd.setCursor(14, 1);
lcd.print("%");
break;
case 23: // imposto la temperatura mandata aria tesi
Temp_impostata_mandata_aria += accion;
lcd.setCursor(6, 1);
lcd.print(Temp_impostata_mandata_aria);
lcd.print((char)223);
lcd.print("C");
break;
case 24: // Regolazione luminosita display
Intensita_Display += accion;
if (Intensita_Display > 254) Intensita_Display = 0;
if (Intensita_Display > 10) Intensita_Display = 10;
lcd.print(Intensita_Display);
lcd.print("0%");
analogWrite(10, Intensita_Display * 25);
break;
}
}
}
}
///aggiunto 2023
unsigned long currentMillis = millis();
///aggiunto 2023
/// MODO MANUALE
if (modo_funzionamento == 0) //manuale
{
if (dev_corridoio_soggiorno < 1) // 4 relay module K_9 IN1
{
digitalWrite(rele9, HIGH);
}
else {
digitalWrite(rele9, LOW);
}
if (ventola_soggiorno < 1 ) // 4 relay module K_10 IN2
{
digitalWrite(rele10, HIGH);
}
else {
digitalWrite(rele10, LOW);
}
if (ventola_corridoio < 1 ) // 8 relay module K4
{
digitalWrite(rele4, HIGH);
}
else {
digitalWrite(rele4, LOW);
}
if (ventola_bagno_grande < 1 ) // 8 relay module K5
{
digitalWrite(rele5, HIGH);
}
else {
digitalWrite(rele5, LOW);
}
if (ventola_bagno_piccolo < 1 ) // 8 relay module K6
{
digitalWrite(rele6, HIGH);
}
else {
digitalWrite(rele6, LOW);
}
if (ventola_camera_DX < 1 ) // 8 relay module K7
{
digitalWrite(rele7, HIGH);
}
else {
digitalWrite(rele7, LOW);
}
if (ventola_camera_SX < 1 ) // 8 relay module K8
{
digitalWrite(rele8, HIGH);
}
else {
digitalWrite(rele8, LOW);
}
if (ventola_turbo < 1 ) // 8 relay module K3
{
digitalWrite(rele3, HIGH);
}
else {
digitalWrite(rele3, LOW);
}
}
/// MODO AUTOMATICO 1 acceso in parte
if (modo_funzionamento == 1 ) //automatico
// {
if (dht9.readTemperature() > Temp_impostata_mandata_aria) // imposta la temperatura di commutazione: Temperatura impostata aria mandata TESI >= temperatura letta dal sensore aria tesi
{
digitalWrite(rele3, LOW); //relè ventola turbo
digitalWrite(rele4, LOW); //relè ventola corridoio
digitalWrite(rele7, LOW); //relè camera_SX
digitalWrite(rele8, LOW); //relè camera_DX
delay(tempo);
}
if (dht9.readTemperature() < (Temp_impostata_mandata_aria + delta_T))
{
digitalWrite(rele3, HIGH); //relè ventola turbo
digitalWrite(rele4, HIGH); //relè ventola corridoio
digitalWrite(rele7, HIGH); //relè camera_SX
digitalWrite(rele8, HIGH); //relè camera_DX
}
// }
/// MODO AUTOMATICO 2 tutto acceso
if (modo_funzionamento == 2 ) //automatico
// {
if (dht9.readTemperature() > Temp_impostata_mandata_aria) // imposta la temperatura di commutazione: Temperatura impostata aria mandata TESI >= temperatura letta dal sensore aria tesi
{
digitalWrite(rele3, LOW); //relè ventola turbo
digitalWrite(rele4, LOW); //relè ventola corridoio
digitalWrite(rele7, LOW); //relè camera_SX
digitalWrite(rele8, LOW); //relè camera_DX
digitalWrite(rele5, LOW); //relè bagno grande
digitalWrite(rele6, LOW); //relè bagno piccolo
// digitalWrite(rele8, LOW);
///aggiunto 2023
///https://arduinofacile.altervista.org/progetti/base/hello-led-millis/
if (ledState == LOW)
{
if (currentMillis - timeOfLastLedEvent > intervalOFF) // e passato abbastanza tempo
{
digitalWrite(ledPin, HIGH); // accendi il LED
digitalWrite(rele9, LOW); //elè deviazione aria soggiorno/corridoio ( relè OFF deviazione verso soggiorno relè ON deviazione verso corridoio )
ledState = HIGH; // memorizza il suo stato corrente
timeOfLastLedEvent = currentMillis; // aggiorna l'ora di questo nuovo evento
}
}
else // se il LED è già acceso
{
if (currentMillis - timeOfLastLedEvent > intervalON) // e passato abbastanza tempo
{
digitalWrite(ledPin, LOW); // spegni il LED
digitalWrite(rele9, HIGH); //relè deviazione aria soggiorno/corridoio ( relè OFF deviazione verso soggiorno relè ON deviazione verso corridoio )
ledState = LOW; // memorizza il suo stato corrente
timeOfLastLedEvent = currentMillis; // aggiorna l'ora di questo nuovo evento
///aggiunto 2023
delay(tempo);
}
if (dht9.readTemperature() < (Temp_impostata_mandata_aria + delta_T))
{
digitalWrite(rele3, HIGH); //relè ventola turbo
digitalWrite(rele4, HIGH); //relè ventola corridoio
digitalWrite(rele7, HIGH); //relè camera_SX
digitalWrite(rele8, HIGH); //relè camera_DX
digitalWrite(rele5, HIGH); //relè bagno grande
digitalWrite(rele6, HIGH); //relè bagno piccolo
// digitalWrite(rele8, HIGH);
}
}
}
} ///agginto 2023
// Convertire il valore letto in analogico
// In un certo numero di tasto premuto
int get_key(unsigned int input)
{
int k;
for (k = 0; k < NUM_KEYS; k++)
{
if (input < adc_key_val[k])
{
return k;
}
}
if (k >= NUM_KEYS)k = -1; // Errore nella lettura.
return k;
}
boolean cargarConfig() {
if ((EEPROM.read(0) == 27) && (EEPROM.read(1) == 28) &&
(EEPROM.read(2) == 13) && (EEPROM.read(3) == 18)) {
// Abbiamo trovato che la EEPROM ha una
// Convalida configurazione con numeri concreti
// Caricare solo il valore delle impostazioni se la partita valori
if (EEPROM.read(4) == EEPROM.read(5)) Temp_impostata = EEPROM.read(4);
if (EEPROM.read(6) == EEPROM.read(7)) tempo = EEPROM.read(6);
if (EEPROM.read(8) == EEPROM.read(9)) delta_T = EEPROM.read(8);
if (EEPROM.read(10) == EEPROM.read(11)) modo_funzionamento = EEPROM.read(10);
if (EEPROM.read(12) == EEPROM.read(13)) soglia_max = EEPROM.read(12);
if (EEPROM.read(14) == EEPROM.read(15)) Intensita_Display = EEPROM.read(14);
return true;
}
return false;
}
void guardarConfig() {
EEPROM.write(0, 27);
EEPROM.write(1, 28);
EEPROM.write(2, 13);
EEPROM.write(3, 18);
// Abbiamo messo numeri concreti all'inizio
// EEPROM per confermare che si dispone di valori corretti.
EEPROM.write(4, Temp_impostata);
EEPROM.write(5, Temp_impostata); // Abbiamo memorizzare i valori 2 volte
EEPROM.write(6, tempo);
EEPROM.write(7, tempo); // Abbiamo memorizzare i valori 2 volte
EEPROM.write(8, delta_T);
EEPROM.write(9, delta_T); // Abbiamo memorizzare i valori 2 volte
EEPROM.write(10, modo_funzionamento);
EEPROM.write(11, modo_funzionamento); // Abbiamo memorizzare i valori 2 volte
EEPROM.write(12, soglia_max);
EEPROM.write(13, soglia_max); // Abbiamo memorizzare i valori 2 volte
EEPROM.write(14, Intensita_Display);
EEPROM.write(15, Intensita_Display); // Abbiamo memorizzare i valori 2 volte
}