La prima parte di 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.
In questa seconda e ultima parte descriviamo come estendere le funzionalità della mini stazione meteo aggiungendo la rilevazione di temperatura e umidità in una località remota definita dall’utente.
Rilevazione valori ambientali remoti
Per poter rilevare temperatura e umidità in una località remota ci affidiamo alla libreria Yahoo Weather.
Per installarla basta eseguire il seguente comando:
sudo pip3 install weather-api
Analizziamo ora le modifiche da apportare al codice della stazione meteo per effettuare la lettura tramite la libreria Yahoo Weather.
import sys
import time
import Adafruit_DHT
from RPLCD.gpio import CharLCD
from RPi import GPIO
from weather import Weather, Unit
RITARDO = 5
LUOGO = "Torino"
#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_locale, temperatura_locale,\
umidita_meteo, temperatura_meteo):
lcd.cursor_pos = (0, 0)
lcd.write_string("\x00T:{}C\x01 \x01T:{}C\x00"\
.format(int(temperatura_locale), int(temperatura_meteo)))
lcd.cursor_pos = (1,0)
lcd.write_string("\x00U:{}%\x01 \x01U:{}%\x00"\
.format(int(umidita_locale),\
int(umidita_meteo)))
def visualizza_errore(lcd):
lcd.clear()
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 inizializza_api_meteo():
meteo = Weather(unit=Unit.CELSIUS)
return meteo
def lettura_meteo(meteo, localita):
lookup = meteo.lookup_by_location(localita)
temperatura = lookup.condition.temp
umidita = lookup.atmosphere.humidity
return umidita, temperatura
def main():
lcd = inizializza_lcd()
crea_icone(lcd)
splash_screen(lcd)
meteo = inizializza_api_meteo()
while True:
umidita_locale, temperatura_locale = lettura_DHT11()
if umidita_locale is not None and \
temperatura_locale is not None:
umidita_meteo, temperatura_meteo = lettura_meteo(meteo,\
LUOGO)
print('Temperatura Locale={}*C Umidità Locale={}%'\
.format(int(temperatura_locale), \
int(umidita_locale)))
print('Temperatura Meteo={}*C Umidità Meteo={}%'\
.format(temperatura_meteo, umidita_meteo))
visualizza_valori(lcd, umidita_locale, temperatura_locale,\
umidita_meteo, temperatura_meteo)
else:
print('Errore nella acquisizione valori. Riprova!!!')
visualizza_errore(lcd)
time.sleep(RITARDO)
if __name__ == "__main__":
main()
Descriviamo ora le modifiche apportate al codice rispetto alla versione precedente.
Abbiamo aggiunto una sola variabile di controllo.
- LUOGO: definisce la località remota da cui rilevare i dati.
Metodo main
L'unica modifica apportata riguarda la lettura di umidità e temperatura nel LUOGO definito tramite il metodo lettura_meteo.
Metodo visualizza_valori
Concettualmente uguale a prima ma ora visualizza 4 valori anziché 2.
Metodo inizializza_api_meteo
Questo metodo richiama il costruttore della libreria Weather. L'unità di misura (gradi celsius) viene passata come parametro d'inizializzazione.
Metodo lettura_meteo
Tramite il metodo lookup_by_location viene effettuata la vera e propria chiamata API per la rilevazione dei valori remoti.
Infine temperatura ed umidità vengono estratti dall'oggetto restituito dalla chiamata.
Interpretazione valori
Come si vede in figura, vengono visualizzati 4 valori. Due di temperatura (T) e due di umidità (U).
I valori sulla sinistra del display, con le icone convergenti, rappresentano i valori locali. Quelli sulla destra sono i valori rilevati tramite API nella località remota prescelta.
Conclusioni
In questa lezione abbiamo completato la realizzazione della mini stazione meteo utilizzando i concetti e le conoscenze apprese nelle lezioni precedenti.
Questo ci ha permesso di integrare in un unico circuito e progetto il sensore DHT11 e il display LCD.
Dopo di ciò, abbiamo esteso il codice della stazione meteo, tramite una libreria python, aggiungendo così la capacità di visualizzare dati ambientali sia locali che provenienti da una località remota.