Come controllare la temperatura di terrari a distanza

Tenere d’occhio le temperature è estremamente importante quando si allevano urodeli, in quanto sono particolarmente sensibili alle alte temperature ed essere in grado di controllare rapidamente le temperature in remoto è non solo incredibilmente facile grazie all’IoT, ma diminuirá alcune delle preoccupazioni principali del lasciare gli animali per un lungo periodo di tempo per le vacanze.

Alcune soluzioni con sensori di temperatura con WiFi esistono già e sono prontamente disponibili online, ma quello che volevo era qualcosa che non solo mi dicesse la temperatura, ma registrasse anche le informazioni per future analisi dei dati, quindi ho deciso di costruirmelo da me.

Questo tutorial si basa su questo tutorial di Allan Schwartz che invito tutti a leggere in quanto è la base di questo tutorial. Nel tutorial qui sotto troverai alcune modifiche al codice che ho trovato necessario per farlo funzionare piú facilmente, così come i passaggi mancanti, in modo che tu possa seguire il tutorial anche se non hai familiarità con coding, Raspberry Pi o API di Google.

Materiali:

Ecco la lista dei materiali di cui avrai bisogno. Ho incluso i nostri link Affiliati di Amazon per semplicitá, ma ognuno di questi materiali puó essere trovato anche a meno su eBay, Aliexpress o negozi specializzati in Raspberry Pi/eletronica, quindi controlla in giro per trovare i prezzi migliori.

  • Componenti minimi necessari:
    • Raspberry Pi Zero W (€15): Questo piccolo Raspberry Pi costa sui €15 a seconda di dove lo prendete. Io ho deciso di comprare la versione con i pin della GPIO giá saldati (WH) che, mentre costa qualche euro in piú, non ho bisogno di saldare pin direttamente sul Raspberry Pi.
    • Micro SD Card (€3/10): Qualsiasi scheda va bene, ma probabilmente vuoi almeno 8GB.
    • BME280 chip (€1/10): Il prezzo di questo chip varia molto a secondo di dove lo compare, quindi controlla in giro ma accertati che non compri il chip BMP280 per errore.
    • GPIO Jumper cables (€1/6): Avrai bisogno di 4 cavetti, ma questi vengono di solito venduti in gruppi di 10/20/40, quindi devi fare solo un acquisto per piú progetti. Per il mio setup ho usato 4 cavetti Femmina-a-Femmina, ma potresti dover usare Machio-a-Maschio o Maschio-a-Femmina a secondo del tuo setup.
    • Alimentatore (€5): Avrai bisogno di un cavetto microUSB e un alimentatore. Se non hai un caricatore per telefono in piú, dovrai comprarne uno.
  • Accessori raccomandati: Cose di cui avrai bisogno ma puoi usare piú volte in futuro
    •  Pi Zero Starter Kit (~€5): Per poter connettere il Pi ad un monitor, tastiera e mouse avrai bisogno di un adattatore MicroHDMI a HDMI e MicroUSB a USB. Puoi comprare questi pezzi indipendentemente o come parte di un kit, che di solito contiene anche una custodia protettiva per il Raspberry Pi che puó sempre tornare utile.
    • USB Hub (~€5): Dato che il Pi ha solo una porta MicroUSB, avrai bisogno di una multipresa nel caso vuoi collegare sia un mouse che tastiera.
    •  Saldatore a stagno (€20): Avrai bisogno di un saldatore per collegare i pin al Raspberry Pi e chip. Se non ti senti sicuro nel saldare, puoi comprate un Raspberry Pi e Chip con pin giá saldati.

Connessione:

Connetti il BME280 e Raspberry Pi seguendo il diagramma in basso.

Da tener presente, dato che questi chip sono prodotti da vari produttori, l’ordine dei pin sul chip puó essere diverso.

Nel mio caso per esempio, il pin 3.3v pin era indicato come VCC, mentre ci sono 2 extra pin che non sono necessari per questa applicazione, e possono essere ignorati. Assicurati che i pin e la connessione siano giusti.

Connessione dei cavetti con il mio chip. Per via dei diversi produttori, l'ordine dei pin sul tuo chip potrebbe essere diverso.
Connessione dei cavetti sul Raspeberry Pi Zero W (all'interno di una protezione che era inclusa nel Starter Kit.)

Configurazione I2C:

Il BME280 si connette al Raspberry Pi tramite I2C. Come primo passo, dobbiamo attivare I2C tramite l’interfaccia di Configurazione del Raspberry Pi. 

Poi, april il terminale e copia e incolla questi comandi in modo da installare gli i2c-tools.

sudo apt-get update
sudo apt-get install -y python-smbus i2c-tools

Infine, reboot il Raspberry Pi. 

A questo punto, se eseguiamo il comando i2cdetect -y 1 nel terminale, dovremmo essere in grado di vedere il chip, come nell’immagine in basso. Se il chip non compare come nel’immagine, puó esserci un problema con il chip o la saldatura. La prima volta che ho provato, la saldatura non era fatta bene, e quindi non c’era connessione col chip. 

Configurare il BME280:

Per poter usare il sensore BME280, devi installare il codice che ti permette di leggere e decodificare il sensore. In modo da leggere il sensore, utilizzeremo il package trovato a https://github.com/cmur2/python-bme280.

In modo da installare questo pacchetto, esegui questo comando nel terminale. 

git clone https://github.com/cmur2/python-bme280.git

Dopo che comando é stato eseguito, dovresti trovare una nuova cartella nella tua home chiamata python-bme280. Dentro questa cartella ci sono tutte le informazioni di cui hai bisogno per leggere il sensore, e puoi testarlo tramite il file demo.py. In modo da eseguire il file, aprite il terminale in questa cartella, tramite l’opzione Tools nella cartella, o usando il comando cd python-bme280, ed esegui il comando:

python demo.py

Se tutto é andato bene fin’ora, dovresti vedere questo risultato:

Lettura del sensore (in questo particolare caso, il chip é un BMP280, cha non ha la funzione di leggere l'umiditá, risultando in un valore di 0%)

NB: quando compri il sensore, assicurati di non comprare il chip BMP280 invece che BME280. Il chip BMP280 é piú economico ma manca il sensore per l’umiditá. I 2 chip sono molto simili, ed a giudicare dai post nei forum, quando si comprano versioni economiche del BME280, c’é il rischio di essere venduti il BMP280.

Nel mio caso, pensavo di aver comprato il sensore BME280, ma in realtá ho comprato il BMP280 per errore, che non misura umiditá. Per la mia applicazione, l’umiditá non é importante, quindi non é un problema, ma assicurati di non fare lo stesso errore se hai bisogno di sapere l’umiditá.

Connettersi con Google Sheets:

Siamo adesso in grado di leggere le informazioni dal sensore, quello che dobbiamo fare adesso é mandare queste informazioni a Google Sheet, e per poterlo fare dobbiamo attivare Google Sheet API. 

  1. Vai a https://console.developers.google.com/ e crea un nuovo progetto.
  2. Una volta che hai creato un nuovo progetto, vai all API Library e attiva Google Sheets API.
  3. Una volta che hai attivato Google Sheets API, vá in Credenziali nel menú a destra e clicca su CREA CREDENZIALI.
  4. Le credenziali che devi creare é indicata come “Service account”.
  5. Una volta create, se vai a modificarle e crea una nuova chiave. Ti verrá data l’opzione di scaricare un file contenente la chiave. Scarica la chiave in formato JSON e rinominala bme280-key.json. Prendi questo file e spostalo nella cartella python-bme280
  6. A questo punto, vá nel tuo Google Drive e crea un nuovo file con Google Sheet. Questo file verrá usato per registrare le letture del sensore. Per finire, assicurati di condividere il file con l’opzione “Chiunque col link puó modificare”.

A questo punto, hai creato un API account, attivato le Google Sheets API, e scaricato la chiave che permetterá al Raspberry Pi di inviare informazioni a Google Sheets

*La mia interfaccia di Google é in Inglese, quindi non ho potuto controllare come Google chiama in italiano i comandi menzionati in questa sezione, ma li ho tradotti in italiano quanto piú letteralmente possibile.

Crea il codice in Python per registrare le letture del BME280 in Google:

Ci siamo quasi, ora che possiamo leggere il sensore, dobbiamo creare il codice the permette di mandare queste letture as un Google Sheets.

Come primo passo, apri il terminale ed esegui questo comando:

pip install --upgrade google-api-python-client oauth2client

Poi, usa Thonny (pre-installato sul tuo Raspberry Pi) per creare un file chiamato bme280-reading.py nella cartella python-bme280 e incolla questo codice:

#-*- coding: utf-8 -*-
# import many libraries
from __future__ import print_function  
from googleapiclient.discovery import build  
from httplib2 import Http  
from oauth2client import file, client, tools  
from oauth2client.service_account import ServiceAccountCredentials  
import bme280  
import datetime

# My Spreadsheet ID ... Questo é il codice del file gsheet, puoi trovarlo nell' url
MY_SPREADSHEET_ID = 'SpreadsheetID'
#My Sheet Name ... Questo é il nome del foglio di lavoro dove vuoi registrare le letture
MY_SHEET_NAME = 'SheetName'

#Questa funzione si prende cura di mandare il risultato della funzione main a Google Sheet
def update_sheet(sheetname, temperature, pressure, humidity):  
    # Qui é dove avviene l'autorizzazione. Assicurati che il nome della chiave é bme280-key.json
    SCOPES = 'https://www.googleapis.com/auth/spreadsheets'
    creds = ServiceAccountCredentials.from_json_keyfile_name( 
            'bme280-key.json', SCOPES)
    service = build('sheets', 'v4', http=creds.authorize(Http()))

    # Chiama Sheets API, appende la prossima linea di dati del sensore
    # values é la schiera di valori, é un'unica linea
    values = [ [ str(datetime.datetime.now()), 
        temperature, pressure, humidity] ]
    body = { 'values': values }
    # chiama l'API e performa l'operazione
    result = service.spreadsheets().values().append(
                spreadsheetId=MY_SPREADSHEET_ID, 
                range= MY_SHEET_NAME+'!A1:D1',
                valueInputOption='USER_ENTERED', 
                insertDataOption='INSERT_ROWS',
                body=body).execute()                     

#Questa funzione prende la lettura dal BME280 e la manda a Google Sheet
def main():  
    bme = bme280.Bme280()
    bme.set_mode(bme280.MODE_FORCED)
    tempC, pressure, humidity = bme.get_data()
    pressure = pressure/100.
    print ('Temperature: %f °C' % tempC)
    print ('Pressure: %f hPa' % pressure)
    print ('Humidity: %f %%rH' % humidity)
    
    update_sheet(MY_SHEET_NAME, tempC, pressure, humidity)

if __name__ == '__main__':  
    main()


Una volta che hai incollato questo codice, cambia SpreadsheetID con l’ID del tuo Google Sheet file, e SheetName nel nome della tab dove vuoi che le letture del sensore vengano salvate.

A questo punto tutto é pronto. 

Apri il terminale nella cartella python-bme280 ed esegui il comando:

python bm280-reading.py

Se tutto é andato bene, dovresti vedere la lettura del sensore nel tuo Google Sheet, con in ordine: Ora, Temperatura, Pressione ed Umiditá.

Letture Automatiche:

bme280-reading.py puó essere eseguito periodicalmente usando crontab.

Apti crontab usando il comando crontab -e ed aggiungi questo comando alla fine:

*/5 * * * * cd /home/pi/python-bme280 && python bme280-reading.py

La parte */5 del comando istruisce crontab di eseguire il comando ogni 5 minuti. Consiglio di leggere come usare crontab per selezionare l’intervallo di tempo che fa piú al tuo caso.

Formattazione dei dati:

La lettura del sensore sono inviate al foglio di lavoro che hai selezionato, con ogni lettura inserita alla prima linea vuota e disponibile, il che significa che possiamo usare Row 1 per descrivere i valori di ogni colonna.

A questo punto, sei libero di manipolare i dati come piú preferisci. Per esempio io sto usando varie formule per mostrare i valori dell’ultima lettura e cambi Giorno in Giorno per controllare velocemente la situazione dal mio telefono.

Divertiti col tuo nuovo sensore.

Esempio di come i dati possono essere mostrati in Google Sheet.
Come i dati sono registrati in Google Sheet

Sull'Autore...

Josh Coppola
Josh Coppola

Josh Coppola, nato nel 1991 a Salerno, fin da subito sviluppa una passione per animali e la natura in generale, con un interesse particolare verso anfibi e rettili. Si trasferisce a Londra dopo il liceo per conseguire un BSc in Business Studies alla Cass Business School, dovendo rinunciare all’allevamento di animali per 10 anni.

Nel 2017 riprende l’allevamento di caudata, per poi interessarsi anche alla fotografia ma con pessimi risultati.

“Come obiettivo vorrei concentrarmi sulla riproduzione in cattività di specie rare e poco diffuse in terraristica, così da poterle diffondere ed evitare che scompaiono dall’hobby per sempre.”