Salve a tutti del forum, mi affido per l'ennesima volta alla vostra cultura per risolvere un problema.
Sto cercando di assemblare un termostato con arduino uno, una sonda DS18B20 ed un relè.
Il mio problema sta nella programmazione, i collegamenti non sono un problema.
Questo termostato, in poche parole, dovrebbe eccitare il relè che a sua volta fa aprire una valvola idraulica a tre vie da 0 a 64 gradi e diseccitare il relè una volta raggiunta la temperatura di 65 gradi. E fin qui tutto ok.
Quando l'acqua si raffredda e quindi scende, non deve eccitare subito il relè a 64 gradi per raggiungere di nuovo i 65°C ma deve aspettare che scenda fino a 50°C.
Ho guardato un pò in giro e ho trovato qualcosa che parli di isteresi, ma non riesco a capire come funziona.
C'è qualcuno che potrebbe aiutarmi?
Ps. Questo è il codice che ho usato io per la solo accensione del relè da 0 a 65 gradi.
/* Misura la temperatura con sensore DS18B20
collegato al piedino A0
*/
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 14
OneWire ourWire(ONE_WIRE_BUS);
DallasTemperature sensors(&ourWire);
void setup()
{
delay(1000);
Serial.begin(9600);
Serial.println("Misura la temperatura con sensore DS18B20");
Serial.println("Orzowilde");
delay(2000);
sensors.begin();
pinMode(13, OUTPUT);
}
void loop()
{
Serial.println();
sensors.requestTemperatures();
Serial.print("Temperatura = ");
float temp = (sensors.getTempCByIndex(0));
Serial.print(temp);
Serial.println(" gradi C");
if (temp < 65){
digitalWrite(13, HIGH);
}
else
{
digitalWrite(13, LOW);
}
}
Ps2. Per fare le prove faccio accendere e spegnere il led invece del relè.
Salve a tutti, ho fatto delle aggiunte al mio progetto però non riesco a venirne fuori.
E' da 3 giorni che mi scervello ma non riesco a capire cosa sbaglio.... possibilmente è una fesseria.
Ho aggiunto un potenziometro da 10k opportunamente collegato per aumentare e diminuire la temperatura impostata, così da poter scegliere al momento dell'utilizzo la giusta temperatura.
Il potenziometro risponde bene e mi cambia il valore della temperatura impostata, ma non riesco a far accendere il led che mi simula il relè. Inoltre non riesco a inserire l'isteresi che mi permette di non far attivare subito il relè scendendo la temperatura di 1 grado, ma dovrebbe riattaccare quando arriva 15 gradi sotto la temperatura impostata.
diciamo (sempre se ho capito bene) che non fai nessun controllo sulla temperatura letta, lo fai solo sulla temperatura impostata (che non ha senso per me).
Tutti quegli if() non servono a niente.
Devi spegnere il led quando Temperatura Ambiente è maggiore di Temperatura Impostata; devi accendere il led quando Temperatura Ambiente è minore di (Temperatura Impostata - ISteresi).
Comunque ho modificato di nuovo il codice e c'è un altro problema.
E' vero che se la temperatura è minore della temperatura impostata - l'isteresi il led accende, ma se supero la temperatura dell'ambiente il led continua ad essere acceso.
ho provato ad impostare la temperatura a 45 gradi ed essendo la temperatura ambiente a 29 il led si è acceso.... ma poi riscaldando il sensore ho visto che a 49 gradi era ancora acceso. Perchè?
nuovo codice:
/* Misura la temperatura con sensore DS18B20
collegato al piedino A0
*/
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 14
OneWire ourWire(ONE_WIRE_BUS);
DallasTemperature sensors(&ourWire);
int val=0;
int potenziometro=A1;
int tempImpostata = 0;
int isteresi = 15;
float temp = (sensors.getTempCByIndex(0));
void setup()
{
delay(2000);
Serial.begin(9600);
Serial.println("Misura la temperatura con sensore DS18B20");
Serial.println("Orzowilde");
delay(2000);
sensors.begin();
Serial.print("Temperatura Impostata = ");
Serial.print(tempImpostata);
Serial.println(" gradi C");
pinMode(13, OUTPUT);
}
void loop()
{
val=analogRead(potenziometro);
tempImpostata=map(val, 0, 1023, 0, 85);
Serial.println();
Serial.print("Temperatura Impostata = ");
Serial.print(tempImpostata);
Serial.println(" gradi C");
if (temp < (tempImpostata - isteresi))
{
digitalWrite(13, HIGH);
}
else
{
digitalWrite(13, LOW);
}
Serial.println();
sensors.requestTemperatures();
Serial.print("Temperatura Attuale = ");
float temp = (sensors.getTempCByIndex(0));
Serial.print(temp);
Serial.println(" gradi C");
}