In questa lezione, impareremo ad utilizzare il sensore digitale DHT11 per rilevare la temperatura ambientale e la pressione atmosferica tramite il Raspberry Pi. Vedremo quali sono i collegamenti elettrici necessari e utilizzeremo un controllo software per la lettura dei valori ambientali.
Il sensore DHT11
Il componente DHT11 è un sensore di temperatura e umidità con uscita digitale che implementa un protocollo 1-wire.
In altre parole permette di comunicare i valori rilevati a un Raspberry Pi fino a 20mt di distanza usando un unico filo oltre a quello di alimentazione.
Questa caratteristica è molto importante in quanto il Raspberry Pi non è dotato di pin analogici e quindi non è immediatamente possibile usare dei sensori di questo tipo.
Il sensore è appositamente calibrato dal costruttore al fine di fornire misurazioni stabili.
Il DHT11 opera nell'intervallo di temperature comprese tra 0 e 50 gradi centigradi e nell'intervallo tra 20% ed 90% di umidità relativa.
Esiste in commercio con 3 o 4 piedini entrambi funzionalmente equivalenti. Nella versione a 4 piedini uno di essi non è collegato.
Il DHT11 va alimentato con una tensione compresa tra i 3 e 5V.
Per utilizzare il sensore DHT11 con il Raspberry Pi utilizziamo la libreria Adafruit_DHT. Per installarla basta eseguire il seguente comando:
sudo pip3 install Adafruit_DHT
Circuito di controllo DHT11
Il sensore DHT11 espone 3 pin denominati:
- GND: piedino di massa
- VCC: piedino di alimentazione
- DAT: piedino di comunicazione dati 1-wire
Per realizzare il circuito di controllo, oltre al Raspebrry Pi, sono necessari una resistenza da 4.7 KOhm, il sensore DHT11 e 3 fili arcobaleno maschio-femmina.
Il circutio ed i collegamenti da effettuare sono mostrati in figura.
Collegamenti da effettuare:
Raspberry pin #2 | pin VCC del DHT11 |
Raspberry pin #9 | pin GND del DHT11 |
Raspberry pin #40 | pin DAT del DHT11 |
Raspberry pin #11 | LCD pin #13 [DB6] |
Tra il pin VCC e DAT del DHT11 | inserire la resistenza da 4.7 KOhm per stabilizzare la linea dati |
La numerazione dei pin GPIO
La numerazione dei pin, delle varie versioni di Raspebrry Pi, che si sono succedute negli anni, è sempre stato un tema controverso.
Il motivo principale consiste nel fatto che librerie diverse adottano numerazioni differenti. Inoltre versioni differenti del Raspberry Pi hanno connettori GPIO e numerazioni diverse.
Nello specifico, esistono due tipologie di numerazione dei pin GPIO:
Numerazione fisica: i pin sono numerati sequenzialmente per colonna, assegnando il numero 1 al primo pin in basso a sinistra e il numero 2 al primo pin in alto a sinistra (guardando il connettore dall’alto). In figura i numeri all’interno del cerchietto colorato rappresentano la numerazione fisica dei pin GPIO.
Numerazione BCM: la numerazione dei pin segue quella definita dal chip Broadcom del Raspberry Pi. BCM infatti significa Broadcom SOC channel. In figura la numerazione BCM è riportata nel rettangolo sotto ogni pin e preceduta dal prefisso GPIO.
Per esempio il pin 7 in numerazione fisica corrisponde al pin GPIO 4 in numerazione BCM. Il pin fisico numero 40 corrisponde al GPIO 21 in numerazione BCM.
È importante notare che la numerazione in figura è valida solo per i seguenti modelli:
- Raspberry Pi Model B+
- Raspberry Pi 2B
- Raspberry Pi Zero
- Raspberry Pi Zero W
- Raspberry Pi 3B
Alcune librerie permettono di impostare quale numerazione utilizzare.
Codice lettura temperatura ed umidità in Python
Di seguito il codice python da eseguire sul Raspberry Pi per effettuare la misurazione di temperatura e umidità ambientale.
import Adafruit_DHT # 1
import time # 2
# 3
DHT11 = Adafruit_DHT.DHT11 # 4
DHT11_PIN = 21 # usa numerazione pin BCM # 5
# 6
while True: # 7
umidita, temperatura = Adafruit_DHT.read_retry(DHT11, DHT11_PIN, retries=2, delay_seconds=1) # 8
if umidita is not None and temperatura is not None: # 9
print('Temperatura={0:0.1f}*C Umidità={1:0.1f}%'.format(temperatura, umidita)) # 10
else: # 11
print('Errore nella acquisizione valori. Riprova!!!') # 12
time.sleep(5) # 13
Analizziamo il codice:
Riga 4: la variabile DHT11 è impostata con il tipo specifico di sensore utilizzato. Ciò è necessario poiché la libreria che utilizziamo supporta diversi tipi di sensori.
riga 5: la variabile DHT11_PIN contiene il pin di interfaccia, in numerazione BCM, tra il sensore ed il Raspberry Pi.
riga 8: tramite il metodo read_retry leggiamo i valori rilevati dal sensore. Importante notare che questo metodo prevede due parametri molto importanti:
- retries: numero di tentativi in caso di lettura fallita. Il protocollo 1-wire implementato richiede il rispetto di tempistiche molto stringenti. Linux, non essendo un sistema operativo hard real time può, alle volte, non rispettare i parametri e quindi non eseguire la lettura correttamente.
- delay_seconds: tempo di attesa tra una prova di lettura e la successiva.
riga 9-12: In base a quanto spiegato i valori di umidità e temperatura possono essere nulli. Quindi il codice stampa i parametri solo se effettivamente rilevati. In caso contrario visualizza un messaggio di errore.
riga 13: attende 5 secondi prima di effettuare una nuova lettura.
In questa lezione, abbiamo visto come sia facile interfacciarsi con il sensore digitale di temperatura e umidità DHT11.
Abbiamo analizzato i pochi collegamenti elettrici necessari e il codice di controllo in python.
Nella lezione successiva, utilizzando quanto appreso nella lezione precedemte, realizzeremo una semplice stazione meteo con display LCD che visualizza temperatura e umidità misurate in prossimità del Raspberri Pi.
Infine, tramite il servizio cloud Yahoo Weather, estenderemo le funzionalità della stazione meteo visualizzando i parametri atmosferici rilevati in una località remota.