From 10977e14b75d7a7e6f40190ef5e8c04c1cdd5590 Mon Sep 17 00:00:00 2001 From: klaute Date: Thu, 12 Jul 2018 22:30:30 +0200 Subject: [PATCH] Powersaving implemented. The web update mechanism is disabled. --- firmware/config.h | 11 +++++--- firmware/firmware.ino | 61 ++++++++++++++++++++++++++++++++++--------- firmware/influxdb.ino | 18 +++++++++++-- firmware/sensors.ino | 2 +- 4 files changed, 72 insertions(+), 20 deletions(-) diff --git a/firmware/config.h b/firmware/config.h index 58ad161..056c219 100644 --- a/firmware/config.h +++ b/firmware/config.h @@ -1,5 +1,7 @@ -#define DEBUG 1 +//#define DEBUG 1 + +#define POWERSAVING 1 #define SENSOR_TEMPERATURE 0 #define SENSOR_HUMIDITY 1 @@ -8,9 +10,10 @@ #define SENSOR_PRESSURE 4 #define SENSOR_BAT_VOLTAGE 5 -#define UPDATE_SENSOR_INTERVAL_S 10 -#define UPDATE_WEBSERVER_INTVERVAL_S 1 -#define DELAY_LOOP_MS 50 +#define UPDATE_SENSOR_INTERVAL_S 10 +#define UPDATE_WEBSERVER_INTVERVAL_S 1 +#define DELAY_LOOP_MS 50 +#define POWERSAVING_SLEEP_S 10 #define STATUS_LED_PIN BUILTIN_LED #define ANEMOMETER_PIN D7 diff --git a/firmware/firmware.ino b/firmware/firmware.ino index 487a3bd..ee6f78b 100644 --- a/firmware/firmware.ino +++ b/firmware/firmware.ino @@ -60,6 +60,8 @@ void setup() { pinMode(ANEMOMETER_PIN, INPUT_PULLUP); pinMode(A0, INPUT); + digitalWrite(STATUS_LED_PIN, HIGH); + // Establish WiFi connection String wifiName = "oko-weather-" + String(ESP.getChipId()); wifiManager.setMinimumSignalQuality(15); @@ -85,34 +87,72 @@ void setup() { bool status = bme.begin(0x76); if (!status) { +#ifdef DEBUG Serial.println("Could not find a valid BME280 sensor, check wiring!"); +#endif while (1); } +#ifndef POWERSAVING setupWebUpdater(); +#endif localIP = WiFi.localIP().toString(); delay(100); +#ifdef POWERSAVING + _loop(); + digitalWrite(STATUS_LED_PIN, LOW); + + WiFi.mode(WIFI_OFF); + WiFi.forceSleepBegin(); + + // the ESP.deepSleep requires microseconds as input, after the sleep the system will run into the setup routine + ESP.deepSleep(POWERSAVING_SLEEP_S * 1000000, WAKE_RF_DEFAULT); + +#endif + } //*************************************************************************// void loop() { +#ifdef POWERSAVING + delay(50); + return; +#endif + if (UPDATE_WEBSERVER_INTVERVAL_S * 1000 / DELAY_LOOP_MS <= update_webserver_cnt) { update_webserver_cnt = 0; doWebUpdater(); } -#ifdef DEBUG - digitalWrite(STATUS_LED_PIN, HIGH); -#endif + _loop(); + delay(DELAY_LOOP_MS); + + if (currentSensorData[SENSOR_BAT_VOLTAGE] <= 3.4) + { +#ifdef DEBUG + Serial.println("Low battery, going into deep sleep."); +#endif + ESP.deepSleep(4294967295); // battery low, shutting down + } + + update_sensor_cnt++; + update_webserver_cnt++; +} + +void _loop() { + +#ifndef POWERSAVING if (UPDATE_SENSOR_INTERVAL_S * 1000 / DELAY_LOOP_MS <= update_sensor_cnt) { update_sensor_cnt = 0; +#endif + currentSensorData[SENSOR_TEMPERATURE] = fetchTemperature(); currentSensorData[SENSOR_HUMIDITY] = fetchHumidity(); currentSensorData[SENSOR_LIGHT] = fetchLight(); @@ -120,10 +160,6 @@ void loop() { currentSensorData[SENSOR_PRESSURE] = fetchPressure(); currentSensorData[SENSOR_BAT_VOLTAGE] = getBatteryVoltage(); - if (currentSensorData[SENSOR_BAT_VOLTAGE] <= 3.7) - { - ESP.deepSleep(4294967295); // battery low, shutting down - } #ifdef DEBUG Serial.println(""); //Serial.println("Current readings:"); @@ -135,16 +171,15 @@ void loop() { Serial.println("Bat Voltage: " + String(currentSensorData[SENSOR_BAT_VOLTAGE]) + " V"); #endif + delay(100); + pushToInfluxDB(DEVICE_NAME, currentSensorData); + +#ifndef POWERSAVING setSensorData(DEVICE_NAME, localIP, currentSensorData); } +#endif - //ESP.deepSleep(DELAY_LOOP_MS * 1000); // the ESP.deepSleep requires microseconds as input, after the sleep the system will run into the setup routine - //delay(100); - delay(DELAY_LOOP_MS); - - update_sensor_cnt++; - update_webserver_cnt++; } //*************************************************************************// diff --git a/firmware/influxdb.ino b/firmware/influxdb.ino index 87b0d75..3312d4d 100755 --- a/firmware/influxdb.ino +++ b/firmware/influxdb.ino @@ -1,12 +1,26 @@ void pushToInfluxDB(String device, float sensorValues[]) { - influxdb.write("weather,device=" + device + " temperature=" + String(sensorValues[SENSOR_TEMPERATURE])); + /*influxdb.write("weather,device=" + device + " temperature=" + String(sensorValues[SENSOR_TEMPERATURE])); influxdb.write("weather,device=" + device + " humidity=" + String(sensorValues[SENSOR_HUMIDITY])); influxdb.write("weather,device=" + device + " light=" + String(sensorValues[SENSOR_LIGHT])); influxdb.write("weather,device=" + device + " windspeed=" + String(sensorValues[SENSOR_WINDSPEED])); influxdb.write("weather,device=" + device + " pressure=" + String(sensorValues[SENSOR_PRESSURE])); - influxdb.write("weather,device=" + device + " batvoltage=" + String(sensorValues[SENSOR_BAT_VOLTAGE])); + influxdb.write("weather,device=" + device + " batvoltage=" + String(sensorValues[SENSOR_BAT_VOLTAGE]));*/ + + String msg = "weather,device=" + device + " temperature=" + String(sensorValues[SENSOR_TEMPERATURE]) + + ",humidity=" + String(sensorValues[SENSOR_HUMIDITY]) + + ",light=" + String(sensorValues[SENSOR_LIGHT]) + + ",windspeed=" + String(sensorValues[SENSOR_WINDSPEED]) + + ",pressure=" + String(sensorValues[SENSOR_PRESSURE]) + + ",batvoltage=" + String(sensorValues[SENSOR_BAT_VOLTAGE]); + + uint8_t tries = 0; + do { + tries++; + influxdb.write(msg); + } while (influxdb.response() != DB_SUCCESS and tries < 5); + } diff --git a/firmware/sensors.ino b/firmware/sensors.ino index 6838864..e594e04 100755 --- a/firmware/sensors.ino +++ b/firmware/sensors.ino @@ -19,7 +19,7 @@ float fetchHumidity() { float fetchLight() { uint16_t red, green, blue, white; - while(!apds.colorDataReady()){ + while(!apds.colorDataReady()) { delay(5); }