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);
}