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"

