Realizzare una stazione meteo con Arduino e Raspberry pi

Qualche tempo fa ho acquistato una Raspberry pi da collegare alla tv e usare principalmente come media server con Raspbian e Kodi. Dopo qualche giorno però mi sono chiesto come potessi sfruttarla al meglio e considerando che avevo anche una scheda Arduino in un cassetto, ho pensato di unire le due cose e costruire una piccola stazione metereologica! Per far ciò ho dovuto innanzitutto acquistare qualche sensore per rilevare i parametri metereologici ed in particolare la mia scelta è ricaduta su un sensore di temperatura ed umidità DHT11, e uno di pressione armosferica BMP180. Ho scelto di prendere entrambi della Sunfounder un pò per la marca, un pò perchè ogni sensore è dotato di un suo prestampato con un connettore di facile utilizzo e un pò perchè erano gli unici a beneficiare della spedizione prime su Amazon…

Una volta arrivati i sensori, il passo successivo è stato quello di scrivere lo sketch Arduino per leggere i valori. Per far ciò ho dovuto reperire online le librerie opportune per interfacciare la scheda con i sensori e qualche esempio da cui prendere spunto. Successivamente mi sono chiesto come sfruttare la connettività della Raspberry e l’idea che mi è venuta è stata quella di far caricare tutte le letture su Thingspeak.com, un sito che fornisce una piattaforma di raccolta dati per i dispositivi Internet of Things. Per far ciò ho scritto uno script in python.

L’ultimo passo per completare il tutto è stato far parlare tra loro le due schede e a questo scopo ho sfruttato la connessione seriale attraverso il cavo USB. In poche parole lo script python, che gira sulla Raspberry, richiede i valori inviando dei comandi testuali ad Arduino che risponde con i relativi valori, e poi il tutto viene inviato a Thingspeak. Per finire ho creato un cronjob sulla Rasperry per eseguire lo script ogni ora ed avere così un monitoraggio molto dettagliato.

Ma andiamo un pò più nel dettaglio e diamo uno sguardo al codice. Quello che segue è lo sketch Arduino:


#include <dht.h>
#include <Wire.h>
#include <Adafruit_BMP085.h>

#define DHT11_PIN 7
Adafruit_BMP085 bmp; dht DHT;

void setup() { Serial.begin(9600); }

void loop() {
  short temperature, humidity, pressure; char input;

  if (Serial.available()){ 
    input = Serial.read();
    bmp.begin(); DHT.read11(DHT11_PIN);

    if (input == 'T') {
      // temperatura media tra le letture dei due sensori
      temperature = (DHT.temperature + bmp.readTemperature()) / 2;
      Serial.print(temperature);
    } 
    else if (input == 'H') {
      // umidità arrotondata all'intero più vicino
      humidity = (int)(DHT.humidity + 0.4);
      Serial.print(humidity);
    } 
    else if (input == 'P') {
      // pressione in millibar arrotondata all'intero più vicino
      pressure = (int)((bmp.readPressure() / 100.0) + 0.49);
      Serial.print(pressure);
    }
  }
}

Questo invece è lo script python:


import http.client, urllib.parse, serial  #python 3

ser = serial.Serial("/dev/ttyACM0", 9600, timeout=1)

ser.write(b'T'); 
temperature = int(ser.read(3))  #leggo la temperatura
ser.write(b'H'); 
humidity = int(ser.read(3))  #leggo l'umidità
ser.write(b'P'); 
pressure = int(ser.read(3))  #leggo la pressione

params = urllib.parse.urlencode({"field1": temperature, "field2": humidity, "field3": pressure, "key":"XXXXXXXXXXXXXXXX"})
headers = {"Content-typZZe": "application/x-www-form-urlencoded", "Accept": "text/plain"}
conn = http.client.HTTPConnection("api.thingspeak.com:80")
try:
  conn.request("POST", "/update", params, headers); response = conn.getresponse()
  if(response.status == 200): print("Data logged successfully"); conn.close()
except:
  print("Errore di connessione")

Come vedete entrambi sono molto semplici. Lo sketch Arduino non fa altro che ascoltare sulla porta seriale uno dei comandi e rispondere con il corrispondente valore letto dal sensore: “T” per la temperatura, “H” per l’umidità e “P” per la pressione atmosferica. Lo script python invece dopo aver chiesto i tre valori effettua una richiesta HTTP al sito Thingspeak in cui invia i dati in formato JSON. Successivamente sarà Thingspeak a preoccuparsi di visualizzare graficamente i dati secondo le impostazioni del nostro canale.

A questo indirizzo potete quindi vedere i grafici dell’andamento della temperatura, umidità e pressione nel mio salotto! Come dicevo in precedenza per far effettuare le misurazioni ogni ora in autonomia ho configurato un semplice cronjob sulla Raspberry che invoca lo script python. Per far ciò basta usare il comando “crontab -e” ed inserire una riga nel formato tipico di crontab che potete consultare a quest’altro indirizzo. Nel mio caso:

0 * * * *  python  /home/nicola/Thingspeak.py

E questo è tutto. Se volete, fatemi sapere cosa ne pensate nei commenti!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *