Velocità DS18B20

Oggi chiacchierando con un amico abbiamo parlato del sensore temperatura digitale DS18B20.
Io avevo già fatto una prova per il mio sistema domotico senza rilevare problemi.
Questo amico mi informa del fatto che a quanto pare, il sensore impiegherebbe quasi un secondo (0.75 come lui afferma) per fornire la temperatura rilevata. In questi fatidici 0.75 secondi, arduino rimarrebbe "congelato" in attesa del dato. A livello domotico, questo stop di arduino sarebbe imbarazzante, immaginate se in quel momento io dovessi accendere una luce, oppure se dovesse spegnere il riscaldamento...
Qualcuno sa se effettivamente c'è questo "problema"?

Se guardi il datasheet e leggi pagina 20 vedrai che il tempo di conversione di una temperatura è proporzionale alla precisione richiesta.

Quindi ... SI, con una precisione di 12 bit il tempo di conversione è, al massimo, di 750 mSec, tempo che però cala a circa 94 mSec se la precisione si abbassa a 9 bit.

Dipende a te con che precisione occorrono i dati ... che, come riportato a pagina 3 è :

"The resolution of the temperature sensor is user-configurable to 9, 10, 11, or 12 bits, corresponding to increments of 0.5°C, 0.25°C, 0.125°C, and 0.0625°C, respectively."

Guglielmo

Edit : per applicazioni di domotica credo che i 9 bit (+/- 0.5 gradi) siano più che sufficienti :wink:

Grazie mille Guglielmo!
Preciso e puntuale come sempre :slight_smile:
Ho preso l'occasione per dare una sbirciatina al datasheet.
Le prove che avevo fatto io erano proprio con setting a 9 bit, che come dici, sono più che sufficienti in ambito domotico.
Anzi, se fosse per la mia mogliettina potrebbero fare sensori a 2 bit (e avanzerebbero), lei ha la soglia: sopra i 26 gradi sta bene, sotto ha freddo!
Ecco, questo è il periodo in cui la viene a letto con una "sexy" pseuodo tuta da meccanico in pail spesso 9mm!
Mammaggia a me...

Grazie ancora!!!

khriss75:
Ecco, questo è il periodo in cui la viene a letto con una "sexy" pseuodo tuta da meccanico in pail spesso 9mm!
Mammaggia a me...

....

Guglielmo

Non ridere, io ci soffro! :stuck_out_tongue: :wink: :smiley:

@Guglielmo: vero che la precisione richiesta non è elevatissima nel caso di termostato per impianto termico civile, ma io ho preferito maggior precisione della lettura con tempi più lunghi, che è tutto dire visto che si parla comunque di millisec. Maggior precisione per pura mania dei numeretti: ad arrotondare eventualmente ci penso io.

@khriss75: noi, quella tuta, la chiamiamo "yeti".... :blush: :grin: e comunque 26°C è fuori norma, max 20+2!!! Spero di esserti stato...utile... :stuck_out_tongue:

Mi sono accorto del problema precisione perchè, nello sbagliare un interval tra 2 comunicazioni successive al pc, mi venivano letture tipo -85 -127 (vado a memoria): ripristinando tempi più lunghi, la lettura si compie correttamente. Credo che fosse proprio il problema precisione/tempi conversione

Il problema del delay non sussiste: Arduino non deve rimanere congelato, ma deve passare un certo tempo tra una lettura e la successiva. Avevo lo stesso timore nel leggere alcune discussione, in realtà vedo che si può leggere tranquillamente, lasciando correre il loop, MA rispettando questi tempi di conversione

Con 20°C vedo la signora a letto con il cappellino stile Pina Fantozzi... (ed in calzini che sormontano la tuta Yeti.
In viaggio di nozze in una isoletta del Kenya ha avuto il coraggio di mettere il piumone per dormire... aaaahhhh, la prossima la scelgo siberiana.
Grazie per le info aggiuntive andreino! Il timore era proprio che arduino dovesse "fermarsi" per acquisire il valore di temperatura.

Ciao, sono Marco, alle prime armi con Arduino.

Ho rilevato lo stesso problema nel tentativo di realizzare un termostato : a me Arduino resta “bloccato” per circa 1 secondo (750 millisecondi?) utilizzando la sonda DS16B20, mentre non mi succede con la sonda LM35.
Lo rilevo quando premo i pulsanti (tempM e tempP) per diminuire o aumentare la temperatura di soglia del termostato, un decimo di grado alla volta, con la seguente istruzione :
if(digitalRead(tempM) == HIGH){ tempSoglia-=0.1; }
if(digitalRead(tempP) == HIGH){ tempSoglia+=0.1; } .
Mi spiego meglio : con DS18B20, tenendo premuto un pulsante, la variazione avviene circa ogni secondo anche con un delay a fine loop di 100 millisecondi; con LM35, invece, la variazione è funzione del delay impostato.

Ho provato a spostare l’istruzione all’interno del loop, ma senza nessun risultato.

Molto probabilmente mi sfugge qualcosa e se qualcuno è in grado di suggerirmi la soluzione,lo ringrazio in anticipo.
Ciao
Marco

Termostato_ist2_DS18B20.ino (2.77 KB)

marco508286:
Ho rilevato lo stesso problema nel tentativo di realizzare un termostato : a me Arduino resta "bloccato" per circa 1 secondo (750 millisecondi?) utilizzando la sonda DS16B20, mentre non mi succede con la sonda LM35.

Ti sfugge quello che ha detto Guglielmo pochi post prima del tuo

gpb01:
Se guardi il datasheet e leggi pagina 20 vedrai che il tempo di conversione di una temperatura è proporzionale alla precisione richiesta.

Quindi ... SI, con una precisione di 12 bit il tempo di conversione è, al massimo, di 750 mSec, tempo che però cala a circa 94 mSec se la precisione si abbassa a 9 bit.

PaoloP:

marco508286:
Ho rilevato lo stesso problema nel tentativo di realizzare un termostato : a me Arduino resta "bloccato" per circa 1 secondo (750 millisecondi?) utilizzando la sonda DS16B20, mentre non mi succede con la sonda LM35.

Ti sfugge quello che ha detto Guglielmo pochi post prima del tuo

gpb01:
Se guardi il datasheet e leggi pagina 20 vedrai che il tempo di conversione di una temperatura è proporzionale alla precisione richiesta.

Quindi ... SI, con una precisione di 12 bit il tempo di conversione è, al massimo, di 750 mSec, tempo che però cala a circa 94 mSec se la precisione si abbassa a 9 bit.

Grazie per la risposta, io avevo frainteso la risposta di Andreino "Il problema del delay non sussiste: Arduino non deve rimanere congelato.." e non avevo correttamente interpretato la continuazione della frase.

Ora, se volessi un tempo di risposta più rapido, accettando una precisione minore, come si fa a dire alla sonda di utilizzare una precisione diversa (11 o 10 bit)?

Grazie
Ciao
Marco

Il comando è sensors.setResolution
Trovi un esempio qui --> https://github.com/milesburton/Arduino-Temperature-Control-Library/blob/master/examples/Multiple/Multiple.pde

PaoloP:
Il comando è sensors.setResolution
Trovi un esempio qui --> https://github.com/milesburton/Arduino-Temperature-Control-Library/blob/master/examples/Multiple/Multiple.pde

Grazie mille.
Marco