• Home
  • Stazione Barometrica completa con Wemos

Costruzione stazione barometrica

In questa guida voglio spiegare come costruire una stazione barometrica questa volta utilizzando una scheda WeMos D1 R2 già integrata con il Wifi ESP8266 e con il classico sensore BME280. Inoltre da normale stazione barometrica aggiungo anche i sensore ccs811 per la misurazione del Co2, un BH1750 per la misurazione dell’intensità luminosa Lux e un VEML6070 per un precisissimo indice UV ed un sensore pioggia YR-83.

Tutti questi sensori li vedremo un ad uno. Riporto anche i sensori già visti nelle altre guide “Costruisci”.

Scheda microcontrollore WeMos D1 R2 con Wifi e BT

Proviamola! Arduino Meteo, a parte il nome, non sta dalla parte di nessuno ed è sempre alla ricerca di nuove tecnologie. Il Modulo WeMos D1 è basato sul microcontrollore Wi-Fi ESP8266 ESP-12F che può essere programmato utilizzando l’IDE di Arduino oppure NodeMCU. La semplicità della programmazione che può essere effettuata anche in modalità wireless e l’ampia disponibilità di shield aggiuntivi permettono di sviluppare il proprio progetto di “Internet delle cose” in tempi estremamente rapidi. Il modulo WeMos D1 è dotato di una interfaccia USB realizzata tramite il convertitore seriale-USB CH340, dal connettore USB viene anche prelevata l’alimentazione a 5V, un regolatore interno tipo RT9013 si occupa di generare l’alimentazione a 3,3V per il modulo ESP-12F.  Nota: Tutti gli I/O supportano una tensione massima di 3,3V ed ecco perchè la scelta di quei sensori. Sensori funzionanti tutti a 3.3V e con protocollo I2C

Sensore Gy-bme280 3.3v (Già Visto)

Il Sensore di Pressione GY-BME280 è in grado di misurare la pressione barometrica, l’umidità e la temperatura permettendo di realizzare una stazione metereologica completa utilizzando un singolo sensore.
Il GY-BME280 misura la pressione atmosferica da 30kPa a 110 kPa, la temperatura da -40°C a +85°C e l’umidità da 0 a 100%RH.
Il sensore viene alimentato a 3,3Vcc ed il segnale in uscita è disponibile tramite bus I2C ( Anche di questo ci occuperemo durante l’implementazione ). Vedete dall’immagini 6 pin ma in realtà noi ne utilizzeremo 4.

Caratteristiche tecniche:

  • Alimentazione a 3,3Vcc
  • Comunicazone I2C
  • Gamma di misura della pressione da 30.000Pa a 110.000Pa con una risoluzione fino a 12Pa
  • Gamma di misura della temperatura da -40°C a +85°
  • Gamma di misura dell’umidità da 0 a 100%RH con una risoluzione uguale o inferiore al 3% (da 20%RH a 80%RH
  • Misure di altitudine da 0 a 9.200m con una precisone di 1m a livello del mare e di 6,6m a 9.200m

Sensore di Qualità dell'Aria con CCS811 (Già Visto)

Questo è un magnifico sensore di una precisione incredibili che misura i liveli di eCO2 e TVOC ( Composti organici volatili ) che sono Clorofluorocarburi e clorocarburi, Benzene, Cloruro di metilene, Percloroetilene,Metil-terz-butil etere,Formaldeide. Tutte sostanze cancerogene e tumorali per la salute umana. Anche le pitture che date in casa nel lungo tempo rilasciano determinati composti VOC. Infatti dove lavoro hanna creato ecoPitture Italiane www.ecopittureitaliane.it VOC Free cioè dove non sono presenti questi composti volatili. Dopo essere stato collegato al microcontrollore tramite una interfaccia I2C restituirà una lettura totale dei composti organici volatili (TVOC) e una lettura dell’ anidride carbonica equivalente (eCO2).
Allinterno del Il CCS811 sono presenti il sensore e un piccolo microcontrollore che controlla l’alimentazione, si occupa della conversione analogico-digitale e fornisce l’interfaccia I2C.
Il sensore misura la concentrazione eCO2 entro una gamma compresa tra 400 e 8192 parti per milione (ppm) e la concentrazione TVOC (Totale del composto organico volatile) entro una gamma compresa tra 0 e 1187 parti per miliardo (ppb).

Sensore di luminosità BH1750

Il Sensore di luce digitale BH1750 si presenta con basetta portacontatti a 5 poli da saldare. E’ un ottimo sensore per la misurazione dell’intensità luminosa nell’unità di misura Lux. Vediamo un pò di dati tecnici:

  • Intervallo di dati: 0 a 65535 lux
  • Tensione d’esercizio: da 3 a 5 V c.c.
  • Connessioni accessibili tramite basetta portacontatti a 5 pin (RM 2,54 mm)
  • Fori di fissaggio: 2,8 mm
  • Dimensioni: 18,5 x 13,5 x 2,3 mm
  • Comunicazione I2C (SDA SCL)

Detto questo la sua installazione I2C è la classica ed è molto semplice anche a livello di codice leggere i valori. Consiglio una tensione a 3.3 V

Sensore di Uv VEML6070

Questo piccolo sensore è ottimo per integrare il rilevamento della luce UV a qualsiasi progetto. Il VEML6070 è un vero sensore di luce UV A e un ADC controllato da I2C (SDA SCL) che
leggerà il vero UV da ~ 60ms a 500ms a seconda della precisione che vogliamo. Più nelle impostazioni aumentiamo il valore e più preciso sara l’indice UV. Ma io che l’ho testato con un valore medio è già nella perfezione.

A differenza dell’ ml8511 che ho sempre usato e dell’analogo Si1145, questo sensore non fornisce letture dell’indice UV.
I Sensori ml8511 e Si1145 eseguono approssimazioni dell’indice UV in base al livello di luce e non al vero rilevamento UV.
Al contrario, il VEML6070 ha un vero sensore di luce nello spettro UV.
Ha anche un’interfaccia I2C molto più semplice.

Vi rimando ad un link che spiega benissimo le caratteristiche: https://www.vishay.com/docs/84310/designingveml6070.pdf

A senconda dei tempi T1 – T2 – T4 e del sensore che prendete, nel mio caso un R = 270, nel PDF mostra il range di valori e l’indice uV Corrispondente. Così tutti vedrete di che precisione è questo piccolo sensore.

 

Sensore di pioggia YR-83

Questo sensore il YR-83 è un sensore di pioggia economico e molto funzionale da tutti i test che ho eseguito. Mostra la percentuale dell’intensità semplicemente se il sensore è più bagnato, più il voltaggio tende a 0. In questo modo capiamo l’intensità in percentuale della pioggia. Basta regolare bene il potenziometro.

Se cercate in internet e come vedrete voi stessi ha due uscite una analogica e una digitale chiamate A0 e D0. Sull’analogica da la tensione e quindi riusciamo a calcolare l’intensità della pioggia sulla digitale da semplicemente 0 o 3.3/5V se piove o no. Io ho utilizzato l’analogica A0.

Schema di collegamento di tutti i componenti

Mi scuso fin da ora della confusione che potrebbe fare l’immagine ma è la prima volta utilizzo FritZing. Sicuramente migliorerò il progetto. NOTA BENE: Per procedere bisogna installare in “Gestioni Schede” sull’ide di Arduino la scheda Wemos, troverete tutta la lista. Un volta fatto come scheda selezionate “LAOLIN(WEMOS) D1 R2 & mini” e cambiate L’upload speed a 115200. Inoltre per programmarla i pin D3 e D8 devono essere collegati a GNU solo durante upload dello scretch. Poi si tolgono e si preme il tasto reset sulla scheda.  Ecco un Screen Shot delle impostazioni della scheda.

Questo lo schema dei collegamenti della nostra stazione barometrica:

Ed Ora passiamo al codice per far funzionare il tutto:

#include <ESP8266WiFi.h>
#include <Wire.h>
#include "Adafruit_VEML6070.h" // UV INDEX
#include <Adafruit_BME280.h> //TEMP PRESS UMID
#include <BH1750FVI.h>// LIBRERIA SENSORE SOLARE
#include "Adafruit_CCS811.h" // Co2
#include <HygrometerSensor.h> // LIBRERIA

char ssid[] = "XXXXXXXX"; 
char pass[] = "XXXXXXXX";
int keyIndex = 0;

int status = WL_IDLE_STATUS;
char server[] = "database.arduinometeo.eu";
WiFiClient client;

//SENSORI
Adafruit_VEML6070 uv = Adafruit_VEML6070(); //SENSORE UV
Adafruit_BME280 bme; //SENSORE PRESSIONE,UMIDITA', TEMPERATURA
BH1750FVI LightSensor(BH1750FVI::k_DevModeContLowRes); //DICHIARAZIONE DEL SENSORE DELLA LUCE SOLARE BH1750
Adafruit_CCS811 ccs; //SENSORE CO2 E TVOC - LASCIARLO ACCESO ALMENO 48h PER LA TARATURA
HygrometerSensor analog_rain_drop(HygrometerSensor::ANALOG, A0); //DICHIARAZIONE IN ALTRO MODO DELL'IGROMETRO SUL PIN A0

void setup() {

  Serial.begin(115200);
  while (!Serial) {
    ;
  }

  //SENSORI
  Serial.begin(9600);
  Serial.println("VEML6070 Test");
  uv.begin(VEML6070_1_T);  // pass in the integration time constant

     Serial.begin(9600);
   if (!bme.begin(0x76)) {
    Serial.println("Non ho trovato il sensore BME280!");
    while (1);
  }
  
     //Sensore luminosità
    Serial.begin(115200);
    LightSensor.begin(); 

    Serial.begin(9600);
    Serial.println("CCS811 test");
    if(!ccs.begin())
    {
      Serial.println("Failed to start sensor CSS811! Please check your wiring.");
      while(1);
    }
    
    //calibrate temperature sensor
    while(!ccs.available());
    float temp = ccs.calculateTemperature();
    ccs.setTempOffset(temp - 25.0);

    //Igrometro
    int min, max, is_raining;
    analog_rain_drop.getAnalogParameters(min, max, is_raining);

}

void loop() {

       //Igrometro;
        String Pioggia= "No"; //STRINGA
        String Quantita = "0"; //STRINGA
        analog_rain_drop.readHumidityValue();//LEGGO DA FUNZIONE I DATI  
        Quantita = (String)analog_rain_drop.readPercentageHumidity();//LEGGO DA FUNZIONE I DATI E LI CONVERTO IN STRINGA
        Serial.println(analog_rain_drop.readPercentageHumidity());
        if (analog_rain_drop.isHumid()) { //UNA CONDIZIONE .. SE PIOGGE METTO ALL'INTERNO SI ALTRIMENTI NO
           Pioggia = "Si";
        } else {
           Pioggia = "No";
        }        

        //CO2
       float CO2Value = 0;
       if(ccs.available())
        {
          float temp = ccs.calculateTemperature();
          if(!ccs.readData())
            {
              CO2Value = ccs.geteCO2(); //LEGGO VALORI CO2
            }
            else
            {
              CO2Value = 0;
            }
        }
        
        
        float H = bme.readPressure() / 100.0F; //LEGGO LA PRESSIONE E LA DIVIDO PER 100F CHE SIGNIFICA IN HPA
        float U = bme.readHumidity(); //LEGGO UMIDITA
        float T = bme.readTemperature(); //LEGGO TEMPERATURA
        float uvIntensity = uv.readUV(); // LEGGO GLI UV
        uint16_t lux = LightSensor.GetLightIntensity(); //LEGGO il sensore luminoso  
        
String InvioDatiArduinoMeteo = ";" + (String)T + "A" + (String)H + "A" + (String)U + "A0.00A" + (String)uvIntensity + "A" + (String)Pioggia + "A" + (String)Quantita + "A" + (String)CO2Value + "A" + (String)lux + "A_CODICE_DA_RICHIEDERE_";

  
while (WiFi.status() != WL_CONNECTED) 
{
  Serial.print("Attempting to connect to SSID: ");
  Serial.println(ssid);
  // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
  status = WiFi.begin(ssid, pass);
  Serial.println("Connessione...");
  // wait 10 seconds for connection:
  delay(10000);
}

Serial.println("Connected to wifi");
                  
          if (client.connect(server, 80))
         {
          Serial.println(InvioDatiArduinoMeteo);
          // print to serial monitor
          Serial.println("connected...");
          Serial.println("ARDUINO: forming HTTP request message");
          client.print("GET /update.php?completa=" + (String)InvioDatiArduinoMeteo);
          client.println(" HTTP/1.1");
          client.print("HOST: ");
          client.println(server);
          client.println();
          Serial.println("ARDUINO: HTTP message sent");              
          delay(1000);
          client.stop();
         }
         
        delay(300000);
} 

Spero vi sia piaciuta la guida. Se è così vi prego fortemente di fare una donazione alla pagina: https://arduinometeo.eu/sponsor-arduino-meteo-stazione-meteorologica/

Per aiutarci a portare avanti tutto dall’ App al Software alle guide. Ma specialmente per comperare materiale per le scuole. Ho già molte scuole in lista di attesa ma dasolo non posso farcela. Grazie infinite fin da subito.

Arduino Meteo