Dateien nach "/" hochladen
initial upload
This commit is contained in:
commit
162ec1472a
70
Config.h
Normal file
70
Config.h
Normal file
@ -0,0 +1,70 @@
|
||||
/***************************************************************/
|
||||
/* Settings for WLAN */
|
||||
/***************************************************************/
|
||||
const char* WIFI_SSID = "YourWiFiSSD";
|
||||
const char* WIFI_PASSWORD = "YourWiFiSSDPassword";
|
||||
|
||||
/***************************************************************/
|
||||
/* Debugging to serieal console */
|
||||
/***************************************************************/
|
||||
const bool ENABLE_DEBUG = false;
|
||||
|
||||
/***************************************************************/
|
||||
/* Settings Elevation for calculation pressure at sealevel */
|
||||
/***************************************************************/
|
||||
int ELEVATION = 100; //in meter
|
||||
|
||||
/***************************************************************/
|
||||
/* Settings for Eltako 20000082 WS */
|
||||
/***************************************************************/
|
||||
const float number_reed = 4; //how many read contacts?
|
||||
|
||||
/***************************************************************/
|
||||
/* openSenseMap */
|
||||
/*
|
||||
senseBox:home - Citizen Sensingplatform
|
||||
Version: wifi_1.4
|
||||
Date: 2017-07-29
|
||||
Homepage: https://www.sensebox.de https://www.opensensemap.org
|
||||
Author: Institute for Geoinformatics, University of Muenster
|
||||
Note: Sketch for senseBox:home WiFi Edition
|
||||
Model: homeWifi
|
||||
Email: support@sensebox.de
|
||||
Code is in the public domain.
|
||||
https://github.com/sensebox/node-sketch-templater
|
||||
*/
|
||||
/***************************************************************/
|
||||
const bool startSENSEBOX = true; //send to OpenSenseMap - set true
|
||||
|
||||
// address of the server to send to
|
||||
const char SENSEBOX_SERVER[] PROGMEM = "ingress.opensensemap.org";
|
||||
|
||||
// senseBox ID
|
||||
const char SENSEBOX_ID[] PROGMEM = "SenseBoxId";
|
||||
|
||||
// Number of sensors
|
||||
// Change this number if you add or remove sensors
|
||||
// do not forget to remove or add the sensors on opensensemap.org
|
||||
static const uint8_t NUM_SENSORS = 7;
|
||||
|
||||
// sensor IDs
|
||||
// Temperature
|
||||
const char TEMPERATURE_ID[] PROGMEM = "TEMPERATURE_ID";
|
||||
|
||||
//dewpoint
|
||||
const char DEWPOINT_ID[] PROGMEM = "DEWPOINT_ID";
|
||||
|
||||
// abs. Humidity
|
||||
const char HUMIDITY_ID[] PROGMEM = "HUMIDITY_ID";
|
||||
|
||||
// Pressure
|
||||
const char PRESSURE_ID[] PROGMEM = "absolute_PRESSURE_ID";
|
||||
|
||||
// Pressure
|
||||
const char PRESSURE_NN_ID[] PROGMEM = "relative_PRESSURE_ID";
|
||||
|
||||
// Anemometer
|
||||
const char ANEMOMETER_ID[] PROGMEM = "ANEMOMETER_ID";
|
||||
|
||||
// Batterie
|
||||
const char VOLTMETER_ID[] PROGMEM = "VOLTMETER_ID";
|
285
solarweatherstation-with-opensensemap.ino
Normal file
285
solarweatherstation-with-opensensemap.ino
Normal file
@ -0,0 +1,285 @@
|
||||
#include <ESP8266WiFi.h>
|
||||
#include <time.h>
|
||||
#include <Wire.h>
|
||||
#include <Adafruit_Sensor.h>
|
||||
#include <Adafruit_BME280.h>
|
||||
#include "Config.h"
|
||||
|
||||
WiFiClient client;
|
||||
|
||||
/***************************************************************/
|
||||
/* Eltako 20000082 WS */
|
||||
/***************************************************************/
|
||||
unsigned long next_timestamp = 0;
|
||||
volatile unsigned long i = 0;
|
||||
float wind = 0;
|
||||
float last_wind = 0;
|
||||
int count = 0;
|
||||
volatile unsigned long last_micros;
|
||||
long debouncing_time = 5; //in millis
|
||||
int input_pin = 13;
|
||||
char charBuffer[32];
|
||||
|
||||
//this part is needed by the anemometer sensor
|
||||
void ICACHE_RAM_ATTR Interrupt()
|
||||
{
|
||||
if((long)(micros() - last_micros) >= debouncing_time * 1000) {
|
||||
i++;
|
||||
last_micros = micros();
|
||||
}
|
||||
}
|
||||
|
||||
// Current time
|
||||
unsigned long currentTime = millis();
|
||||
// Previous time
|
||||
unsigned long previousTime = 0;
|
||||
// Define timeout time in milliseconds (example: 2000ms = 2s)
|
||||
const long timeoutTime = 2000;
|
||||
|
||||
/***************************************************************/
|
||||
/* Batterylevel */
|
||||
/***************************************************************/
|
||||
unsigned int raw=0;
|
||||
float calib_factor = 5.28; // change this value to calibrate the battery voltage
|
||||
float volt=0.0;
|
||||
|
||||
/***************************************************************/
|
||||
/* BME280 */
|
||||
/***************************************************************/
|
||||
//Define Sensor BME280 and variables
|
||||
Adafruit_BME280 bme;
|
||||
float sensorTemperature = 0;
|
||||
float sensorHumidity = 0;
|
||||
float sensorPressure = 0;
|
||||
float sensorPressureSealevel = 0;
|
||||
float sensorDewpoint = 0;
|
||||
|
||||
//Calculate dew Point
|
||||
double dewPoint(double tempf, double humidity) {
|
||||
double A0= 373.15/(273.15 + tempf);
|
||||
double SUM = -7.90298 * (A0-1);
|
||||
SUM += 5.02808 * log10(A0);
|
||||
SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
|
||||
SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
|
||||
SUM += log10(1013.246);
|
||||
double VP = pow(10, SUM-3) * humidity;
|
||||
double T = log(VP/0.61078);
|
||||
return (241.88 * T) / (17.558-T);
|
||||
}
|
||||
|
||||
/***************************************************************/
|
||||
/* openSenseMap */
|
||||
/***************************************************************/
|
||||
typedef struct measurement {
|
||||
const char *sensorId;
|
||||
float value;
|
||||
} measurement;
|
||||
|
||||
measurement measurements[NUM_SENSORS];
|
||||
uint8_t num_measurements = 0;
|
||||
|
||||
// buffer for sprintf
|
||||
char buffer[500];
|
||||
|
||||
void addMeasurement(const char *sensorId, float value) {
|
||||
measurements[num_measurements].sensorId = sensorId;
|
||||
measurements[num_measurements].value = value;
|
||||
num_measurements++;
|
||||
}
|
||||
|
||||
void writeMeasurementsToClient() {
|
||||
// iterate throug the measurements array
|
||||
for (uint8_t i = 0; i < num_measurements; i++) {
|
||||
sprintf_P(buffer, PSTR("%S,"), measurements[i].sensorId);
|
||||
// arduino sprintf just returns "?" for floats, use dtostrf
|
||||
dtostrf(measurements[i].value, 9, 2, &buffer[strlen(buffer)]);
|
||||
|
||||
// transmit buffer to client
|
||||
client.println(buffer);
|
||||
if (ENABLE_DEBUG) Serial.println(buffer);
|
||||
}
|
||||
|
||||
// reset num_measurements
|
||||
num_measurements = 0;
|
||||
}
|
||||
|
||||
void submitValues() {
|
||||
// close any connection before send a new request.
|
||||
// This will free the socket on the WiFi shield
|
||||
if (client.connected()) {
|
||||
client.stop();
|
||||
delay(1000);
|
||||
}
|
||||
bool connected = false;
|
||||
char _server[strlen_P(SENSEBOX_SERVER)];
|
||||
strcpy_P(_server, SENSEBOX_SERVER);
|
||||
for (uint8_t timeout = 2; timeout != 0; timeout--) {
|
||||
if (ENABLE_DEBUG) Serial.println("connecting...");
|
||||
connected = client.connect(_server, 80);
|
||||
if (connected == true) {
|
||||
if (ENABLE_DEBUG) Serial.println("Connection successful, transferring...");
|
||||
// construct the HTTP POST request:
|
||||
sprintf_P(buffer,
|
||||
/* PLEASE insert you Authorization key from the scetch insted of AUTHORIZATIONKEY !!!!!!!!!!1 */
|
||||
PSTR("POST /boxes/%S/data HTTP/1.1\nAuthorization: AUTHORIZATIONKEY\nHost: %S\nContent-Type: "
|
||||
"text/csv\nConnection: close\nContent-Length: %i\n"),
|
||||
SENSEBOX_ID, SENSEBOX_SERVER, num_measurements * 36);
|
||||
if (ENABLE_DEBUG) Serial.println(buffer);
|
||||
|
||||
// send the HTTP POST request:
|
||||
client.println(buffer);
|
||||
|
||||
// send measurements
|
||||
writeMeasurementsToClient();
|
||||
|
||||
// send empty line to end the request
|
||||
client.println();
|
||||
|
||||
delay(100);
|
||||
client.flush();
|
||||
client.stop();
|
||||
|
||||
if (ENABLE_DEBUG) Serial.print("done!");
|
||||
|
||||
// reset number of measurements
|
||||
num_measurements = 0;
|
||||
break;
|
||||
}
|
||||
delay(1000);
|
||||
}
|
||||
}
|
||||
|
||||
void setup() {
|
||||
/***************************************************************/
|
||||
/* Enable Serial output */
|
||||
/***************************************************************/
|
||||
Serial.begin(115200);
|
||||
if (ENABLE_DEBUG) Serial.println("");
|
||||
|
||||
/***************************************************************/
|
||||
/* Enable Wifi */
|
||||
/***************************************************************/
|
||||
WiFi.mode(WIFI_STA);
|
||||
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
|
||||
if (WiFi.waitForConnectResult() != WL_CONNECTED) {
|
||||
if (ENABLE_DEBUG) Serial.print("WiFi Connect Failed! Rebooting...");
|
||||
delay(1000);
|
||||
ESP.restart();
|
||||
} else {
|
||||
if (ENABLE_DEBUG) Serial.println("WiFi Connected");
|
||||
}
|
||||
|
||||
/***************************************************************/
|
||||
/* Setup pin for voltage messurment */
|
||||
/***************************************************************/
|
||||
Wire.begin();
|
||||
pinMode(A0, INPUT);
|
||||
|
||||
/***************************************************************/
|
||||
/* Setup BME280 sensor */
|
||||
/***************************************************************/
|
||||
// Sensor initialization
|
||||
if (ENABLE_DEBUG) Serial.println("Initializing sensors...");
|
||||
if (!bme.begin(0x76)) {
|
||||
if (ENABLE_DEBUG) Serial.print("Could not find a valid BME280 sensor, check wiring!");
|
||||
while (1);
|
||||
}
|
||||
else {
|
||||
if (ENABLE_DEBUG) Serial.print("BME280 sensor connected!");
|
||||
}
|
||||
|
||||
/***************************************************************/
|
||||
/* Setup Eltako 20000082 WS */
|
||||
/***************************************************************/
|
||||
pinMode(input_pin, INPUT_PULLUP);//D7
|
||||
attachInterrupt(input_pin,Interrupt,RISING);
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
/***************************************************************/
|
||||
/* Batterie calculation */
|
||||
/***************************************************************/
|
||||
unsigned long raw = analogRead(A0);
|
||||
float volt= raw * calib_factor/1024;
|
||||
|
||||
/***************************************************************/
|
||||
/* Anenmometer calculation */
|
||||
/***************************************************************/
|
||||
if (millis() > next_timestamp ) {
|
||||
detachInterrupt(input_pin);
|
||||
count++;
|
||||
float rps = i/number_reed; //computing rounds per second
|
||||
if(i == 0)
|
||||
wind = 0.0;
|
||||
else
|
||||
wind = 1.761 / (1 + rps) + 3.013 * rps;// found here: https://www.amazon.de/gp/customer-reviews/R3C68WVOLJ7ZTO/ref=cm_cr_getr_d_rvw_ttl?ie=UTF8&ASIN=B0018LBFG8 (in German)
|
||||
if(last_wind - wind > 0.8 || last_wind - wind < -0.8 || count >= 10){
|
||||
String strBuffer;
|
||||
strBuffer = String(wind);
|
||||
strBuffer.toCharArray(charBuffer,10);
|
||||
count = 0;
|
||||
}
|
||||
i = 0;
|
||||
last_wind = wind;
|
||||
if(WiFi.status() != WL_CONNECTED) {
|
||||
ESP.restart();
|
||||
delay(100);
|
||||
}
|
||||
next_timestamp = millis()+1000; //intervall is 1s
|
||||
attachInterrupt(input_pin,Interrupt,RISING);
|
||||
}
|
||||
|
||||
/***************************************************************/
|
||||
/* Collect data from BME280 sensor */
|
||||
/***************************************************************/
|
||||
sensorTemperature = bme.readTemperature();
|
||||
sensorDewpoint = (dewPoint(bme.readTemperature(), bme.readHumidity()));
|
||||
sensorHumidity = bme.readHumidity();
|
||||
sensorPressure = bme.readPressure() / 100.0F;
|
||||
sensorPressureSealevel = ((bme.readPressure())/pow((1-((float)(ELEVATION))/44330), 5.255))/100.0;
|
||||
|
||||
if (ENABLE_DEBUG) {
|
||||
Serial.print("Temperature: ");
|
||||
Serial.print(sensorTemperature);
|
||||
Serial.println(" °C");
|
||||
Serial.print("DewPoint: ");
|
||||
Serial.print(sensorDewpoint);
|
||||
Serial.println(" °C");
|
||||
Serial.print("abs. Humidity: ");
|
||||
Serial.print(sensorHumidity);
|
||||
Serial.println(" %");
|
||||
Serial.print("rel. Humidity: ");
|
||||
Serial.print(sensorHumidity);
|
||||
Serial.println(" %");
|
||||
Serial.print("abs. Pressure: ");
|
||||
Serial.print(sensorPressure);
|
||||
Serial.println(" hPa");
|
||||
Serial.print("rel. Pressure: ");
|
||||
Serial.print(sensorPressureSealevel);
|
||||
Serial.println(" hPa");
|
||||
Serial.print("Wind: ");
|
||||
Serial.print(wind);
|
||||
Serial.println(" km/h");
|
||||
Serial.print("Batterie: ");
|
||||
Serial.print(volt);
|
||||
Serial.println(" V");
|
||||
}
|
||||
/***************************************************************/
|
||||
/* Send data to OpenSenseMap */
|
||||
/***************************************************************/
|
||||
if (startSENSEBOX) {
|
||||
addMeasurement(TEMPERATURE_ID, sensorTemperature);
|
||||
addMeasurement(DEWPOINT_ID, sensorDewpoint);
|
||||
addMeasurement(HUMIDITY_ID, sensorHumidity);
|
||||
addMeasurement(PRESSURE_ID, sensorPressure);
|
||||
addMeasurement(PRESSURE_NN_ID, sensorPressureSealevel);
|
||||
addMeasurement(ANEMOMETER_ID, wind);
|
||||
addMeasurement(VOLTMETER_ID, volt);
|
||||
|
||||
submitValues();
|
||||
}
|
||||
|
||||
//delay(5000);
|
||||
ESP.deepSleep(480e6); //8 minutes deepSleep
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user