Trovato un pò di tempo ho messo insieme un pò di righe di codice per il controllo
Nella foto la linea rossa è la temperatura rilevata (simulata al momento da una funzione)
La linea centrale gialla è la temperatura impostata e l'altra linea celeste è il valore del controllo pid .
ora mi manca di prendere l'arduino attaccare sonda e relè e vedere come si comporta in una situazione reale.
No è una vita che devo finire quel coso e non ho mai trovato tempo, ora che ci ho rimesso le mani non farmi cambiare idea!!!!
Parte del progetto la riutilizzero anche per un sistema di cottura a bassa temperatura che volevo fare da tempo.
Non tutti sanno che 'il brodo' cotto a bassa temperatura è mooolto più buono! XD
Allora, partiamo dal principio.....
Non riesco a leggere nemmeno una temperatura a seriale.
Sonda ds18b20 e arduino uno rev3.
Come si scrive il codice?
MrLofraz:
Sonda ds18b20 e arduino uno rev3.
Come si scrive il codice?
ciao,
scaricati OneWire.zip da: http://www.pjrc.com/teensy/td_libs_OneWire.html
una volta decompresso deve essere messo nella cartella libraries.
Dopo aver rilanciato Arduino nel menu file => esempi => OneWire troverai:
L' esempio DS18x20_Temperature bello e pronto
Ho caricato quella libreria, ma il risultato è che legge una temperatura maggiore di circa 3°C rispetto ad un termometro a mercurio che ritengo affidabile.
Provando poi a collegare la sonda in parasite mode, la situazione peggiora ancora di più.
Poi, siccome dovrò visualizzare la temperatura su un display, cosa si può togliere dal codice, in maniera di visualizzare soltanto "temperatura = 26,5" (es.)?
Bè, non conosco la libreria, ma nel tuo codice non vedo la conversione, quindi immagino sia nella libreria. dovresti aprire il file della libreria e trovare la riga di conversione, li sicuramente ci trovi il valore da cambiare per 'tarare' la sonda.
Per la stampa dei valori è abbastanza intuitivo, ogni riga Serial.print() stampa qualcosa, se Serial.println() stampa e poi va a capo. Individua le righe che non vuoi e le 'commenti' mettendo // all'inizio della riga. modifica poi la riga che ti stampa la temperatura e scrivici quello che vuoi.
Perdonami, la conversione sta nello sketch di esempio, che tu hai tagliato, o non hai postato completamente.
alla fine dello sketch dovresti avere questo:
// convert the data to actual temperature
unsigned int raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// count remain gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
Serial.print(" Temperature = ");
Serial.print(celsius);
Serial.print(" Celsius, ");
Serial.print(fahrenheit);
Serial.println(" Fahrenheit");
dove la riga 'celsius = (float)raw / 16.0;' ti da il risultato che viene stampato. basta che alla fine dellì'operazione aggiungi '- 3.0' e sei a posto.
se vuoi fae le cose fatte bene, prendo un cubetto di ghiaccio e fai la misura, (0°), poi prendi una trazza di acqua calda e fai la prova (confronto col mercurio), poi una misura a temperatura ambiente sempre a confronto con il termometro a mercurio.
se in tutti i casi l'errore è 3gradi, allora sì, è così semplice. Altrimenti devi trovare la curva (o la retta) che unisce i punti trovati, e poi il valore che leggerai lo metterai nella funzione curva/retta e otterrai come risultato la temperatura vera.
La dalla DS18b20 è una sonda di precisione che restituisce direttamente il valore in gradi celsius.
Tratto dal datasheets , pagina 3 di 22:
The DS18B20 output temperature data is calibrated in degrees Celsius.
Per esperienza mia, sono tutte abbastanza precise ed uno scostamento di 3 gradi è inammissibile.
Secondo me il test fornito da MrLofraz è inattendibile.
@Lesto: ritengo che sia impossibile che in tutto il range misurabile ci possa essere uno scostamento costante di 3 gradi.
Prova ad utilizzare la libreria presente a questo indirizzo con relativo esempio , è sicuramente più completa : DallasTemperature library
Poi se non ricordo male la sonda che hai tu è quella rivestita di plastica, potrebbe essere quello il problema , un cattivo trasferimento termico tra l'involucro e il sensore potrebbe esserne la causa, ma se fosse questo non ha sicuramente un andamento lineare nel tempo.
Prova ad immergere entrambi i termometri in acqua fredda e a lasciarli li per un pò di tempo,il valore della tua sonda dovrebbe decrescere nel tempo fino a stabilizzarsi ad un valore comuque non corretto (più alto della T reale).
@MrLofraz: lascia perdere il parasite mode per ora, t'infogni di più e basta!
Come si può notare QUI gli scostamenti rilevati su un campione di 35 sonde (10 DS18s20 e 25 DS18b20) sono irrisori, o perlomeno molto al di sotto di quanto ci serve.
Il codice di esempio (preso sempre dalla wiki di Miles) è:
#include <OneWire.h>
#include <DallasTemperature.h>
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
void setup(void)
{
// start serial port
Serial.begin(9600);
Serial.println("Dallas Temperature IC Control Library Demo");
// Start up the library
sensors.begin();
}
void loop(void)
{
// call sensors.requestTemperatures() to issue a global temperature
// request to all devices on the bus
Serial.print("Requesting temperatures...");
sensors.requestTemperatures(); // Send the command to get temperatures
Serial.println("DONE");
Serial.print("Temperature for the device 1 (index 0) is: ");
Serial.println(sensors.getTempCByIndex(0));
}
Per il collegamento ricordati la resistenza di pull-up sul pin centrale.
gingardu:
terrmometro ambientale che sballa di 3 gradi
secondo me l' errore dovrebbe trovarsi:
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// count remain gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
cece99:
Scusate, eh, cosa centra sto PID?
non basta rilevare la temperatura con un sensorino e accendere e spegnere il riscaldatore per mantenere la temperatura prefissata?