Primo post (spero di non fare castronerie da subito)
Ciao a tutti!
Vorrei sottoporre un quesito in merito a una possibile implementazione del mio sistema di riscaldamento casalingo.
Attualmente si compone di pavimento radiante su due livelli, comandato da due termostati (piano terra e piano primo). La parte di riscaldamento invece è composta da una vecchia caldaia, un accumulo da 800 litri, un impianto solare.
Attualmente funziona in questa maniera:
Termostato piano chiude il contatto, eccita la bobina di un relè che accende la pompa di circolazione del piano dedicato
Al calare della temperatura nell'accumulo, tramite un termostato analogico a punto fisso installato nell'accumulo fa partire la pompa di ricircolo acqua
La caldaia, al calare della temperatura nell'accumulo, tramite un altro termostato analogico a punto fisso, fa partire la caldaia
(spero sia chiaro, ma posso immaginare che ai più non risulti così)
Stanco di continui malfunzionamenti e consumi eccessivi (il termostati sull'accumulo non modulano e non hanno una gestione intelligente del sistema) vorrei provare a gestire questa situazione con Arduino.
Ho acquistato un kit (ELEGOO Advanced Starter Kit)
Ho necessità di creare un programma per "automatizzare" con arduino una sorta di termoregolazione:
Definizione variabili in gioco:
- C = Caldaia (contatto pulito)
- P_rc = pompa ricircolo
- P_pt = pompa piano terra
- P_p1 = pompa piano primo
- T_pt = termostato piano terra (contatto pulito)
- T_p1 = termostato piano primo(contatto pulito)
- S_1 = Sonda boiler mediana
- S_2 = Sonda boiler alta
- Boil = Bollitore
- Sol = Solare (contatto pulito)
- Rel_1 = Contatto NA Relè pompa ricircolo
- Rel_2 = Contatto NA Relè pompa piano terra
- Rel_3 = Contatto NA Relè pompa piano primo
Le due variabili termostato lavorano con un contatto pulito in uscita.
Il funzionamento dovrebbe essere questo:
- Se T_pt ON, attiva il contatto NA di REL_1 e il contatto NA di Rel_2
- Se T_p1 ON, attiva il contatto NA di REL_1 e il contatto NA di Rel_3
- Se il valore in gradi celsius di S_1 è inferiore a 40°, chiudi il contatto di C
- Se il valore in gradi celsius di S_1 è superiore a 70°, apri il contatto di C
- Se il valore di gradi celsius di S_2 è inferiore a 30°, chiudi il contatto di C
- Se il valore in gradi celsius di S_2 è superiore a 60°, apri il contatto di C
- Se il contatto di Sol è chiuso impedisci l'attivazione di C, altrimenti non fare nulla
- Il controllo della temperatura di S_1 ed S_2 vorrei fosse effettuato ogni 300 secondi
Inoltre vorrei vedere su un display (mi hanno consigliato I2C 16x2 ) i seguenti dati in tempo reale:
- Temperatura S_1
- Temperatura S_2
- Stato P_pt (ON o OFF)
- Stato P_p1 (ON o OFF)
- Stato P_rc (ON o OFF)
Le sonde S_1 e S_2 saranno DS18B20 (da una ricerca online risultano quelle che fanno al caso mio, ma non ne ho la certezza), mentre i relè Rel_1, Rel_2, Rel_3 saranno i finder 40.61.8.230.0000. In parallelo alla bobina metterò dei diodi 1N4007, per evitare ritorni
Ho scritto un po' di codice, ho chiesto anche a un AI di aiutarmi.
Ho caricato poi il programma su arduino cloud (sembra girare) e vorrei capire se ci sono migliorie o altro
Sotto il codice:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#define C 7
#define P_rc 4
#define P_pt 5
#define P_p1 6
#define T_pt_pin 8
#define T_p1_pin 9
#define S_1_pin 2
#define S_2_pin 3
#define Sol_pin 10
OneWire oneWire1(S_1_pin);
OneWire oneWire2(S_2_pin);
DallasTemperature sensors1(&oneWire1);
DallasTemperature sensors2(&oneWire2);
LiquidCrystal_I2C lcd(0x27, 16, 2); // Indirizzo I2C del display (può variare)
unsigned long lastTempCheck = 0;
const long tempCheckInterval = 300000; // 300 secondi
void setup() {
Serial.begin(9600);
sensors1.begin();
sensors2.begin();
lcd.init();
lcd.backlight();
pinMode(C, OUTPUT);
pinMode(P_rc, OUTPUT);
pinMode(P_pt, OUTPUT);
pinMode(P_p1, OUTPUT);
pinMode(T_pt_pin, INPUT_PULLUP);
pinMode(T_p1_pin, INPUT_PULLUP);
pinMode(Sol_pin, INPUT_PULLUP);
}
void loop() {
unsigned long currentTime = millis();
if (currentTime - lastTempCheck >= tempCheckInterval) {
sensors1.requestTemperatures();
sensors2.requestTemperatures();
lastTempCheck = currentTime;
}
float temp1 = sensors1.getTempCByIndex(0);
float temp2 = sensors2.getTempCByIndex(0);
int t_pt_state = digitalRead(T_pt_pin);
int t_p1_state = digitalRead(T_p1_pin);
int sol_state = digitalRead(Sol_pin);
if (t_pt_state == LOW) { // Termostato ON
digitalWrite(P_rc, HIGH);
digitalWrite(P_pt, HIGH);
} else {
digitalWrite(P_pt, LOW);
}
if (t_p1_state == LOW) { // Termostato ON
digitalWrite(P_rc, HIGH);
digitalWrite(P_p1, HIGH);
} else {
digitalWrite(P_p1, LOW);
}
if (temp1 < 40 temp2 < 30) {
if(sol_state == HIGH){
digitalWrite(C, HIGH); // Caldaia ON
}
}
if (temp1 > 70 temp2 > 60) {
digitalWrite(C, LOW); // Caldaia OFF
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("S1:");
lcd.print(temp1);
lcd.print("C S2:");
lcd.print(temp2);
lcd.setCursor(0, 1);
lcd.print("Pt:");
lcd.print(digitalRead(P_pt));
lcd.print(" P1:");
lcd.print(digitalRead(P_p1));
lcd.print(" Rc:");
lcd.print(digitalRead(P_rc));
delay(1000);
}
Non ho acquistato nulla al momento ( solo il kit Elegoo) e vorrei capire se posso migliorare il codice in qualche maniera, o usare componenti diversi
Grazie a tutti in anticipo

