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.

Centralina stazione meteo.
Composta da :

Sensore posto al esterno composto da:
- Sensore bme280 €7
- sensore pioggia
- Contenitore realizzato con stampa 3d

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