Uno dei modi più semplici ed economici per aggiungere il rilevamento della temperatura nel vostro progetto Arduino è quello di utilizzare DS18B20 1-Wire Temperature Sensor. Questi sensori sono abbastanza precisi e non hanno bisogno di componenti esterni per funzionare. Quindi, con poche connessioni e un po’ di codice Arduino sarete in grado di rilevare la temperatura in pochissimo tempo!
DS18B20 1-Wire Temperature Sensor
DS18B20 è un sensore di temperatura con interfaccia 1-Wire prodotto da Dallas Semiconductor Corp. L’interfaccia unica 1-Wire® richiede solo un pin digitale per la comunicazione bidirezionale con un microcontrollore.
Il sensore viene solitamente in due fattori di forma. Uno che viene fornito in pacchetto TO-92 sembra esattamente come un normale transistor. L’altro in stile sonda impermeabile che può essere più utile quando hai bisogno di misurare qualcosa lontano, sott’acqua o sotto terra.
Il sensore di temperatura DS18B20 è abbastanza preciso e non necessita di componenti esterni per funzionare. Può misurare temperature da -55°C a +125°C con una precisione di ±0.5°C.
La risoluzione del sensore di temperatura è configurabile dall’utente a 9, 10, 11 o 12 bit. Tuttavia, la risoluzione predefinita all’accensione è di 12 bit (cioè 0,0625°C di precisione).
Il sensore può essere alimentato con un’alimentazione da 3V a 5,5V e consuma solo 1mA durante le conversioni di temperatura attive.
Ecco le specifiche complete:
Alimentazione | da 3V a 5.5V |
Consumo di corrente | 1mA |
Campo di temperatura | -55 a 125°C |
Accuratezza | ±0.5°C |
Risoluzione | da 9 a 12 bit (selezionabile) |
Tempo di conversione | < 750ms |
Multiplo DS18B20 su singolo bus
Uno dei più grandi vantaggi del DS18B20 è che più DS18B20 possono coesistere sullo stesso 1-bus a 1 filo. Dato che ogni DS18B20 ha un codice seriale unico a 64-bit, che è stato masterizzato in fabbrica, è più facile differenziarli l’uno dall’altro.
Questa caratteristica può essere un enorme vantaggio quando si desidera controllare molti DS18B20 distribuiti su una vasta area.
Per sapere come leggere la temperatura da più sensori di temperatura DS18B20, controlla questo tutorial.
DS18B20 Sensor Pinout
GND è un pin di terra.
DQ è 1-Wire Data Bus dovrebbe essere collegato ad un pin digitale sul microcontrollore.
Il pin VDD fornisce l’alimentazione per il sensore che può essere tra 3.3 e 5V.
Cablaggio del sensore di temperatura DS18B20 ad Arduino
Basta con la teoria, passiamo alla pratica! Colleghiamo il DS18B20 ad Arduino.
I collegamenti sono abbastanza semplici. Iniziate collegando VDD al pin di uscita 5V su Arduino e GND a terra.
Poi collegate il restante pin del segnale digitale DQ al pin digitale 2 su arduino. Avrete anche bisogno di aggiungere la resistenza di pull-up 4.7k tra il segnale e il pin di alimentazione per mantenere stabile il trasferimento dei dati. (i pull-up interni su arduino non funzionano)
Fate attenzione a mettere il DS18B20 nel modo giusto. Se lo metti nel modo sbagliato, diventerà caldo e poi si romperà.
Se stai usando la versione impermeabile del DS18B20, collega la striscia rossa a 5V, il nero si collega alla terra e la striscia gialla è i dati che vanno al pin digitale 2 di arduino. Hai ancora bisogno di collegare una resistenza di pullup da 4.7K dai dati a 5V.
Installazione della libreria per DS18B20
Il protocollo Dallas 1-Wire è piuttosto complesso, e richiede un sacco di codice per analizzare la comunicazione. Per nascondere questa inutile complessità installeremo la libreria DallasTemperature.h in modo da poter impartire semplici comandi per ottenere letture della temperatura dal sensore.
Per installare la libreria vai a Sketch > Includi libreria > Gestisci librerie…Attendi che Library Manager scarichi l’indice delle librerie e aggiorni la lista delle librerie installate.
Filtra la tua ricerca digitando ‘ds18b20’. Ci dovrebbero essere un paio di voci. Cerca DallasTemperature di Miles Burton. Clicca su quella voce e poi seleziona Install.
Questa libreria Dallas Temperature è una libreria specifica per l’hardware che gestisce funzioni di livello inferiore. Ha bisogno di essere accoppiata con One Wire Library per comunicare con qualsiasi dispositivo one-wire, non solo con DS18B20. Installare anche questa libreria.
Codice Arduino
Il seguente sketch ti darà una comprensione completa su come leggere le letture della temperatura dal sensore di temperatura DS18B20 e può servire come base per esperimenti e progetti più pratici.
#include <OneWire.h>#include <DallasTemperature.h>// Data wire is plugged into digital pin 2 on the Arduino#define ONE_WIRE_BUS 2// Setup a oneWire instance to communicate with any OneWire deviceOneWire oneWire(ONE_WIRE_BUS);// Pass oneWire reference to DallasTemperature libraryDallasTemperature sensors(&oneWire);void setup(void){ sensors.begin();// Start up the library Serial.begin(9600);}void loop(void){ // Send the command to get temperatures sensors.requestTemperatures(); //print the temperature in Celsius Serial.print("Temperature: "); Serial.print(sensors.getTempCByIndex(0)); Serial.print((char)176);//shows degrees character Serial.print("C | "); //print the temperature in Fahrenheit Serial.print((sensors.getTempCByIndex(0) * 9.0) / 5.0 + 32.0); Serial.print((char)176);//shows degrees character Serial.println("F"); delay(500);}
Ecco come appare l’output nel monitor seriale.
Spiegazione del codice:
Lo sketch inizia includendo le librerie OneWire.h e DallasTemperature.h e dichiarando il pin Arduino a cui è collegato il pin di segnale del sensore.
#include <OneWire.h>#include <DallasTemperature.h>#define ONE_WIRE_BUS 2
Poi creiamo un oggetto one-wire passando il pin di segnale del sensore al suo costruttore. Questo oggetto one-wire ci permette di comunicare con qualsiasi dispositivo one-wire, non solo con il DS18B20. Per comunicare con il sensore DS18B20, dobbiamo creare un oggetto della libreria DallasTemperature e passare il riferimento all’oggetto one-wire come parametro.
OneWire oneWire(ONE_WIRE_BUS);DallasTemperature sensors(&oneWire);
Una volta creato un oggetto DallasTemperature, possiamo dare i seguenti semplici comandi per interagire con il sensore.
-
begin()
la funzione cerca i sensori collegati sul bus e imposta la risoluzione in bit (12 bit) per ciascuno. -
requestTemperatures()
la funzione invia il comando per tutti i sensori sul bus per eseguire una conversione di temperatura. -
getTempCByIndex(deviceIndex)
la funzione legge e restituisce la lettura della temperatura dal sensore.deviceIndex
non è altro che la posizione del sensore sul bus. Se stai usando solo un DS18B20 sul bus, impostalo a 0.
Altre funzioni utili nella libreria DallasTemperature.h
Ci sono alcune funzioni utili che puoi usare con l’oggetto DallasTemperature. Alcune di esse sono elencate di seguito:
-
setResolution()
la funzione imposta la risoluzione del convertitore analogico-digitale interno del DS18B20 a 9, 10, 11, o 12-bit, corrispondenti a incrementi di 0.5°C, 0.25°C, 0.125°C, e 0.0625°C, rispettivamente. -
bool getWaitForConversion()
la funzione restituisce il valore del flag waitForConversion. Può essere utile quando si vuole controllare se una conversione di temperatura è completa. -
setHighAlarmTemp()
&setLowAlarmTemp()
funzione imposta gli allarmi interni di alta & bassa temperatura per un dispositivo in gradi Celsius. L’intervallo valido è da -55 a 125°C -
bool hasAlarm()
la funzione restituisce vero se il dispositivo ha una condizione di allarme quando la temperatura supera l’impostazione di alta & bassa temperatura di allarme.