Controllo Relè

Ciao a tutti, non sono nuovo di questo forum.

Ho un problema che mi perseguita e non riesco a capire dove sto sbagliando.

Parto dall'inizio, dove abito ho un impianto solare termico con allaccio alla caldaia del riscaldamento.
Come funziona il solare termico non mi metto ad elencarlo perchè non è interesse di questo post.
Se però non c'è sole ho inserito un PLC della Siemens che controlla la caldaia e le elettrovalvole presenti nell'impianto.
Il PLC l'ho programmato secondo il metodo di funzionamento che desideravo.
Se non c'è sole e voglio riscaldare l'acqua posso forzare l'accensione della caldaia e aprire solamente la valvola che va al bollitore senza mandare acqua nei termosifoni.

Qui mi è venuto in aiuto Arduino che con 4 sonde DS18B20 controlla le temperature del bollitore e di mandata.
Premetto che tutto è sempre funzionato fino alla settimana passata quando ho implementato dei comandi che non hanno voglia di fare il loro lavoro.

Nella fine del programma, prima della scrittura sul display ho aggiunto due funzioni che non vengono eseguite o eseguite in parte.
Se il crono è acceso e il Bollitore è sotto i 45 gradi la valvola del bollitore si apre (dal cellulare posso vedere le uscite del PLC) ma sembra che poi si chiuda dopo un tempo non determinato.
Dico questo perché la temperatura del bollitore arriva sui 50 gradi invece che 70 come impostato.

Dove sto sbagliando??? :sob:

Grazie a tutti

Questo è il programma:

//Automazione Solare Termico con scheda 8 Relè, 4 Sonde DS18B20, Fotoresistenza e PLC Siemens LOGO!

/*   I1 --->  Calore Bollitore
 *   I2 --->  Cronotermostato
 *   I3 --->  Stagioni (INVERNO / ESTATE)
 *   I4 --->  Forza Calore Bollitore
 *   Q1 --->  Elettro Valvola Bollitore 230V
 *   Q2 --->  Elettro Valvola Riscaldamento 230V
 *   Q3 --->  Caldaia 230V
 *   Q4 --->  Pompa Ricircolo 230V
 *   
 *  Il PLC è programmato per eseguire tutte le funzioni solamente se il selettore è posizionato su INVERNO. 
 *  Attivando l'Ingresso 1 vengono attivate le uscite Q1 - Q3 - Q4 sul PLC
 *  Attivando l'ingresso 2 vengono attivate le uscite Q2 - Q3 - Q4 sul PLC
 *  Attivando l'ingresso 3 viene abilitata la sequesnza del programma in modalità INVERNO, se l'ingresso è aperto non viene eseguito nessun programma (ESTATE)
 *  Attivando l'ingresso 4 vengono attivate le uscite Q1 - Q3 - Q4 sul PLC
 *  
 *  Come si nota, sia l'ingresso 1 che l'ingresso 4 hanno la stessa funzione ma sono diversamente programmate su Arduino.
 *  L'ingresso 1 viene comandato dall'uscita "calore" di Arduino, mentre l'ingresso 4 viene comandato dall'uscita "forzatura" di Arduino
 *  
 */
 
#define fotoresistenza A0
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h> 

LiquidCrystal_I2C lcd(0x3F,20,4); 

const int estate = 2;         // Selettore in Estate (Filo Verde)
const int inverno = 3;        // Selettore in Inverno (Filo Bianco)
const int forza = 4;          // Selettore di Forzatura Calore
const int calore = 6;         // Relè 2 Arduino verso Ingresso 1 del PLC (Calore Bollitore)
const int forzatura = 7;      // Relè 3 Arduino verso Ingresso 4 del PLC (Forza Calore Bollitore)
const int stagione = 5;       // Relè 1 Arduino verso Ingresso 3 del PLC (Stagioni)
const int crono = 10;         // Contatto Termosifoni da Cronotermostato
const int termo = 8;          // Relè 4 Arduino verso Ingresso 2 del PLC (Cronotermostato)

// Lettura variabile SELETTORE
int estateState = 0;            
int invernoState = 0; 
int forzaState = 0;
int cronoState = 0;

// linea dati DS18B20 al pin 10 di Arduino
#define ONE_WIRE_BUS 9

// Imposta la comunicazione oneWire per comunicare con un dispositivo compatibile
OneWire oneWire(ONE_WIRE_BUS);

// Passaggio oneWire reference alla Dallas Temperature
DallasTemperature sensors(&oneWire);

void setup(){
  
sensors.begin();
//Configuro la fotoresistenza su A0 come Input
pinMode(A0,INPUT);

// Inizializzo LCD
lcd.init();                    
lcd.backlight();

// Configuro i Pin come USCITA
pinMode(calore, OUTPUT);  
pinMode(stagione, OUTPUT);
pinMode(forzatura, OUTPUT);
pinMode(termo, OUTPUT);
      
// Configuro i Pin come INGRESSO
pinMode(estate, INPUT);   
pinMode(inverno, INPUT); 
pinMode(forza, INPUT);
pinMode(crono, INPUT);
 
}

void loop(void){

//Leggo il valore del SELETTORE Stagioni
estateState = digitalRead(estate);
invernoState = digitalRead(inverno);
forzaState = digitalRead(forza);
cronoState = digitalRead(crono);

// Invia il comando di lettura delle temperatura
sensors.requestTemperatures(); 

if (digitalRead(inverno) == HIGH)
{
  digitalWrite(stagione, HIGH);  //Relè 1 Chiuso, Stato INVERNO Selezionato (in questo stato il PLC compie tutte le procedure richieste da Arduino)
}
else
{
  digitalWrite(stagione, LOW);   //Relè 1 Aperto, Stato ESTATE Selezionato (in questo stato il PLC non compie nessuna procedura richiesta da Arduino)
}
// Leggo il valore della fotoresistenza
int fotodiodo = analogRead(fotoresistenza);

// Se il selettore è posizionato su ESTATE il PLC non esegue nessuna funzione.
// Se il selettore Forzatura non è HIGH (quindi non forzato), le sonde di Temperatura (Caldaia & Solare) leggono valore inferiore o uguale a 45 gradi e non c'è sole, il Relè 2 (Calore) si Accende
// Sonda 2 --> Caldaia / Sonda 3 --> Solare

if (digitalRead(forza) == LOW && sensors.getTempCByIndex(2) <= 45 && sensors.getTempCByIndex(3) <= 45 && digitalRead(estate) == LOW && fotodiodo < 200) 
{
digitalWrite (calore, HIGH); // Relè 2 Chiuso
}
else
{
  digitalWrite (calore, LOW); // Relè 2 Aperto
} 
// Se una delle tre dichiarazioni è esatta il Relè commuta in OFF

if (sensors.getTempCByIndex(2) >= 70 || digitalRead(estate) == HIGH || fotodiodo > 200) 
{
 digitalWrite(calore, LOW);  // Relè 2 Aperto
}

// Se il selettore Forzatura ha valore HIGH attivo la forzatura del riscaldamento
// Se il selettore Forzatura ha valore LOW disattivo la forzatura del riscaldamento
 
 
if (digitalRead(forza) == HIGH && digitalRead(estate) == LOW)
{
  digitalWrite(forzatura, HIGH);  // Relè 3 Chiuso
}
else
{
   digitalWrite(forzatura, LOW);  // Relè 3 Aperto
}


// Se il crono è ON e il selettore è su INVERNO accendo i riscaldamenti
 

if (digitalRead(crono) == HIGH && digitalRead(inverno) == HIGH)
{
  digitalWrite(termo, HIGH);      // Relè 4 Chiuso
}
else
{
  digitalWrite(termo, LOW);       // Relè 4 Aperto
}

/*
 Se il cronotermostato è attivo per il riscaldamento e la sonda del bollitore legge una temperatura minore o uguale a 45, anche l'uscita Calore commuta in Chiusa.
 Se la sonda del Bollitore arriva a leggere un valore maggiore o uguale a 70 l'uscita Calore commuta in Aperta. 
*/

if (digitalRead(crono) == HIGH && sensors.getTempCByIndex(2) <= 45)
{
  digitalWrite(calore, HIGH); // Apro Elettro Valvola Bollitore se sotto a 45 gadi e se crono è HIGH
}


if (digitalRead(crono) == HIGH && sensors.getTempCByIndex(2) >= 70)
{
  digitalWrite(calore, LOW);  // Chiudo Elettro Valvola Bollitore se sopra a 70 gadi e se crono è HIGH
}


lcd.setCursor(0, 0); 
lcd.print("Caldaia        "); // Temperatura del Primario Bollitore da 100 LT
lcd.print(sensors.getTempCByIndex(2));
lcd.setCursor(0, 1); 
lcd.print("Solare         "); // Temperatura del Solare Bollitore da 100 LT
lcd.print(sensors.getTempCByIndex(3));
lcd.setCursor(0, 2); 
lcd.print("Mandata        "); // Temperatura della Mandata dalla Caldaia ad Impianto
lcd.print(sensors.getTempCByIndex(1));
lcd.setCursor(0, 3); 
lcd.print("Sicurezza      "); // Temperatura della Mandata dal Pannello Solare al Bollitore da 100 LT
lcd.print(sensors.getTempCByIndex(0));

delay (5000);
  
}

ciao
io sono alle prime armi,quindi non ci provo nemmeno ad aiutarti,ma se posso permettermi, secondo me già il Loop è troppo lungo.

Unico consiglio prova dividerlo con funzioni apposite,cosi magari diventa piu facile trovare l'errore.

ciao sgamino,

non so se sia questo il problema ma nei vari if() verifichi se i sensori sono <=45 e >=70...cioè tutto quello che c'è nel mezzo ...da 46 a 69 ...restituiranno false...

ORSO2001:
ciao sgamino,

non so se sia questo il problema ma nei vari if() verifichi se i sensori sono <=45 e >=70...cioè tutto quello che c'è nel mezzo ...da 46 a 69 ...restituiranno false...

Ciao ORSO2001,

potresti aver ragione ma allora non mi torna il fatto che questa riga di codice viene eseguita perfettamente.
Forse avere due controlli separati, che alla fine fanno la stessa cosa, da noia a tutto il funzionamento

if (digitalRead(forza) == LOW && sensors.getTempCByIndex(2) <= 45 && sensors.getTempCByIndex(3) <= 45 && digitalRead(estate) == LOW && fotodiodo < 200) 
{
digitalWrite (calore, HIGH); // Relè 2 Chiuso
}
else
{
  digitalWrite (calore, LOW); // Relè 2 Aperto
  
// Se una delle tre dichiarazioni è esatta il Relè commuta in OFF

if (sensors.getTempCByIndex(2) >= 70 || digitalRead(estate) == HIGH || fotodiodo > 200) 
{
 digitalWrite(calore, LOW);  // Relè 2 Aperto
}

Se la temperatura del bollitore è sotto i 45 gradi ed è notte, la caldaia si accende e scalda l'acqua fino a 70 gradi come dichiarato.
Con l'ultimo codice, dove è espresso l'ingresso crono, volevo fare la stessa cosa ma ho fatto caso che si ferma a 49 gradi.
Per si ferma intendo che l'elettro valvola si chiude a quella temperatura e non passa più acqua verso il bollitore.
Naturalmente ho ovviato al problema programmando il PLC a modo, adesso se accendo i riscaldamenti apro anche la valvola bollitore, ma lo volevo far arrivare a 70 gradi in modo da avere più acqua calda verso i termosifoni.