Il sensore DHT11 (ed il sensore DHT22) permette di misurare sia la temperatura che il livello di umidità presente nell’aria. Presente in commercio per pochi euro, lo troviamo già montato su schede elettriche che ne facilitano enormemente l’utilizzo. Vediamo in questo articolo come è facile collegare questo sensore al nostro Raspberry Pi e come effettuare delle misure.
[wpda_org_chart tree_id=24 theme_id=50]
I Sensori DHT11 e DHT12
Questo piccolo sensore sta raccogliendo molto successo ultimamente grazie al suo basso costo e alla facilità di utilizzo. La possibilità di effettuare delle misure sia di temperatura che di umidità lo rendono molto utile in applicazioni come stazioni metereologiche, sonde per l’analisi del terreno e sistemi domotici.
Come detto sopra, questo sensore lo troviamo in commercio già integrato su un piccolo modulo che ci facilita enormemente il compito dei collegamenti. Infatti non sarà necessaria alcuna saldatura, né tenere conto dell’aggiunta di altri componenti elettronici come le resistenza. Sarà sufficiente connettere con dei semplici cavi jumper ai 3 o 4 connettori in uscita. Vediamoli in dettaglio
Come possiamo vedere dalla foto i due modelli sono facilmente distinguibili tra di loro. Il DHT11 ha la custodia di color blu mentre il DHT22 ha la custodia di color bianco. Il DHT11 è più economico a discapito però di una minore precisione e di una minore resistenza. Inoltre nel caso in cui necessitano misurazioni agli estremi della scala della umidità relativa (0-20% e 80-100% di umidità) si deve utilizzare obbligatoriamente il DHT22.
Ecco i margini di operabilità del sensore DHT11
- Humidity Range: 20-90% RH
- Humidity Accuracy: ±5% RH
- Temperature Range: 0-50 °C
- Temperature Accuracy: ±2% °C
- Operating Voltage: 3.3V to 5.5V
- Tempo di lettura: 6-10 secondi
Articolo suggerito
Ecco i margini di operabilità del sensore DHT22
- Humidity Range: 0-100% RH
- Humidity Accuracy: ±2% RH
- Temperature Range: -40-80 °C
- Temperature Accuracy: ±0.5% °C
- Operating Voltage: 3.3V to 6V
- Tempo di lettura: 2 secondi
L’umidità relativa
Abbiamo visto che i sensori DHT11 e DHT12 ci permettono di misurare allo stesso tempo i valori di temperatura e di umidità, o più precisamente di umidità relativa. Ma che cosa è l’umidità relativa?
L’umidità relativa è la quantità di vapore acqueo presente nell’aria rispetto al punto di saturazione del vapore acqueo nell’aria. In corrispondenza del punto di saturazione, il vapore acqueo comincia a condensare ed accumularsi sulle superfici formando goccie di umidità.
Il punto di saturazione varia a seconda della temperatura dell’aria. Aria fredda può mantenere una percentuale minore di vapore acqueo, mentre aria sempre più calda è in grado di mantenerne sempre di più prima di raggiungere il grado di saturazione.
L’equazione per calcolare l’umidità relativa è la seguente
dove è la densità del vapore acqueo, mentre è la densità del vapore acqueo a saturazione.
L’umidità relativa viene espressa in percentuali, per cui al 100% di umidità si ha il fenomeno di condensazione, e a 0% si ha aria completamente secca.
Raspberry Pi 4
Vedi la migliore offerta per i seguenti modelli:
Come i sensori DHT11 e DHT22 misurano la temperatura e l’umidità
Il sensore DHT11 come anche il DHT22, rilevano la presenza di vapore acqueo misurando la resistenza elettrica tra due elettrodi. Il componente sensibile all’umidità è un substrato in grado di trattenere l’umidità, con gli elettrodi applicati alla superficie. Quando l’acqua viene assorbita dal substrato, gli ioni vengono rilasciati dal substrato che incrementa in questo modo la conduttività tra i due elettrodi. La variazione di resistenza tra i due elettrodi è proporzionale all’umidità relativa. Maggiore sarà l’umidità relativa, minore sarà la resistenza tra i due elettrodi, mentre minore sarà l’umidità relativa, maggiore sara la resistenza tra i due elettrodi.
Mentre per quanto riguarda la temperatura, il sensore DHT11 la misura grazie alla presenza di un sensore di temperatura NTC (termistore) montato su di esso.
Se si rimuove la custodia di plastica che protegge il sensore, è possibile vedere i due elettrodi applicati al substrato su di un lato del circuito stampato, mentre sull’altro lato abbiamo un circuito integrato (IC) che ha il compito di convertire le misure di resistenza in umidità relativa. Inoltre questo IC contiene al suo interno i coefficienti di calibrazione, e controlla la trasmissione dei dati tra il sensore DHT e l’esterno.
Se il sensore DHT11 è montato su una basetta da cui escono solo 3 pin, allora sarà già presente su di esso una resistenza pull-up di 10KΩ. Questa è necessario sia presente tra la linea di segnale e l’alimentazione a 5V, per assicurarsi che il livello del segnale rimanga alto per default. Se invece si dispone del modulo sensore da solo (quello con 4 pin in uscita e senza basetta) allora dovremo aggiungere da soli la resistenza di pull-up.
Connettere il DHT11 al Raspberry Pi
Abbiamo visto che il DHT11 (come anche il DHT22) si può trovare in commercio in due diverse versioni, con o senza basetta. Nel caso in cui sia stato acquistato il sensore DHT11 con la basetta, si ha inclusa la resistenza di 10KΩ, e quindi si può connettere direttamente ai pin del Raspberry Pi secondo lo schema seguente.
Nel caso in cui invece si ha disposizione la versione del sensore DHT11 sensa basetta, abbiamo a che fare con 4 pin ed una resistenza 10KΩ da aggiungere alla connessione tra il Vcc e il pin del segnale, seguendo lo schema seguente.
Nel mio caso, ho a disposizione un sensore DHT11 dotato di basetta. Faccio quindi le connessioni dirette tra la GPIO del Raspberry ed i 3 connettori della basetta, senza preoccuparmi di inserire una resistenza. Ecco una foto del mio caso.
Programmiamo Raspberry per mostrare i valori su terminale
Per poter lavorare con i sensori DHT al meglio, scaricheremo la libreria Adafruit_DHT distribuita da Adafruit. Per scaricarla si può utilizzare Git che è già installato su Raspberry. Inserisci quindi il seguente comando.
git clone https://github.com/adafruit/Adafruit_Python_DHT.git
Una volta scaricata la libreria sul file system di Raspberry, ci spostiamo sulla directory della libreria.
cd Adafruit_Python_DHT
Adesso installate la libreria
sudo python setup.py install
Ora che tutto è stato installato, possiamo scrivere uno script in Python che ci permetterà di leggere temperatura e umidità relativa direttamente dal sensore DHT11 in tempo reale. Creiamo quindi un file dht11.py.
sudo nano dht11.py
E poi scriviamoci all’interno il seguente codice:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import Adafruit_DHT
#for DHT11
sensor = 11
#for DHT22
#sensor = 22
gpio = 4
humidity, temperature = Adafruit_DHT.read_retry(sensor, gpio)
if humidity is not None and temperature is not None:
print 'Temp: {0:0.1f}°C Humidity: {1:0.1f} %'.format(temperature, humidity)
else:
print 'Failed to get reading. Check the sensor connection!"
sys.exit(1)
Se controlliamo in dettaglio lo script, vediamo la funzione read_retry() della libreria Adafruit_DHT che riceve due parametri. Il valore 11 sta ad indicare che il sensore utilizzato è DHT11 (se fosse stato il DHT22 avreste dovuto inserire 22). Il secondo parametro, in questo caso 4, è il numero GPIO (non il pin) a cui è collegato il sensore.
Invece di scrivere lo script seguente, è possibile ottenere lo stesso risultato eseguendo direttamente il file AdafruitDHT.py e passandoci gli stessi argomenti di cui abbiamo parlato sopra.
cd examples sudo ./AdafruitDHT.py 11 4
Eseguendo in entrambe i casi, si ottiene il seguente output (i valori di lettura, certamente, saranno diversi).
Temp=21.0* Humidity=75.0%
NOTA: Dovete tenere presente che il sensore è in grado di effettuare una lettura circa ogni 10 secondi per il DHT11 e ogni 2 secondi per il DHT22, quindi non è possibile usare un ciclo FOR per una richiesta di più misurazioni in minor tempo.
ciao, stavo provando ad utilizzare il sensore dht 22 con il raspberry 4 e quando provo ad usare il codice sopra mi restituisce il seguente errore
Traceback (most recent call last):
File “/home/pi/Adafruit_Python_DHT/temperatura.py”, line 14, in
humidity, temperature = Adafruit_DHT.read_retry(sensor, gpio)
File “/home/pi/Adafruit_Python_DHT/Adafruit_DHT/common.py”, line 94, in read_retry
humidity, temperature = read(sensor, pin, platform)
File “/home/pi/Adafruit_Python_DHT/Adafruit_DHT/common.py”, line 80, in read
platform = get_platform()
File “/home/pi/Adafruit_Python_DHT/Adafruit_DHT/common.py”, line 60, in get_platform
from . import Beaglebone_Black
File “/home/pi/Adafruit_Python_DHT/Adafruit_DHT/Beaglebone_Black.py”, line 24, in
from . import Beaglebone_Black_Driver as driver
ImportError: cannot import name ‘Beaglebone_Black_Driver’ from ‘Adafruit_DHT’ (/home/pi/Adafruit_Python_DHT/Adafruit_DHT/__init__.py)
da cosa dipende?
grazie ciao
Lorenzo
Ciao Lorenzo,
mi fa strano che vada a cercare i driver di Beaglebone Black (un’altra scheda simile a Raspberry, ma diversa).
Sicuro di aver scaricato da Adafruit ed installato la versione del driver per Raspberry o la libreria per Rasberry e non quella per Beaglebone?