CRONO-TERMOSTATO DS18B20 LCD ISTERESI - TIMER NOTTURNA E POTENZIOMETRO

Buongiorno a tutti, premetto che sono alle prime armi e vorrei chiedere un vostro consiglio,
mi si è rotto il termostato di casa e con l’occasione ho deciso di sostituirlo con arduino, una sonda DS18B20, un modulo rtc tiny i2c, un display 2004a i2c, e un possibile potenziometro per regolare la temperatura nel caso si esca per molto mantenedo comunque una temperatura minima anti congelamento, quindi da un minimo di 5 ad un massimo di 22, uscita a scheda comandi rele pin 7 riscaldamento (pin 6 raffrescamento)
le variabili non sono il mio forte, e con la boleana anche meno, il valore di isteresi è programmato a 0,7°C, attualmente Tmax 18 ed ho iniziato ad inserire anche il potenziometro, sono troppi giorni che ci lavoro e chiedo il vostro aiuto
Il display attualmente mostra la T settata, la variabile temp (per capire se la riconosce), temperatura, segnale on off che non funziona, data e ora
Non riesco ad inserire la variabile temperatura nella boleana quindi il rele non funziona, ed il potenziometro l’ho iniziato ad inserire e non terminato (attualmente non funziona)
Giorgio

#include <OneWire.h>                        // sonda DS18B20
#include <LiquidCrystal_I2C.h>              // per display i2c
// #include <Wire.h>                           // RTC
#include <RTClib.h>                         // RTC

LiquidCrystal_I2C lcd(0x3f,20,4);
 
//float temp = (20);
int temp = (20);          //  variabile
 
int DS18B20_Pin = A2;          //  PIN sensore temperatura DS18B20
#define pinR 6               //  PIN uscita digitale RAFFRESCAMENTO
#define pinG 7               //  PIN uscita digitale RISCALDAMENTO

int val=0;               //  variabile
int potenziometro=A0;    //  PIN ingresso analogico Potenziometro
int tempImpostata = 0;   //  variabile

//********VARIABILI OROGLOGIO********
char buffer1[20];
char buffer2[20];
RTC_DS1307 RTC;

//********isteresi - parametri di intervento temperatura********
float max = 18.0;              // valore massimo di intervento
float min = (max-0.7);              // valore minimo di intervento
 
byte grad[8] = {
  B01100,
  B10010,
  B01100,
  B00000,
  B00000,
  B00000,
  B00000,
};

//********isteresi - parametri di intervento temperatura******** 

OneWire ds(DS18B20_Pin);

void setup(void)
{
    pinMode( pinR,OUTPUT );
    pinMode( pinG,OUTPUT );
  Serial.begin(9600);
     Wire.begin();   //RTC
     RTC.begin();     //RTC
  analogReference(EXTERNAL);                            //REFERENCE aumento sensibilità
  // Per display LCD 20 Colonne, 4 Righe, I2C 
  lcd.init();
  lcd.begin(20, 4);
  lcd.backlight();
  lcd.clear();
//    if (! RTC.isrunning()) {                           //RTC
//    RTC.adjust(DateTime(__DATE__, __TIME__));          //RTC
  lcd.setCursor(1,0);
  lcd.print("DS18B20 TERMOSTATO");
  lcd.setCursor(9,2);
  lcd.print("by");
  lcd.setCursor(7,3);
  lcd.print("GIORGIO");
    lcd.createChar(0, grad);     // crea il carattere speciale grado
 
  delay( 3000 );
  lcd.clear(); 
  lcd.setCursor(0,1);
  lcd.print("Temperatura:   ");
  lcd.setCursor(18,1);
  lcd.write(byte(0));       // inserisci il carattere speciale grado
  lcd.setCursor(19,1);
  lcd.print("C");
  lcd.setCursor(0,2);
  lcd.print("Riscaldamento: ");
  
}
 
void loop(void) {
  float temperature = getTemp();
  Serial.println(temperature, 2);
//  float temp = (temperature * 10)/0.1;
  temp = (temperature);
  val=analogRead(potenziometro);
  tempImpostata=map(val, 0, 1023, 5, 22);

  digitalWrite( pinG,isteresi(temp) );  //linee in cui i due led sono uno acceso e l’altro spento in funzione del valore restituito dalla funzione booleana isteresi;
  digitalWrite( pinR,!isteresi(temp) ); //
 
//  lcd.clear(); 
//  lcd.setCursor(0,1);
//  lcd.print("Temperatura:   ");
  lcd.setCursor(14,1);
  lcd.print(temperature, 1);
//    lcd.write(byte(0));       // inserisci il carattere speciale grado
//    lcd.print("C");

  DateTime now = RTC.now();
  //  sprintf(buffer1,  "%02d:%02d:%02d", now.hour(), now.minute(), now.second());
  sprintf(buffer1,  "%02d:%02d", now.hour(), now.minute());
  sprintf(buffer2,  "%02d/%02d/%d", now.day(), now.month(), now.year());
  lcd.setCursor(12,3);
  lcd.print(buffer1);
    Serial.println(buffer1);
  lcd.setCursor(0,3);
  lcd.print(buffer2);
    Serial.println(buffer2);  
   delay(1000); //just here to slow down the output so it is easier to read
}

//****************** gestione temperatura ******************

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.println("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;
}

//****************** ciclo calcolo boleano isteresi min-MAX ******************
//  float temp = (24);
bool oldRetCode;      

bool isteresi(float temp)   // linea 52: definisci la funzione di tipo boolean, ossia in grado di restituire un valore booleano,
                            // e che accetta in ingresso un valore di temperatura sulla base del quale esegue e valutazioni.
 
{
 
  bool retCode = false;     // linea 54: imposta il valore di ritorno della funzione come false;
  if (temp > max)           // linee 55-57: confronta il valore di temperatura con la soglia massima ed al superamento imposta a true il return code;
  {
    retCode = true;
    showLcd("OFF");
  } 
  else if ( temp < min )    // linee 58-60: confronta il valore di temperatura con la soglia minima ed al superamento imposta a false il return code;
  {
    retCode = false;
    showLcd(" ON"); 
  }
  else {
    retCode = oldRetCode;   // linea 62: in caso di valore sia compreso tra la soglia minima e quella massima restituisci il valore precedentemente salvato nella variabile oldRetCode;
  }
   
  oldRetCode = retCode;     // linee 65-66: reimposta il valore di oldRetCode come retCode in modo da salvare il valore corrente prima di restituirlo
                            // alla funzione chiamante ( loop ); e restutuisci il valore con il comando return.
  return retCode;
}

void showLcd(String valore) {
   
  lcd.setCursor(17, 2);
  lcd.print( valore );
  lcd.setCursor(0, 0);
  lcd.print("Set:"); lcd.print(min, 1); lcd.print("-"); lcd.print(max, 1); lcd.write(byte(0));
  lcd.print(" "); lcd.print(temp, 1);
//lcd.print(" ");
  Serial.println(tempImpostata, 1);
//  lcd.println(tempImpostata, 1);
}

Buonasera e benvenuto, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:
P.P.S.: ... e leggi attentamente il punto 15 (e suoi sottopunti) del succitato regolamento ... perché, affinchè il thread non venga chiuso, il tuo termostato deve controllare un contatto in bassissima tensione e NON la tensione di rete :wink: