Introduction: GreenDuino

Il progetto GreenDuino ha come obiettivo la realizzazione di una stazione di analisi della qualità dell'aria basata sulla piattaforma open-hardware Arduino. Il progetto prevede delle attività sperimentali che sfruttano l'elettronica educativa, il making per costruire oggetti e strumenti per rilevare dati dalla realtà circostante, analizzarli e interpretarli.

E' prevista la prototipazione di uno strumento per acquisire valori ambientali quali temperatura, livello di rumore, qualità dell’aria e il progetto software che si occupi, sfruttando appositi moduli aggiuntivi per la comunicazione, di inviare i dati rilevati online.

Il progetto è utile per incentivare la cultura ambientale: la raccolta dei dati ambientali e la loro contestualizzazione aiuterà a incrementare la consapevolezza del rispetto, della conservazione e della valorizzazione del patrimonio naturalistico e ambientale.

Step 1: Installazione Componenti

Per realizzare il sistema di monitoraggio ambientale, rilevare la qualità dell'aria ed il rumore ambientale sono necessari i seguenti componenti:

  • Scheda NodeMCU ESP8266 WiFi
  • Sensore SDS011 qualità dell’aria (polveri sottili PM10 e PM2.5)
  • Sensore temperature e umidità DHT22
  • Sensore KY-037 di suono
  • Cavi di collegamento (x10)
  • Cassetta protettiva per esterni

Alla scheda NodeMCU ESP8266 WiFi è necessario collegare il sensore di suono KY-037 per rilevare il rumore ambientale, il sensore di temperatura e umidità DHT22 e un sensore della qualità dell'aria per misurare le polveri sottili presenti (PM10 e PM2.5).

Nelle immagini allegate, è possibile visionare lo schema di montaggio, le foto dei sensori e dei collegamenti con la scheda centrale con tutti i passaggi per replicare il sistema.

  • Passaggio 1: montaggio sensore SDS011 sulla scheda NodeMCU
  • Passaggio 2: montaggio sensore DHT22 sulla scheda NodeMCU
  • Passaggio 3: montaggio sensore KY-037 sulla scheda NodeMCU
  • Passaggio 4: montaggio di tutti i componenti all'interno una scatola protettiva per esterni su cui sono stati praticati dei fori per ogni sensore e aggiunte delle griglie di protezione

Step 2: Sviluppo Software E Invio Dei Dati Online

Una volta collegati tutti i componenti, è necessario sviluppare il codice da caricare sulla scheda Node MCU ESP8266 WiFi. La prima parte della programmazione software riguarda l'acquisizione dei dati rilevati dai sensori di temperatura e umidità dell'aria (DHT22), dal sensore di polveri sottili PM2.5 e PM10 (SDS011) e dal sensore di suono (KY-037) per rilevare i rumori ambientali.

La fase successiva prevede la connessione della scheda alla rete WiFi e l'invio dei dati online alla piattaforma ThingSpeak,utilizzando le API messe a disposizione dal servizio. I dati vengono trasmessi ogni 20 secondi, offrendo un monitoraggio praticamente in tempo reale.

Per la compilazione e il caricamento del software, è necessario procedere con l’installazione dell'IDE di Arduino e con la configurazione della scheda Node MCU ESP8266, oltre che aggiungere le librerie necessarie per comunicare con i sensori. La procedura da seguire è la seguente:

  • installazione dell'IDE di Arduino scaricabile all’indirizzo https://www.arduino.cc/en/Main/Software
  • installazione dell'Add-on della scheda ESP8266 nell'IDE di Arduino:
    • dalla schermata principale andare su File -> Impostazioni e inserire la stringa "http://arduino.esp8266.com/stable/package_esp8266com_index.json" nel campo "URL aggiuntivo per il Gestore Schede". Confermare con il pulsante "OK"
    • sempre all’interno dell'IDE di Arduino, andare su Strumenti -> Scheda -> Gestore schede, cercare la stringa ESP8266 e procedere con l’installazione della scheda ESP8266 by ESP8266 Community
    • in Strumenti -> Scheda selezionare la scheda Node MCU 1.0 (ESP-12E Module)
  • installazione della libreria per il sensore DHT22:
    • in Strumenti -> Gestione librerie cercare la stringa DHT22 e procedere con l’installazione della libreria DHT sensor library by Adafruit
    • in Strumenti -> Gestione librerie cercare la stringa Adafruit Unified Sensor e procedere con l’installazione della libreria Adafruit Unified Sensor by Adafruit
  • installazione della libreria per la gestione del sensore SDS011:
    • in Strumenti -> Gestione librerie cercare la stringa SDS011 e procedere con l’installazione della libreria SDS011 sensor library by R. Zschiegner
  • installazione della libreria per la gestione della comunicazione con il server ThingSpeak:
    • in Strumenti -> Gestione librerie cercare la stringa ThingSpeak e procedere con l’installazione della libreria ThingSpeak by Mathworks

I parametri di configurazione per la connessione WiFi e per la comunicazione con il canale ThingSpeak vanno inseriti in un file "secrets.h" all'interno della stessa directory del file .ino.

#define SECRET_CH_ID 0000000	  // sostituire 0000000 con l'ID del canale
#define SECRET_WRITE_APIKEY "XYZ" // sostituire XYZ con la API Key del canale
#define SECRET_SSID "MySSID"      // sostituire MySSID con il SSID della rete WiFi
#define SECRET_PASS "MyPassword"  // sostituire MyPassword con la password WiFi

Si riporta il codice sorgente (file .ino) del dispositivo sviluppato in linguaggio simile al C/C++. Una volta compilato e caricato sulla scheda, i dati possono essere visualizzati sul monitor seriale o direttamente sul canale ThingSpeak.

#include <DHT.h>                  //Libreria Sensore Temperatura e Umidita'
#include <SDS011.h>               //Libreria Sensore Polveri Sottili pm 2.5 e pm 10.0
#include "ThingSpeak.h"           //Libreria invio dati al sito web ThingSpeak
#include "secrets.h"              //Libreria rilevazione delle password per l'accesso wifi
#include <ESP8266WiFi.h>          //Libreria sensore wifi della scheda
#define DHTPIN D7                //Costante del pin digitale D7 per l'acquisizione della Temperatura e l'Umidita'
#define DHTTYPE DHT22            //Costante DHT22 nome del sensore

DHT dht(DHTPIN, DHTTYPE);
SDS011 my_sds;

char ssid[] = SECRET_SSID;   //Nome della rete
char pass[] = SECRET_PASS;   //Password della rete
int keyIndex = 0;
WiFiClient  client;
unsigned long myChannelNumber = SECRET_CH_ID;
const char * myWriteAPIKey = SECRET_WRITE_APIKEY;

//Inizializziamo i valori da rilevare tramite i sensori
float temperatura = 0;
float umidita = 0;
float pm2_5 = 0;
float pm10 = 0;
int decibel = 0;
String stato = "Dati aggiornati";

void Temperatura(){
    temperatura=dht.readTemperature(); //Assegna la Temperatura
    Serial.println("Temperatura' " + String(temperatura));  //Stampa Temperatura
}

void Umidita(){
    umidita=dht.readHumidity();   //Assegna l'Umidita'
    Serial.println("Umidita' " + String(umidita));  //Stampa Umidita'
}

void Polveri_sottili(){
    int error;
    error = my_sds.read(&pm2_5,&pm10);
    if (!error){                              //Controlla se e' presente un errore
      Serial.println("P2.5: "+String(pm2_5)); //Stampa pm2.5
      Serial.println("P10:  "+String(pm10));  //Stampa pm10
    }
    else
     Serial.println("Errore polveri sottili."); //Stampa errore quando la rilevazione non e' andata a buon fine
}

void Suono(){
    unsigned long picco=0;        //Inizializzazione del valore di picco
    for(int i=0; i<1000; i++){    //Trova controllando 1 secondo il sensore il valore di picco
      int valore=analogRead(A0);  //Rileva dall'entrata analogica il suono
      if(valore>picco){           //Restituisce il valore di picco
        picco=valore;
      }
      delay(1); //Aspetta un millisecondo
    }
    decibel=picco*4.524-2549.156;   // Calibrazione del sensore
    if(decibel<=25) decibel=25;     //Limite intervallo di acquisizione
    if(decibel>=120) decibel=120;
    Serial.println("Picco: " + String(picco));  //Stampa valore di picco
    Serial.println("Decibel: " + String(decibel));     
}

void setup() {
  Serial.begin(9600);       //Velocita' trasmissione scheda
  dht.begin();              //Velocita' trasmissione dati dal sensore di temperatura
  my_sds.begin(D1, D2);    //D1 va su TX di SDS011, D2 va su RX di SDS011
  WiFi.mode(WIFI_STA);
  ThingSpeak.begin(client); //Inizializziamo ThingSpeak
}

void loop() {
  //Collegamento alla rete WiFi 
  if(WiFi.status() != WL_CONNECTED){
    Serial.print("In attesa di collegamento WiFi: ");
    Serial.println(SECRET_SSID);
    while(WiFi.status() != WL_CONNECTED){
      WiFi.begin(ssid, pass);     //collegamento a una rete di sicurezza WPA/WPA2
      Serial.print(".");
      delay(5000);     
    } 
    Serial.println("WiFi connesso.");
  } 
  
  //Settiamo i valori acquisiti in precedenza
  Temperatura();
  Umidita();
  Polveri_sottili();
  Suono();
  ThingSpeak.setField(1, temperatura);
  ThingSpeak.setField(2, umidita);
  ThingSpeak.setField(3, pm2_5);
  ThingSpeak.setField(4, pm10);
  ThingSpeak.setField(5, decibel);
  ThingSpeak.setStatus(stato);    //Settiamo lo stato
  
  
  //Scriviamo sul canale di ThingSpeak 
  int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
  if(x == 200){
    Serial.println("Aggiornamento del canale avvenuto con successo.");
  }
  else{
    Serial.println("Problema con l'aggiornamento del canale. Codice errore HTTP: " + String(x));
  }
  delay(20000); //Attende 20 secondi prima di aggiornare nuovamente il canale con i nuovi dati in ingresso
}

Step 3: Configurazione Della Piattaforma Online

I dati acquisiti dai sensori (pm 2.5, pm 10, umidità, temperatura e rumori ambientali) vengono visualizzati sulla piattaforma online ThingSpeak . Come primo passo è opportuno creare un account sulla piattaforma e configurarla opportunamente in funzione del layout desiderato. Si possono inserire grafici o oggetti per facilitare l'interpretazione dei dati e avere uno storico degli stessi. Con l'impostazione delle soglie, è possibile evidenziare i livelli di qualità dell'aria e del rumore ambientale non accettabili. Al canale sono stati assegnati dei tags per facilitarne la ricerca all'interno del portale. Per inviare i dati sul canale è necessario recuperare l'ID e la API Key dalle impostazioni dello stesso canale ed inserirli nel file "secrets.h".

Il canale è accessibile al seguente link: canale ThingSpeak "Qualità dell'aria di Tursi"