Progetto di stazione meteo con qualità dell’aria realizzata con Arduino Nano e Display Touch-screen Nextion
Dopo l’ultimo progetto con ESP8266 e Telegram, torniamo a riproporre una versione di stazione meteo basata su Arduino. Questa volta useremo un Arduino Nano e lo collegheremo ad un Display Nextion da 3,5″, adoperando il Touch-screen per monitorare temperatura, umidità, pressione e qualità dell’aria.
Progetto
Il progetto odierno prevedere l’utilizzo di un Arduino Nano collegato ad un Display Nextion da 3,5″, sul quale verranno stampanti i rilevamenti effettuati da due diversi sensori, che abbiamo imparato a conoscere e programmare. Parliamo del sensore BME280 per la temperatura, umidità e pressione, e del sensore CCS811 per i livelli di CO2 e TVOC. Memorizzeremo sulla EEPROM di Arduino Nano i valori rilevati dal BME280 e li rappresenteremo in apposite pagine sul display nei valori minimi e massimi registrati.
Componenti
Come si è avuto modo di evincere, utilizzeremo per la Stazione Meteo Touch-Screen con Nextion Display un Arduino Nano per gestire tutti i sensori e gli attuatori, un sensore BME280 in grado di rilevare temperatura, umidità relativa e pressione atmosferica in variabili a virgola mobile, un sensore CCS811 per rilevare la presenza di anidride carbonica nell’aria in parti per milione e la presenza di composti organici volativi in parti per miliardo.
Tutto verrà stampato su un display Nextion da 3,5″, dotato di touch-screen, che mostrerà nella pagina principale tutti i dati raccolti in tempo reale, mentre digitando sul nome di temperatura, umidità e pressione aprirà delle pagine in cui appariranno i rilevamenti massimi e minimi. Per collegare il tutto abbiamo adoperato una bread-board a 400 fori e dei comunissimi jumper. Per l’occasione, abbiamo alimentato la stazione meteo con un powerbank da 26800mAh.
Lista componenti su Amazon:
- Arduino Nano: https://amzn.to/3nSNyBo
- Display Nextion 3.5″: https://amzn.to/3g14Ysu
- Sensore BME280: https://amzn.to/3kUlQ6o
- Sensore CCS811: https://amzn.to/3kXFTQu
- Bread-board 400 fori: https://amzn.to/35RCWfT
- Jumper: https://amzn.to/2xQpv1U
- Powerbank: https://amzn.to/3m0MbjR
Lista componenti su Aliexpress:
- Arduino Nano: http://s.click.aliexpress.com/e/BqwF16Oc
- Display Nextion 3.5″: http://s.click.aliexpress.com/e/_dYhcuBH
- Sensore BME280: https://s.click.aliexpress.com/e/_9GT7EI
- Sensore CCS811: https://s.click.aliexpress.com/e/_AbKciI
- Bread-board 400 fori: https://s.click.aliexpress.com/e/_AUxLls
- Jumper: https://s.click.aliexpress.com/e/_dYOtlu6
- Powerbank: https://s.click.aliexpress.com/e/_A0V5Xu
Collegamenti
I collegamenti per la Stazione Meteo Touch-Screen con Nextion Display prevedono utilizzo dell’interfaccia I2C per i sensori BME280 e CCS811 e l’interfaccia UART per il Display Nextion. Ricordiamo che l’Arduino Nano sfrutta i pin A4 e A5 per l’interfaccia I2C, tuttavia avendo solo questi due pin (SDA e SCL) non sarà un problema adoperare più componenti. Ogni sensore ha un suo indirizzo, quindi Arduino Nano riuscirà a comunicare con entrambi anche se collegati sugli stessi pin. Il display Nextion richiede che il propio pin RX sia connesso al pin TX di Arduino Nano, mentre il pin TX al pin RX di Arduino. Alimenteremo il display e il sensore BME280 con i 5V, mentre il sensore CCS811 con i 3,3V. Rammentiamoci, infine che il pin WAK del sensore CCS811 va connesso al GND per mantenerlo sempre attivo.
Codice
Prima di caricare il codice della Stazione Meteo Touch-Screen con Nextion Display dobbiamo caricare tramite una Micro-SD il file di programmazione per il Nextion Display, di cui abbiamo trattato in questa GUIDA. Potete scaricare tutto il necessario, compreso lo sketch, a questo LINK. Estraete il file wsnextion.hmi e copiatelo sulla Micro-SD, poi a display spento (basta scollegare il cavo dei 5V) inseritelo nell’apposito alloggio. Accendete il display ed attendete il caricamento, poi estraete la Micro-SD e spegnete nuovamente il display. Mantenete il display spento fino al caricamento del codice su Arduino Nano, altrimenti la comunicazione seriale del display interferirà sul caricamento dello sketch.
Il file wsnextion.hmi contiene 4 pagine, la principale (page 0) in cui vengono stampati i dati di temperatura, umidità, pressione, CO2, TVOC. I titoli di rilevamento temperatura, umidità e pressione sono pulsanti touch che premuti apriranno ognuno una pagina specifica.
In page 1, ad esempio, comparita le temperature massime e minime rilevate. Stesso per umidità (page 2) e pressione (page 3). Basterà premere al centro di ogni pagina secondaria per tornare sulla principale.
Vediamo ora come programmare Arduino Nano in modo da raccogliere i dati e stamparli sul monitor. Partiamo sempre dalle librerie necessarie per l’interfaccia I2C, per il sensore BME280 e per il sensore CCS811, nonché la libreria per attivare la EEPROM di Arduino. Creiamo gli oggetti ccs e bme per gestire gli omonimi sensori, dichiariamo alcune variabili intere, alcune vuote che ospiteranno i rilevamenti, altre con un valore preciso che useremo come riferimento per la comparazione coi i rilevamenti. Creiamo una stringa vuota (data) per inviare al display Nextion i dati tramite monitor seriale.
#include <BME280I2C.h> #include <Wire.h> #include "Adafruit_CCS811.h" #include <EEPROM.h> Adafruit_CCS811 ccs; BME280I2C bme; int co2, tvoc, tmax, umax, pmax, p; int tmin = 50; int umin = 101; int pmin = 1100; float temp, hum, pres; String data = "";
Nel VOID SETUP avviamo il monitor serial, il sensore BME280, il sensore CCS811 e attendiamo che questo si inizializzi.
Serial.begin(9600); Wire.begin(); bme.begin(); ccs.begin(); while(!ccs.available()){ Serial.print("."); delay (1000); }
Il VOID LOOP si apre leggendo i dati dai due sensori e convertiamo la pressione in Pascal a virgola mobile in milliBar a cifra intera, per facilmente memorizzare il numero sulla EEPROM.
ccs.readData(); bme.read(pres, temp, hum); co2 = ccs.geteCO2(); tvoc = ccs.getTVOC(); p = pres/100;
Procediamo comparando la temperatura rilevata con i valori minimi e massimi, memorizzando la variazione su uno specifico indirizzo della EEPROM. Mostriamo qui in basso l’esempio della temperatura, chiarendo che lo stesso procedimento è stato adoperato per umidità e pressione.
if (temp > tmax) { tmax = temp; EEPROM.write(0, temp); } if (temp < tmin) { tmin = temp; EEPROM.write(1, temp); }
Inviamo poi tutti i dati raccolti tramite monitor seriale al display Nextion. Ogni valore è destinato ad una specifica destinazione, ovvero ad una casella di testo che riceverà di dati sotto forma di stringa e li mostrerà ogni mezzo secondo.
data = "temp.txt=\"" + String(temp) + "\""; Serial.print(data); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); data = "umid.txt=\"" + String(hum) + "\""; Serial.print(data); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); data = "pres.txt=\"" + String(pres/100.00) + "\""; Serial.print(data); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); data = "co2.txt=\"" + String(co2) + "\""; Serial.print(data); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); data = "tvoc.txt=\"" + String(tvoc) + "\""; Serial.print(data); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); // Invio i dati alla Page 1 del Nextion data = "temp2.txt=\"" + String(tmax) + "\""; Serial.print(data); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); data = "temp1.txt=\"" + String(tmin) + "\""; Serial.print(data); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); // Invio i dati alla Page 2 del Nextion data = "umi1.txt=\"" + String(umin) + "\""; Serial.print(data); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); data = "umi2.txt=\"" + String(umax) + "\""; Serial.print(data); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); // Invio i dati alla Page 3 del Nextion data = "p1.txt=\"" + String(pmin) + "\""; Serial.print(data); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff); data = "p2.txt=\"" + String(pmax) + "\""; Serial.print(data); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff);
Carichiamo il codice su Arduino Nano, selezionando la scheda e la porta corretta, poi colleghiamo il display Nextion all’alimentazione per vedere i dati rilevati. Per i primi minuti i valori massimi e minimi di temperatura, umidità e pressione coincideranno, ma alle prime sensibili variazioni noteremo i valori massimi e minimi.