Misurare la temperatura con Arduino e la DS18B20

DS18B20 Arduino

La sonda basata sul sensore DS18B20 consente a chi utilizza Arduino di effettuare precise misurazioni di temperatura legate a gas e liquidi.

In un articolo di diversi anni fa, intitolato Elaborazione elettronica delle temperature, spiegammo l’utilizzo della sonda termometrica DS18B20 collegata con un Raspberry PI 3. Oggi mostriamo invece come configurare la sonda con Arduino.

Lavoreremo con la sonda dotata di cavo e protezione metallica distribuita da AZ-Delivery, ma il software funzionerà egregiamente per qualsiasi altro sistema basato sul sensore DS18B20.

Controlliamo le connessioni

Collegare le sonde DS18B20 alla scheda del microcontrollore come mostrato nel seguente schema di collegamento:

Arduino DS18B20

DS18B20 Arduino

NOTA: il resistore pull up da 4,7 kΩ è collegato tra il pin DATA e VCC.

Per utilizzare la sonda DS18B20 con schede a microcontrollore, dobbiamo prima scaricare la relativa libreria. Vai su: Strumenti > Gestisci librerie, apparirà una nuova finestra. Digita “Dallas” nella casella di ricerca e scarica la libreria “DallasTemperature” di “Miles Burton, Tim Newsome Guil Barros e Rob Tillaart”, come mostrato nell’immagine seguente:

Arduino DS18B20

Ora vai su: File > Esempi > DallasTemperature > … e troverai molti sketck di esempio. Utilizzeremo e modificheremo uno sketch chiamato “Multiplo” per leggere i dati di temperatura da tre diverse sonde DS18B20.

Arduino DS18B20

Se usi solo una sonda DS18B20, sarà sufficiente lavorare con lo sketch chiamato “Semplice”.

Il software

Quello che segue è l’esempio di sketch per tre sonde DS18B20 sulla stessa interfaccia One-Wire. L’esempio ne prevedeva solo due, ma a noi piace sporcarci le mani…

Esecuzione del programma

Carica lo sketch sulla scheda del microcontrollore e apri Monitor seriale (Strumenti> Monitor seriale). L’output dovrebbe assomigliare a quello mostrato nell’immagine seguente:

Arduino DS18B20

Come (e perché) funziona

Quella che segue è una spiegazione dello sketch.
Usiamo la variabile ONE_WIRE_BUS per definire su quale pin digitale collegheremo l’interfaccia One-Wire. E’ possibile utilizzare qualsiasi pin digitale della scheda del microcontrollore, ad eccezione di quelli utilizzati nell’interfaccia seriale, D0 e D1.

Abbiamo utilizzato la variabile TEMPERATURE_PRECISION per impostare la precisione per le sonde DS18B20. Il numero salvato in questa variabile è un numero di conversione digitale in bit e può essere compreso tra 9 e 12, qualsiasi altro numero risulterà in errore.

Abbiamo utilizzato la seguente riga di codice:

per creare variabili per gli indirizzi delle sonde. Nel nostro esempio ne abbiamo creati tre.

Abbiamo definito e creato l’oggetto oneWire, utilizzato per l’interfaccia One-Wire:

Quindi abbiamo utilizzato l’oggetto oneWire per definire e creare l’oggetto sensors, che viene utilizzato per tutte le sonde collegate:

Per inizializzare l’oggetto sensori abbiamo utilizzato la seguente riga di codice:

Con questa linea del codice l’oggetto sensors rileva tutte le sonde collegate all’interfaccia One-Wire. Rileva anche tutti gli indirizzi delle sonde.

Ora possiamo verificare se le sonde funzionano correttamente, utilizzando le seguenti righe di codice per ogni sonda che colleghiamo all’interfaccia One-Wire:

dove uno è l’indirizzo della prima sonda.

Per impostare la precisione della conversione da analogico a digitale della sonda specifica abbiamo utilizzato la seguente riga di codice:

Se si desidera leggere la precisione della conversione da analogico a digitale della sonda specifica, è possibile utilizzare la seguente riga di codice:

La funzione restituisce un valore esadecimale e per convertirlo in valore decimale utilizziamo la seguente riga di codice:

Per poter leggere i dati di temperatura, dobbiamo prima richiedere tutti i dati a tutte le sonde, utilizzando la seguente riga di codice:

Solo dopo quella riga di codice possiamo leggere i dati di una particolare sonda, utilizzando la seguente riga di codice:

dove passiamo l’argomento deviceAddress alla funzione per leggere i dati di temperatura da una sonda specifica. Questi dati rappresentano il valore della temperatura in gradi Celsius e per convertirlo in Fahrenheit abbiamo utilizzato la seguente riga di codice:

Il loop() richiede le temperature e stampa i valori ottenuti attraverso l’indirizzo di ciascuna sonda, quindi si ferma per un secondo e ricomincia.

NOTA: Un ambiente rumoroso dal punto di vista elettromagnetico, la lunghezza dei cavi di collegamento e il numero di sonde utilizzate nel progetto influiscono negativamente sulla precisione e sulla stabilità del progetto.

 

Link utili:

Join our groups on Telegram…

… and don’t forget our social channels!

Definire ciò che si è non risulta mai semplice o intuitivo, in specie quando nella vita si cerca costantemente di migliorarsi, di crescere tanto professionalmente quanto emotivamente. Lavoro per contribuire al mutamento dei settori cardine della computer science e per offrire sintesi ragionate e consulenza ad aziende e pubblicazioni ICT, ma anche perche’ ciò che riesco a portare a termine mi dà soddisfazione, piacere. Così come mi piace suonare (sax, tastiere, chitarra), cantare, scrivere (ho pubblicato 350 articoli scientfici e 3 libri sinora, ma non ho concluso ciò che ho da dire), leggere, Adoro la matematica, la logica, la filosofia, la scienza e la tecnologia, ed inseguo quel concetto di homo novus rinascimentale, cercando di completare quelle sezioni della mia vita che ancora appaiono poco ricche.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.