Stazione meteo
Descrizione.
Questa stazione meteo è composta da un sensore bme280 e da un sensore pioggia analogico.
I dati dei sensori vengono ricevuti dal modulo esp8266 , che a sua volta invia i dati tramite wifi al sito emoncms.

Sensore posto al esterno composto da:
Panello solare per la ricarica della batteria.
Galleria
Codice per esp8266:
/***************************************************************************
Stazione meteo
sensore BME280
sensore pioggia
invio dati ai seguenti siti:
- ThingSpeak.com
- emoncms.org
invia i dati ogni 15 minuti
 ***************************************************************************/
#include "ThingSpeak.h"
#include <ESP8266WiFi.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define SEALEVELPRESSURE_HPA (1013.25) // impostazione di base della pressione al livello del mare
Adafruit_BME280 bme; // I2C
const int sleepTimeS = 900;// 15 minuti
unsigned long delayTime;
float pres=9999 ;
float temp=999;
float umid=999;
float alt=9999;
// parametri valori sensore piogia
int pio;
const int sensorMin = 0; // sensor minimum
const int sensorMax = 1024; // sensor maximum

const char* ssid = "nome wifi"; //WIFI NAME
const char* password = "Password wifi"; //WIFI PASSWORD

const char* host = "emoncms.org"; // indirizzo sito
const char* host2 = "api.thingspeak.com";// indirizzo sito

String apiKey ="xxxxxxxxxxxxxxxxx"; //Apikey personali per scrivere nel sito di thingSpeak
 
 void setup() {
    Serial.begin(115200);
    if (! bme.begin()) {
        Serial.println("Could not find a valid BME280 sensor, check wiring!");
        while (1);
    }
    delayTime = 20000;// ritardo impostato a 20 secondi
    Serial.println();
      Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
   delay(1000);
while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
}
void loop() {
    // Only needed in forced mode! In normal mode, you can remove the next line.
    bme.takeForcedMeasurement(); // has no effect in normal mode
   printValues(); // richiama blocco lettura sensore bme280 e stapa via seriale i dati ricevuti
  pioggia(); // legge i valori del sensore pioggia
    delay(delayTime); //ritardo di 20 secondi
 
 WiFiClient client;
    
thing(); // richiama il blocco invio dati thingspeak
emoc(); // richiama blocco invio dati emoncms
}
// inizio blocco che invia i dati al sito emoncms 
void emoc(){
WiFiClient client;
if (!client.connect(host,80)) {
    Serial.println("connection failed");
    return;
  }
  // stringa per inviare i dati temp= temperatura umid=umidita pres=pressione alt= altitudine pio=valore analogico pioggia
 String url = "/input/post.json?node=6&csv="+String(temp)+","+String(umid)+","+String(pres)+","+String(alt)+","+String(pio)+"&apikey= Tue Apikey di emoncms"; //Enter api key here  

  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");
  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 5000) {
      Serial.println(">>> Client Timeout !");
      client.stop();
      return;
    }
  }  
}
//fine blocco emoncms

//inizio blocco invio dati thingspeak
void thing(){
WiFiClient client;
while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
/////////////////////////////////////////////////////// 
  if (client.connect(host2,80)) { // "184.106.153.149" or api.thingspeak.com
    String postStr = apiKey;
    
           postStr +="&field1=";
           postStr += String(pres);
           postStr +="&field2=";
           postStr += String(temp);
           postStr +="&field3=";
           postStr += String(umid);
           postStr +="&field4=";
           postStr += String(alt);
           postStr +="&field5=";
           postStr += String(pio);
           postStr += "\r\n\r\n";
 
    client.print("POST /update HTTP/1.1\n");
     client.print("Host: api.thingspeak.com\n");
     client.print("Connection: close\n");
     client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
     client.print("Content-Type: application/x-www-form-urlencoded\n");
     client.print("Content-Length: ");
     client.print(postStr.length());
     client.print("\n\n");
     client.print(postStr);
     Serial.println("%. invia a Thingspeak.");
  }
      client.stop();
}
// fine blocco thingspeak
// blocco che legge il valore analoco del sensore pioggia
void pioggia(){
   pio = analogRead(A0);
  int range = map(pio, sensorMin, sensorMax, 0, 3);
  Serial.println("Sta piovendo? ");
  Serial.print(pio);
  switch (range) {
 case 0: // Sensor getting wet
    Serial.println(": Pioggia");
    break;
 case 1: // Sensor getting wet
    Serial.println(": Piogerella");
    break;
 case 2: // Sensor dry - To shut this up delete the " Serial.println("Not Raining"); " below.
    Serial.println(": Sereno");
    break;
}
}
//fine blocco sensore pioggia
void printValues() {

   pres=(bme.readPressure()/100.0F);//legge il valore di pressione dal sensore
   temp=bme.readTemperature();// legge il valore della temperatura
   umid=bme.readHumidity(); //legge il valore dell umidità
   alt=bme.readAltitude(SEALEVELPRESSURE_HPA);// legge il valore dell'altezza
   
    Serial.print("Temperatura = ");
    Serial.print(temp);
    Serial.println(" *C");
    Serial.print("Pressione = ");
    Serial.print(pres);
    Serial.println(" hPa");
    Serial.print("Altitude = ");
    Serial.print(alt);
    Serial.println(" m");
    Serial.print("Umidità = ");
    Serial.print(umid);
    Serial.println(" %");
    Serial.println();
}
clicca sulle immagini per ingrandirle