• Home
  • Come costruire un stazione professionale meteo parte 2

Costruire una stazione meteo professionale con Arduino
parte 2

Capitolo 2 - Implementazione Strumenti e Sensori

Arduino mkr Wifi 1010

Far funzionare Arduino Mkr Wifi 1010 l’ho trovato più semplice del previsto. Su gestore schede di arduino ide e scrivendo mkr 1010 sarà presente la vostra scheda da installare in modo semplice e veloce. Per cominciare tutto si basa su una libreria chiamata WiFiNINA disponibile al download sulla gestione librerie https://www.arduino.cc/en/Reference/WiFiNINA (Piccola guida in EN) Questa libreria si occupa di gestire il Wifi di Arduino in molti modi. Come Server, Come Chat, etc. Ma la parte che a noi interessa è come Client per inviare i dati dei sensori ad una pagina PHP ai servizi arduinometeo.eu e alla sua relativa App. Un esempio di servizio Client preso tra gli esempi della libreria e modificato perchè comunichi con arduinometeo

#include <SPI.h>
#include <WiFiNINA.h>

char ssid[] = SECRET_SSID;        // Il nome della dete WIFI SSID (name)
char pass[] = SECRET_PASS;    // La pasword della rete Wifi
int keyIndex = 0;

int status = WL_IDLE_STATUS;

char server[] = "database.arduinometeo.eu"

WiFiClient client; // Inizializzazione client

void setup() 
{
      //Inizializzazione della porta seriale
      Serial.begin(9600);
      while (!Serial) {
        ;
      }
    
      // Controllo del modulo Wifi
      if (WiFi.status() == WL_NO_MODULE) {
        Serial.println("Communicazione modulo Wifi Fallita");
        // Non si può continuare.
        while (true);
      }
    
    //Controllo che la scheda sia all'ultimo fimware
      String fv = WiFi.firmwareVersion();
      if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
        Serial.println("Aggiornare il fimware");
      }
    
      // Attendo la connessione alla rete..
      while (status != WL_CONNECTED) {
        Serial.print("Attendo connessione al SSID: ");
        Serial.println(ssid);
        status = WiFi.begin(ssid, pass);
    
        // Attendo 10 secondi perchè si stabilizzi la connessione
        delay(10000);
  }
  
  Serial.println("Connected to wifi");
  printWifiStatus();
}

void loop() {

      while (WiFi.status() != WL_CONNECTED) {
        Serial.print("Attendo connessione al SSID: ");
        Serial.println(ssid);
        status = WiFi.begin(ssid, pass);
    
        // Attendo 10 secondi perchè si stabilizzi la connessione
        delay(10000);
  }

      if (client.connect(server, 80))
         {
          // print to serial monitor
          Serial.println("connected...");
          Serial.println("ARDUINO: forming HTTP request message");
          client.print("GET /update.php?completa=STRINGA CON I VALORI DEI SENSORI");
          client.println(" HTTP/1.1");
          client.print("HOST: ");
          client.println(server);
          client.println();
          Serial.println("ARDUINO: HTTP message sent");       
          client.stop();   
         }
         
         delay(600000); // Attendo 10 secondi al prossimo invio dei dati. Altrimenti mi intasate il server :-)
}


void printWifiStatus() //Funuzione di Arduino per il controllo del SSID 
//dell'indirizzo IP e la potenza del segnale.
{
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your board's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}
 

Sensore Gy-bme280 3.3v

Per questo sensore utilizzeremo solo 4 pin. VIN, GNU, SDA, SCL. Sono quelli che ci interessano per leggere i valori. Leggeremo i valori tramite protocollo I2C. Molto semplice da utilizzare. Questo sensore, come detto nella parte 1, avremmo come output tre valori. Un valore che ci indica la temperatura, un valore che ci indica l’umidità e un valore che ci indica la pressione atmosferica. Al rigurda per questo sensore c’è anche un articolo scritto appositamente su questo sito: Leggimi

Avendo già un bell’articolo scritto lascio il codice e tutte le informazioni su leggimi. La differenza è che SCL va su SCL e SDA su SDA di arduino mkr 1010 avendo proprio delle porte dedicate per il protocollo I2C. I Collegamenti sono:

GNU --> GNU
VIN --> 3.3V
SCL --> SCL
SDA --> SDA

Sensore di Qualità dell'Aria con CCS811

Questo è un magnifico sensore di una precisione incredibile per la misurazione del CO2. Ora è accesso a fianco a me e nel giro di un ora il CO2 è salito di quasi 50 ppm per il motivo che sto respirando e sto saturando la stanza che ho chiuso appositamente per controllare il suo funzionamento. Se apro la stanza i livelli ci CO2 tornano alla normalità sui 400 che sono i livelli prensenti nell’atmosfera nel 2020. Questo sensore va collegato ad Arduino in questo modo:

GNU --> GNU
VIN --> 3.3V
SCL --> SCL
SDA --> SDA
WAK --> GNU

Premessa. Come notate tutti e due i sensori hanno bisogno di 3.3V di gnu e del protocollo SCL – SDA (I2C). Ma arduino ha solo un pin per i 3.3v il Gnu e il protocollo I2C. Allora come Fare? Semplice con la basetta e i cavi della lezione precedente potete collegare la corrente sull’apposita srtisci blu per gnu e rossa per 3.3V e collegare SCL e SDA in un punto qualsiasi per poter poi avere più nodi da utilizzare. Vediamo qualche foto realizzata da me di come ho collegato il tutto.

Riassunto CO2 e CO con codice completo

Moltissimi fanno confusione tra CO e CO2. IL SENSORE MISURA I LIVELLI DI CO2

L’anidride carbonica, o CO2, è un gas presente in natura in grandi quantità: la emettiamo noi stessi respirando ed è parte dell’atmosfera.Quando in un ambiente cala il livello di ossigeno e aumenta quello di CO2 il nostro organismo è attrezzato per riconoscere la situazione: è quando si dice che l’aria è “viziata”.
Se il livello di CO2 cala mentre stiamo dormendo ci svegliamo avvertendo il bisogno di cambiare l’aria della stanza in cui ci troviamo.

Il Monossido di carbonio, o CO, è invece molto pericoloso: si lega all’emoglobina del sangue al posto dell’ossigeno ingannando il nostro organismo.
Per questo motivo nessun campanello di allarme ci porta a svegliarci, con il concreto rischio di asfissia nel sonno.
Il CO viene prodotto tipicamente dalla combustione incompleta di apparecchi a gas, come stufette e caldaie, spesso causa di incidenti domestici anche gravi. Nel caminetto a bioetanolo la produzione di CO avviene in quantità infinitesimale e quindi trascurabile.

Il sensore css811 fornendo come valori quelli di CO2 è più sensato tenerlo in casa per controllare quando è ora di arieggiare l’aria. Questa conclusione dopo 2-3 giorni di utilizzo. 

//CODICE COMPLETO CON INVIO DEI DATI AD ARDUINO METEO. IL CODICE PERSONALE VA RICHIESTO NELL'APPOSITA PAGINA

#include <SPI.h>
#include <WiFiNINA.h>
#include <Adafruit_BME280.h> // LIBRERIA
#include <Wire.h>
#include "Adafruit_CCS811.h"

///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = "XXXXX";        // your network SSID (name)
char pass[] = "XXXXXX";    // your network password (use for WPA, or use as key for WEP)
int keyIndex = 0;            // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;
// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
//IPAddress server(74,125,232,128);  // numeric IP for Google (no DNS)
char server[] = "database.arduinometeo.eu";    // name address for Google (using DNS)

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
WiFiClient client;

//SENSORI METEO
Adafruit_BME280 bme; //SENSORE PRESSIONE,UMIDITA', TEMPERATURA
Adafruit_CCS811 ccs; //SENSORE CO2 E TVOC - LASCIARLO ACCESO ALMENO 48h PER LA TARATURA

void setup() {
     
  //Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // check for the WiFi module:
  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // don't continue
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
    Serial.println("Please upgrade the firmware");
  }

//SENSORI METEO
   Serial.begin(9600);
   if (!bme.begin(0x76)) {
    Serial.println("Non ho trovato il sensore BME280!");
    while (1);
  }

    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);
 
}

void loop() {

  // attempt to connect to Wifi network:
  while (WiFi.status() == WL_DISCONNECTED) {
    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);

    // wait 10 seconds for connection:
    delay(10000);
  }
  Serial.println("Connected to wifi");


  
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

String InvioDatiArduinoMeteo = ";" + (String)T + "A" + (String)H + "A" + (String)U + 
"A0.00A0.00ANoA0A" + (String)CO2Value + "A0.00A_VOSTRO CODICE PERSONALE";

      if (client.connect(server, 80))
         {
          // 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(600000);  
}


void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your board's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
} 

Con questo ho finito la guida con i primi sensori e utilizzando un Arduino MKR 1010 WIFI per l’invio dei dati. Resto a disposizione di tutti gli amici di Arduino Meteo per maggiori dettagli. Ora da qui ci saranno altre quide aggiungengo sensori e caratteristiche alla nostra centralina meteo.