Termostato per solare termico

Buonasera a tutti, sono un appassionato di elettronica in generale, e mi diletto nella realizzazione
di svariate cose, in diversi campi.
Aimè non conosco invece nulla di quanto riguarda la programmazione varia di pc è nello specifico di Arduino.
Allora ho realizzato questo progetto di solare termico, fatto con 100 mt tubo in politelene da 32, al quale poi ho collegato altri 20 mt da 25, per arrivare dentro il locale caldaia, dove li ho messo uno scaldabagno da 80 lt, dentro il quale circola l'acqua tramite una pompa di circolo acqua di termosifoni
per intenderci, come credo la maggior parte di gente che ha realizzato progetti simili.
La pompa in questo momento è collegata per attivarsi tramite un termostato da pannello classico, con sonda allungata fino al tubo dove funziona perfettamente, almeno da quando è stato montato circa 1 mese mi sta dando grandi soddisfazioni.
Ora mi è venuta l'idea di farlo funzionare tramite Arduino, ho comprato quindi un arduino uno r3, ed un lcd i2c, dopo tantissime ricerche sono riuscito a trovare un codice con doppia temperatura, ed alla fine
sono riuscito a farlo funzionare, perfettamente, ma mi visualizza appunto solo le 2 temperature, ed io invece vorrei che mi facesse altro, del tipo sttivsre il relè per far funzionare la pompa, con diferenza
appunto di temperatura tra dentro e fuori per intenderci, magari facilmente regolabile con dei pulsanti per poterlo regolare direttamente da fuori, e se vi fosse la possibilità di poterlo regolare anche tramite lan, sarebbe il massimo.....
Qualcuno ha voglia di aiutarmi?????
Vi allego il codice perfettamente funzionante, almeno con le sonde ntc in mio possesso.
Vi ringrazio infinitamente per il tempo che vorrete dedicarmi.

Temperatura doppia.txt (1.79 KB)

Ciao.
Io anno scorso ho realizzato il controllo del solare attraverso arduino.
Sono felice di poterti per quanto posso dare una mano.
Per quanto mi riguarda ho utilizzato le sonde ds18b20 che vanno molto bene, possono stare all'esterno o anche immerse e sono molto semplici da configurare.(possono stare anche ad alte temperature)
E' molto semplice far funzionare un circolatore in base all'istresi della temperatura nei tubi esterni con quella dello "scaldabagno" interno.
Io l'unico problema che ho incontrato è che lo start/stop del circolatore a volte mi blocca la lan.

ti consiglio di comprarti una scheda relais per ardudino a 12 volt in modo da alimentarla con un altro alimentatore. ce ne sono a tonnellate su ebay.

buon lavoro

davideesse:
Ciao.
Io anno scorso ho realizzato il controllo del solare attraverso arduino.
Sono felice di poterti per quanto posso dare una mano.
Per quanto mi riguarda ho utilizzato le sonde ds18b20 che vanno molto bene, possono stare all'esterno o anche immerse e sono molto semplici da configurare.(possono stare anche ad alte temperature)
E' molto semplice far funzionare un circolatore in base all'istresi della temperatura nei tubi esterni con quella dello "scaldabagno" interno.
Io l'unico problema che ho incontrato è che lo start/stop del circolatore a volte mi blocca la lan.

ti consiglio di comprarti una scheda relais per ardudino a 12 volt in modo da alimentarla con un altro alimentatore. ce ne sono a tonnellate su ebay.

buon lavoro

Grazie Davide, per le sonde, be ormai ho comprato queste, le uso da giorni, è mi pare che funzionino a dovere, sono anchesse ermetiche quindi nessun problema a stare fuori, poi al momento non sono al contatto con l'acqua, ma solo a contatto esterno e va bene direi, be tu dici che semplice, ma per me non lo è affatto, parlando di apportare le modifiche al programma intendo......

Buonasera, allora nessuno che mi dia una mano ad aggiungere il codice per impostare l'isteresi della temperatura per far attivare il relè????
Aiutatemi..................
Buona serata a tutti

Questo è il mio termostato creato per comandare due pompe, una della caldaia a legna e l'altra collegata al pannello solare, il tutto comandato da un arduino mega.
Se ti può servire, (uso arduino da un mese quindi se ci sono errori incredibili, perdonatemi :cry: ) :

#include <OneWire.h>
#include <LiquidCrystal.h>

#define BUTTON A0
int diff1 = 5;
int start = 50;
#define T1 31
#define T2 33
#define T3 37
#define T4 35
#define relay 39
#define relay1 41
#define led1 43
#define led2 45
const int inputPin = A0;  
uint16_t inputValue = 0;
boolean a = false;
boolean b = false;
boolean c = false;
boolean d = false;  
unsigned long previousMillis1 = 0;
const unsigned int interval1 = 30000;
unsigned long previousMillis2 = 0;
const unsigned int interval2 = 1000;
unsigned long previousMillis3 = 0;
const unsigned int interval3 = 30000;

 
OneWire ds(T1);
OneWire da(T2);
OneWire dd(T3);
OneWire df(T4);
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

 
void setup(void) {
  pinMode (relay, OUTPUT);
  pinMode (relay1, OUTPUT);
  pinMode (led1, OUTPUT);
  pinMode (led2, OUTPUT);
  Serial.begin(9600);

  lcd.begin(16, 2);
  lcd.setCursor(0,0);
  lcd.print("   Accensione  ");
  delay( 1200 );
}
 
void loop(void) {
  
  int diff;
  int diff2; 
  float temperature = getTemp();
  float temperature1 = getTemp1();
  float temperature2 = getTemp2();
  float temperature3 = getTemp3();
  
  if (millis() - previousMillis2 >= interval2) {
  previousMillis2 = millis();
  
  lcd.clear();
  lcd.print("TC:");
  lcd.setCursor(3,0);
  lcd.print(temperature);
  
  lcd.setCursor(8,0);
  lcd.print("T1:");
  lcd.setCursor(11,0);
  lcd.print(temperature1);
 

  lcd.setCursor(0,1);
  lcd.print("TP:");
  lcd.setCursor(3,1);
  lcd.print(temperature2);
  

  lcd.setCursor(8,1);
  lcd.print("T2:");
  lcd.setCursor(11,1);
  lcd.print(temperature3);
  Serial.println(temperature);
  }

  
 
  do{
    // check buttons status
  inputValue = analogRead(inputPin);
  if(inputValue < 100 && inputValue >= 0) inputValue = 1;


  // update display text
  if(inputValue == 1)
  {
    diff1--;  
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Diff.Temp.:");
    lcd.print(diff1);
    delay(500);
    lcd.clear();
   
  }
  else
  lcd.setCursor(0,0);
  }while(inputValue == 1);

  
  
  
  do{
    // check buttons status
  inputValue = analogRead(inputPin);
  if(inputValue < 250 && inputValue > 150) inputValue = 2;
 
  if(inputValue == 2)
  { 
    diff1++;
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Diff Temp:");
    lcd.print(diff1);
    delay(500);
    lcd.clear();
  }
  else
  lcd.setCursor(0,0);
  }while(inputValue == 2);

  
  
  do{
    // check buttons status
  inputValue = analogRead(inputPin);
  if(inputValue < 470 && inputValue > 370) inputValue = 3;


  // update display text
  if(inputValue == 3)
  {
    start--;  
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temp.Start:");
    lcd.print(start);
    delay(500);
    lcd.clear();
   
  }
  else
  lcd.setCursor(0,0);
  }while(inputValue == 3);

    
   
    do{
    // check buttons status
  inputValue = analogRead(inputPin);
  if(inputValue < 670 && inputValue > 570) inputValue = 4;


  // update display text
  if(inputValue == 4)
  {
    start++;  
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Temp.Start:");
    lcd.print(start);
    delay(500);
    lcd.clear();
   
  }
  else
  lcd.setCursor(0,0);
  }while(inputValue == 4);



  
 
  diff = temperature-temperature1;
  if((diff>=diff1)&&(temperature>start)) { digitalWrite(relay,HIGH); 
                    digitalWrite(led1,HIGH); a=true;}
  if(((diff<diff1)&&(temperature>start))||(temperature<start)) if (a==true) {
       a = false;
       previousMillis1 = millis();
       b = true;
  }

  if (millis() - previousMillis1 <= interval1 && b == true) {
      digitalWrite(relay,HIGH);
      digitalWrite(led1,HIGH);
  }

  else if (millis() - previousMillis1 >= interval1 && b == true) {
           b = false;
           digitalWrite(relay,LOW);
           digitalWrite(led1,LOW);
  }

  diff2 = temperature2-temperature1;
  if((diff2>=diff1) &&(temperature2>start)) { digitalWrite(relay1,HIGH);
                    digitalWrite(led2,HIGH); c=true;}
  if(((diff2<diff1)&&(temperature2>start))||(temperature2<start)) if (c==true) {
       c = false;
       previousMillis3 = millis();
       d = true;
  }

  if (millis() - previousMillis3 <= interval3 && d == true) {
      digitalWrite(relay1,HIGH);
      digitalWrite(led2,HIGH);
  }

  else if (millis() - previousMillis3 >= interval3 && d == true) {
           d = false;
           digitalWrite(relay1,LOW);
           digitalWrite(led2,LOW);
  }
    
    

}

float getTemp(){
  //returns the temperature from one DS18B20 in DEG Celsius
 
  byte data[12];
  byte addr[8];
 
  if ( !ds.search(addr)) {
      //no more sensors on chain, reset search
      ds.reset_search();
      return -1000;
  }
 
  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1000;
  }
 
  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }
 
  ds.reset();
  ds.select(addr);
  ds.write(0x44,1); // start conversion, with parasite power on at the end
 
  byte present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE); // Read Scratchpad
 
  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = ds.read();
  }
 
  ds.reset_search();
 
  byte MSB = data[1];
  byte LSB = data[0];
 
  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;
 
  return TemperatureSum;
 
}
float getTemp1(){
  //returns the temperature from one DS18B20 in DEG Celsius
 
  byte data[12];
  byte addr[8];
 
  if ( !da.search(addr)) {
      //no more sensors on chain, reset search
      da.reset_search();
      return -1000;
  }
 
  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1000;
  }
 
  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }
 
  da.reset();
  da.select(addr);
  da.write(0x44,1); // start conversion, with parasite power on at the end
 
  byte present = da.reset();
  da.select(addr);    
  da.write(0xBE); // Read Scratchpad
 
  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = da.read();
  }
 
  da.reset_search();
 
  byte MSB = data[1];
  byte LSB = data[0];
 
  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;
 
  return TemperatureSum;
  
 
}

float getTemp2(){
  //returns the temperature from one DS18B20 in DEG Celsius
 
  byte data[12];
  byte addr[8];
 
  if ( !dd.search(addr)) {
      //no more sensors on chain, reset search
      dd.reset_search();
      return -1000;
  }
 
  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1000;
  }
 
  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }
 
  dd.reset();
  dd.select(addr);
  dd.write(0x44,1); // start conversion, with parasite power on at the end
 
  byte present = dd.reset();
  dd.select(addr);    
  dd.write(0xBE); // Read Scratchpad
 
  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = dd.read();
  }
 
  dd.reset_search();
 
  byte MSB = data[1];
  byte LSB = data[0];
 
  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;
 
  return TemperatureSum;
  
 
}

float getTemp3(){
  //returns the temperature from one DS18B20 in DEG Celsius
 
  byte data[12];
  byte addr[8];
 
  if ( !df.search(addr)) {
      //no more sensors on chain, reset search
      df.reset_search();
      return -1000;
  }
 
  if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return -1000;
  }
 
  if ( addr[0] != 0x10 && addr[0] != 0x28) {
      Serial.print("Device is not recognized");
      return -1000;
  }
 
  df.reset();
  df.select(addr);
  df.write(0x44,1); // start conversion, with parasite power on at the end
 
  byte present = df.reset();
  df.select(addr);    
  df.write(0xBE); // Read Scratchpad
 
  for (int i = 0; i < 9; i++) { // we need 9 bytes
    data[i] = df.read();
  }
 
  df.reset_search();
 
  byte MSB = data[1];
  byte LSB = data[0];
 
  float tempRead = ((MSB << 8) | LSB); //using two's compliment
  float TemperatureSum = tempRead / 16;
 
  return TemperatureSum;
}

bikermen:
Buonasera a tutti,

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, NON inerenti al tuo problema:

Ciao Prom25, volevo caricare il tuo file, ma mi da errore, è naturalmente non essendo io in grado di programmare no nriesco a capire di cosa si tratta...
Forse perchè io provo a caricarlo su un arduino uno?
GRazie saluti

Questo è il mio termostato creato per comandare due pompe, una della caldaia a legna e l'altra collegata al pannello solare, il tutto comandato da un arduino mega.
Se ti può servire, (uso arduino da un mese quindi se ci sono errori incredibili, perdonatemi :cry: ) :

Che tipo di errore hai?

SE provo m iesce questo errore
che vuol dire?
Grazie

Arduino:1.6.9 (Windows 7), Scheda:"Arduino/Genuino Uno"

C:\Users\Anto\Documents\Arduino\termostato_2_pompe\termostato_2_pompe.ino:1:21: fatal error: OneWire.h: No such file or directory

#include <OneWire.h>

^

compilation terminated.

exit status 1
Errore durante la compilazione per la scheda Arduino/Genuino Uno.

Questo report potrebbe essere più ricco di informazioni con l'opzione
"Mostra un output dettagliato durante la compilazione"
abilitata in File -> Impostazioni

Credo ti manchi la libreria OneWire, prova a scaricarla ed inserirla nella cartella di istallazione di Arduino.
(Mi potrei anche sbagliare)

Prom25:
Credo ti manchi la libreria OneWire, prova a scaricarla ed inserirla nella cartella di istallazione di Arduino.
(Mi potrei anche sbagliare)

Sì gli manca :wink:

Grazie ragazzi ora la cerco e poi riprovo
intanto notte a tutti......

Buongiorno ragazzi, ho provato a scaricare la libreria, ma non funziona, ma poi ho riflettuto ed ho capito che credo non possa funzionare in quanto sul mio utilizzo sonde ntc, quindi siano cose completamente diverse, perciò non mi resta altro che qualche volontario disposto a farmi questa piccola modifica al file in mio possesso con le relative sonde ntc appunto che in questo momento è montato è funziona alla grande è con grande precisione, e con il cavo lungo di circa 12mt, invece quello del boiler con il cavo in dotazione alla sonda che è di circa 1 mt.
Grazie ragazzi

le NTC le devi leggere tramite partitore resistivo, con gli ingressi analogici ... ma se hai un cavo cosi lungo, potrebbe captare disturbi, quindi meglio se ci aggiungi un piccolo filtro ... che NTC sono ? ... serve saperlo per calcolare il partitore ...

Ciao, si lo so ci sono già le resistenze montate, attualmente ripeto è montato l'arduino, è funziona, almeno mi da le 2 temperature perfettamente, senza alcun disturbo, o differenza, confrontata con il termostato da incasso posizionato nello stesso medesimo posto.
Le sonde sono ntc modello con cod 3470 da 10k.
Quello che appunto mi servirebbe è aggiungere un relè, a questo codice che ho inserito su in alto su la temperatura 1 controllando appunto la isteresi.
GRazie

Ragazzi, nessun altro suggerimento in aiuto??
Grazie
saluti