Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Raspberry Pi e DHT11: Mini stazione meteo -parte 1-

In questa lezione, che sarà completata dalla successiva, descriveremo la realizzazione di una mini stazione meteo con il Raspberry Pi ed il sensore DHT11.
In questa lezione, che sarà completata dalla successiva, descriveremo la realizzazione di una mini stazione meteo con il Raspberry Pi ed il sensore DHT11.
Link copiato negli appunti

Questa lezione descrive la realizzazione di una mini stazione meteo con il Raspberry Pi e il sensore DHT11 che visualizza la temperatura e l'umidità misurate localmente.
Nella seconda parte della lezione (che sarà pubblicata domani) estenderemo le funzionalità della mini stazione meteo aggiungendo la rilevazione di temperatura e umidità in una località remota scelta dall'utente.
Entrambe le lezioni si basano su quando descritto nelle precedenti lezioni: sensore umidità e temperatura DHT11 e LCD alfanumerico.

Mini Stazione Meteo

Per realizzare la stazione meteo dobbiamo integrare su un unica breadboard il circuito per il controllo del sensore DHT11 con quello per il controllo del display LCD.
In questo modo leggeremo i parametri atmosferici tramite sensore DHT11 e li visualizzeremo sullo LCD.
Il circuito e i collegamenti da effettuare sono mostrati in figura.

I collegamenti da effettuare sono i seguenti:

Raspberry pin #2 linea + rossa sulla breadboard
Raspberry pin #6 linea - blu sulla breadboard
pista di Vcc sulla breadboard pin VCC del DHT11
pista di GND sulla breadboard pin GND del DHT11
Raspberry pin #22 pin DAT del DHT11
Tra il pin VCC e DAT del DHT11 inserire la resistenza da 4.7 KOhm per stabilizzare la linea dati
Raspberry pin #7 LCD pin #14 [DB7]
Raspberry pin #11 LCD pin #13 [DB6]
Raspberry pin #13 LCD pin #12 [DB5]
Raspberry pin #15 LCD pin #11 [DB4]
Raspberry pin #36 LCD pin #6 [E]
Raspberry pin #38 LCD pin #5 [R/W]
Raspberry pin #40 LCD pin #4 [RS]
LCD pin#3 [Vo] pin centrale del potenziometro
LCD pin#2 [Vdd] linea + rossa sulla breadboard
LCD pin#1 [Vss] linea - blu sulla breadboard
LCD pin# BL- linea - blu sulla breadboard
LCD pin# BL+ piedino della resistenza da 220 Omh
altro piedino reistenza linea + rossa sulla breadboard
piedino destro potenziometro linea + rossa sulla breadboard
piedino sinistro potenziometro linea - blu sulla breadboard

Codice di controllo in Python

Analizziamo ora il codice della stazione meteo, leggermente più complesso rispetto a quelli delle lezioni precedenti.


import sys
import time
import Adafruit_DHT
from RPLCD.gpio import CharLCD
from RPi import GPIO

RITARDO = 60

#configurazione sensore DHT11
DHT11 = Adafruit_DHT.DHT11
DHT11_PIN = 25 # usa numerazione pin BCM
DHT11_TENTATIVI = 2
DHT11_TENTATIVI_RITARDO = 1

def inizializza_lcd():
    #inizializzazione display LCD
    lcd = CharLCD(numbering_mode=GPIO.BOARD, cols=16, rows=2, pin_rs=40, \
                  pin_rw=38, pin_e=36, pins_data=[15, 13, 11, 7])
    lcd.backlight = True
    lcd.cursor_mode = 'hide'
    return lcd

def crea_icone(lcd):
    #definizione icone per stazione meteo
    icon_in = (
        0b01000,
        0b01100,
        0b01110,
        0b01111,
        0b01111,
        0b01110,
        0b01100,
        0b01000
    )

    icon_out = (
        0b00010,
        0b00110,
        0b01110,
        0b11110,
        0b11110,
        0b01110,
        0b00110,
        0b00010
    )

    #creazione icone per stazione meteo
    lcd.create_char(0, icon_in)
    lcd.create_char(1, icon_out)

def splash_screen(lcd):
    #visualizzazione splash screen
    lcd.clear()
    lcd.cursor_pos = (0, 3)
    lcd.write_string("Raspberry")
    lcd.cursor_pos = (1, 1)
    lcd.write_string("Stazione Meteo")
    time.sleep(2)
    for _ in range(16):
        lcd.shift_display(-1)
        time.sleep(0.2)
    lcd.clear()

def visualizza_valori(lcd, umidita, temperatura):
    lcd.cursor_pos = (0, 0)
    lcd.write_string("\x00T:{}C\x01".format(int(temperatura)))
    lcd.cursor_pos = (1,0)
    lcd.write_string("\x00U:{}%\x01".format(int(umidita)))    

def visualizza_errore(lcd):
    lcd.cursor_pos = (0, 5)
    lcd.write_string("Errore")
    lcd.cursor_pos = (1,1)
    lcd.write_string("Lettura Valori")    

def lettura_DHT11():
    return Adafruit_DHT.read_retry(DHT11, DHT11_PIN, \
                                   retries=DHT11_TENTATIVI, \
                                   delay_seconds=\
                                   DHT11_TENTATIVI_RITARDO)

def main():
    lcd = inizializza_lcd()
    crea_icone(lcd)
    splash_screen(lcd)

    while True:
        umidita, temperatura = lettura_DHT11()
        if umidita is not None and temperatura is not None:
            print('Temperatura={0:0.1f}*C  Umidità={1:0.1f}%'\
                  .format(temperatura, umidita))
            visualizza_valori(lcd, umidita, temperatura) 
        else:
            print('Errore nella acquisizione valori. Riprova!!!')
            visualizza_errore(lcd)
        time.sleep(RITARDO)


if __name__ == "__main__":
    main()

 

In testa al codice sono definite alcune variabili di controllo.

  • RITARDO: definisce l'intervallo fra due letture dei parametri locali.
  • DHT11: definisce il tipo di sensore per configurare correttamente la libreria.
  • DHT11_PIN: pin dati 1-wire usato per comunicare con il sensore DHT11.
  • DHT11_TENTATIVI: numero massimo di tentativi di lettura dei parametri ambientali prima di generare un errore.
  • DHT11_TENTATIVI_RITARDO: tempo in secondi che intercorre tra un tentativo di lettura e il successivo.

Metodo main
Non appena il programma va in esecuzione, viene eseguito il metodo main, che implementa il ciclo principale della stazione meteo.
Viene inizializzato l'LCD, esattamente come avevamo visto nella lezione dedicata. Dopo vengono definite delle icone personalizzate nel metodo crea_icone.
A questo punto il metodo spalsh_screen visualizza una schermata iniziale sullo LCD per dare il benvenuto all'utente.

All'interno del ciclo principale, tramite il metodo lettura_DHT11, vengono inizialmente letti i valori dal sensore.
Se i valori sono validi, allora vengono visualizzati sullo LCD tramite il metodo visualizza_valori.
In caso contrario, il metodo visualizza_errore viene invocato in modo da far apparire un messaggio di errore sul display LCD.

Metodo inizializza_lcd
Viene invocato il costruttore della libreria Adafruit_DHT. Il significato dei singoli parametri è stato descritto nella lezione LCD alfanumerico pertanto non è qui ripetuto.

Metodo crea_icone
Il display LCD e la libreria di controllo permettono di definire una mappa di caratteri definita dall'utente.
In questo caso definiamo due icone che rappresentano il fatto che i valori atmosferici siano stati rilevati in locale o in remoto.
icon_in e icon_out sono due tuple di valori binari che rappresentano il bitmap dell'icona.
Il metodo create_char si occupa dell'effettiva creazione dei caratteri personalizzati nella mappa di memoria del display LCD.

Metodo splash_screen
Questo metodo, invocato solo durante l'inizializzazione del programma, visualizza uno schermata iniziale e, tramite il metodo shift_display, realizza un effetto di animazione/scroll del testo sul display.

Metodo visualizza_valori
Questo metodo visualizza i valori di temperatura e umidità. Viene utilizzato il metodo write_string per visualizzare una stringa sul display.
Da notare il modo cui sono inserite nella stringa le icone che abbiamo definito precedentemente.
In particolare \x00 si riferisce alla prima icona definita, mentre \x01 indica l'icona nella seconda zona di memoria della mappa di caratteri utente.

Metodo visualizza_errore
In caso di lettura errata, da parte del sensore, questo metodo viene invocato per informare l'utente di quanto accaduto.

Metodo lettura_DHT11
Il metodo read_retry della libreria Adafruit_DHT effettua in maniera affidabile la lettura dei parametri atmosferici tramite il sensore DHT11.

Conclusioni

In conclusione seguendo questa lezione, con pochi e semplici componenti, è possibile realizzare una mini stazione meteo che consente di misurare la temperatura ed umidità ambientale nelle vicinanze del Raspberry Pi.
Nella lezione successiva (che come anticipato sarà pubblicata domani), sfruttando la libreria Yahoo Weather, estenderemo le funzionalità della stazione meteo aggiungendo la possibilità di rilevare temperatura e umidità in una località remota definita dall'utente.

Ti consigliamo anche