[LPM] ESP8266 and DS1820 DeepSleep (#1591)
Add support for the ESP8266 deep sleep and required change for DS1820 sensor used in my project. Allow defining DS1820_RESOLUTION and DS1820_INTERVAL_SEC in ENVIRON without editing config file. Allow DTimeBetweenReadingmq2 Env. MACRO change without editing source config file. Added some an example ENVIRONMENTS Add ESP8266_DEEP_SLEEP_IN_US to nodemcuv2-all-test
This commit is contained in:
1 parent
ac0215b5be
commit
4e51d9ec45
8 files changed
+113
-8
No files matched your search
@@ -91,3 +91,20 @@ OpenMQTTGateway support a low power mode for ESP32, this mode can be set by MQTT
|
|||||||
|
|
||||||
The low power mode can be changed also with a push to button B when the board is processing (top button on M5stickC, M5stickC Plus and middle button of M5stack).
|
The low power mode can be changed also with a push to button B when the board is processing (top button on M5stickC, M5stickC Plus and middle button of M5stack).
|
||||||
If you are already in low power mode 1 or 2 with M5Stack you can wake up the board by pressing the red button.
|
If you are already in low power mode 1 or 2 with M5Stack you can wake up the board by pressing the red button.
|
||||||
|
|
||||||
|
### Low power mode (deepSleep) for ESP8266 boards
|
||||||
|
In certain use cases where power is severly limited you can use the ESP8266 deep sleep capability.
|
||||||
|
|
||||||
|
* e.g. measuring a pool temperature every 5 minutes using an ESP8266 and DS18B20 probe where the ESP8266 is powered by very limited battery backed solar power.
|
||||||
|
|
||||||
|
During deep sleep everything is off and (almost) all execution state is lost.
|
||||||
|
|
||||||
|
Consumption is about 20 µA.
|
||||||
|
|
||||||
|
Use this when you want the device to sleep for minutes or hours.
|
||||||
|
|
||||||
|
You only have to define the macro `ESP8266_DEEP_SLEEP_IN_US` with the number of microseconds.
|
||||||
|
|
||||||
|
A hardware jumper is required connecting RST to a GPIO (not to CH_PD) defined by the macro `ESP8266_DEEP_SLEEP_WAKE_PIN` and defaulted to D0.
|
||||||
|
|
||||||
|
And the sensor code must set variable `ready_to_sleep` to true after publishing the measurement to MQTT and the main loop will then enter deep sleep.
|
||||||
@@ -1117,6 +1117,7 @@ build_flags =
|
|||||||
;'-DZgatewayWeatherStation="WeatherStation"'
|
;'-DZgatewayWeatherStation="WeatherStation"'
|
||||||
'-DsimplePublishing=true'
|
'-DsimplePublishing=true'
|
||||||
'-DGateway_Name="OpenMQTTGateway_ESP8266_ALL"'
|
'-DGateway_Name="OpenMQTTGateway_ESP8266_ALL"'
|
||||||
|
'-DESP8266_DEEP_SLEEP_IN_US=120000000'
|
||||||
board_build.flash_mode = dout
|
board_build.flash_mode = dout
|
||||||
|
|
||||||
[env:nodemcuv2-fastled-test]
|
[env:nodemcuv2-fastled-test]
|
||||||
|
|||||||
@@ -294,6 +294,16 @@ static_assert(MQTT_SECURE_SELF_SIGNED_INDEX_DEFAULT < (sizeof(certs_array) / siz
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deep-sleep for the ESP8266.
|
||||||
|
* Set the wake pin.
|
||||||
|
*/
|
||||||
|
#ifdef ESP8266_DEEP_SLEEP_IN_US
|
||||||
|
# ifndef ESP8266_DEEP_SLEEP_WAKE_PIN
|
||||||
|
# define ESP8266_DEEP_SLEEP_WAKE_PIN D0
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/*------------------DEEP SLEEP parameters ------------------*/
|
/*------------------DEEP SLEEP parameters ------------------*/
|
||||||
//DEFAULT_LOW_POWER_MODE -1 to normal mode, low power mode can't be used on this build
|
//DEFAULT_LOW_POWER_MODE -1 to normal mode, low power mode can't be used on this build
|
||||||
//DEFAULT_LOW_POWER_MODE 0 to normal mode (no power consumption optimisations)
|
//DEFAULT_LOW_POWER_MODE 0 to normal mode (no power consumption optimisations)
|
||||||
|
|||||||
@@ -162,6 +162,9 @@ void MeasureDS1820Temp() {
|
|||||||
Log.trace(F("DS1820: Temperature for device %s didn't change, don't publish it." CR), (char*)ds1820_addr[i].c_str());
|
Log.trace(F("DS1820: Temperature for device %s didn't change, don't publish it." CR), (char*)ds1820_addr[i].c_str());
|
||||||
}
|
}
|
||||||
persisted_temp[i] = current_temp[i];
|
persisted_temp[i] = current_temp[i];
|
||||||
|
# ifdef ESP8266_DEEP_SLEEP_IN_US
|
||||||
|
ready_to_sleep = true;
|
||||||
|
# endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-7
@@ -33,13 +33,17 @@ extern void pubOneWire_HADiscovery();
|
|||||||
|
|
||||||
/*----------------------------USER PARAMETERS-----------------------------*/
|
/*----------------------------USER PARAMETERS-----------------------------*/
|
||||||
/*-------------DEFINE YOUR MQTT PARAMETERS BELOW----------------*/
|
/*-------------DEFINE YOUR MQTT PARAMETERS BELOW----------------*/
|
||||||
#define OW_TOPIC "/OneWiretoMQTT/ds1820"
|
#define OW_TOPIC "/OneWiretoMQTT/ds1820"
|
||||||
#define OW_MAX_SENSORS 8 // query max. sensors on 1-wire bus
|
#define OW_MAX_SENSORS 8 // query max. sensors on 1-wire bus
|
||||||
#define DS1820_ALWAYS true // if false only published current temperature if has changed from previous reading
|
#define DS1820_ALWAYS true // if false only published current temperature if has changed from previous reading
|
||||||
#define DS1820_INTERVAL_SEC 60UL // time between DS1820 readings (seconds)
|
#ifndef DS1820_INTERVAL_SEC
|
||||||
#define DS1820_RESOLUTION 10 // conversion times: 9 bit (93.75 ms), 10 bit (187.5 ms), 11 bit (375 ms), 12 bit (750 ms)
|
# define DS1820_INTERVAL_SEC 60UL // time between DS1820 readings (seconds)
|
||||||
#define DS1820_DETAILS true // publish extended info for each sensor (resolution, address, type)
|
#endif
|
||||||
#define DS1820_CONV_TIME 2000UL // trigger conversion before requesting temperature readings (ms)
|
#ifndef DS1820_RESOLUTION
|
||||||
|
# define DS1820_RESOLUTION 10 // conversion times: 9 bit (93.75 ms), 10 bit (187.5 ms), 11 bit (375 ms), 12 bit (750 ms)
|
||||||
|
#endif
|
||||||
|
#define DS1820_DETAILS true // publish extended info for each sensor (resolution, address, type)
|
||||||
|
#define DS1820_CONV_TIME 2000UL // trigger conversion before requesting temperature readings (ms)
|
||||||
/*-------------------PIN DEFINITIONS----------------------*/
|
/*-------------------PIN DEFINITIONS----------------------*/
|
||||||
|
|
||||||
#ifndef DS1820_OWBUS_GPIO
|
#ifndef DS1820_OWBUS_GPIO
|
||||||
|
|||||||
+3
-1
@@ -55,7 +55,9 @@ extern void MQ2toMQTT();
|
|||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TimeBetweenReadingmq2 10000
|
#ifndef TimeBetweenReadingmq2
|
||||||
|
# define TimeBetweenReadingmq2 10000
|
||||||
|
#endif
|
||||||
/*----------------------------USER PARAMETERS-----------------------------*/
|
/*----------------------------USER PARAMETERS-----------------------------*/
|
||||||
/*-------------DEFINE YOUR MQTT PARAMETERS BELOW----------------*/
|
/*-------------DEFINE YOUR MQTT PARAMETERS BELOW----------------*/
|
||||||
#define subjectMQ2toMQTT "/GAStoMQTT/mq2"
|
#define subjectMQ2toMQTT "/GAStoMQTT/mq2"
|
||||||
|
|||||||
@@ -53,6 +53,14 @@ unsigned long timer_sys_checks = 0;
|
|||||||
# define ARDUINOJSON_ENABLE_STD_STRING 1
|
# define ARDUINOJSON_ENABLE_STD_STRING 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deep-sleep for the ESP8266 we need some form of indicator that we have posted the measurements and am ready to deep sleep.
|
||||||
|
* Set this to true in the sensor code after publishing the measurement.
|
||||||
|
*/
|
||||||
|
#ifdef ESP8266_DEEP_SLEEP_IN_US
|
||||||
|
bool ready_to_sleep = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <ArduinoJson.h>
|
#include <ArduinoJson.h>
|
||||||
#include <ArduinoLog.h>
|
#include <ArduinoLog.h>
|
||||||
#include <PubSubClient.h>
|
#include <PubSubClient.h>
|
||||||
@@ -771,6 +779,11 @@ void setup() {
|
|||||||
Log.notice(F("OpenMQTTGateway Version: " OMG_VERSION CR));
|
Log.notice(F("OpenMQTTGateway Version: " OMG_VERSION CR));
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
# ifdef ESP8266_DEEP_SLEEP_IN_US
|
||||||
|
Log.notice(F("Setting wake pin for deep sleep." CR));
|
||||||
|
pinMode(ESP8266_DEEP_SLEEP_WAKE_PIN, WAKEUP_PULLUP);
|
||||||
|
# endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The 2 modules below are not connection dependent so start them before the connectivity functions
|
The 2 modules below are not connection dependent so start them before the connectivity functions
|
||||||
Note that the ONOFF module need to start after the RN8209 so that the overCurrent task is launched after the setup of the sensor
|
Note that the ONOFF module need to start after the RN8209 so that the overCurrent task is launched after the setup of the sensor
|
||||||
@@ -1779,6 +1792,17 @@ void loop() {
|
|||||||
#if defined(ZdisplaySSD1306)
|
#if defined(ZdisplaySSD1306)
|
||||||
loopSSD1306();
|
loopSSD1306();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deep-sleep for the ESP8266 - e.g. ESP8266_DEEP_SLEEP_IN_US 30000000 for 30 seconds.
|
||||||
|
* Everything is off and (almost) all execution state is lost.
|
||||||
|
*/
|
||||||
|
#ifdef ESP8266_DEEP_SLEEP_IN_US
|
||||||
|
if (ready_to_sleep) {
|
||||||
|
Log.notice(F("Entering deep sleep for : %l us." CR), ESP8266_DEEP_SLEEP_IN_US);
|
||||||
|
ESP.deepSleep(ESP8266_DEEP_SLEEP_IN_US);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -125,3 +125,47 @@ build_flags =
|
|||||||
board_build.flash_mode = dout
|
board_build.flash_mode = dout
|
||||||
extra_scripts = scripts/compressFirmware.py
|
extra_scripts = scripts/compressFirmware.py
|
||||||
board_build.ldscript = eagle.flash.1m64.ld ;this frees more space for firmware uplad. Should also be uses for initial flash via serial
|
board_build.ldscript = eagle.flash.1m64.ld ;this frees more space for firmware uplad. Should also be uses for initial flash via serial
|
||||||
|
|
||||||
|
;Wemos D1 with an MQ2 flammable gas sensor at custom interval
|
||||||
|
[env:wemosd1-mq2-gas]
|
||||||
|
platform = ${com.esp8266_platform}
|
||||||
|
board = d1_mini
|
||||||
|
lib_deps =
|
||||||
|
${com-esp.lib_deps}
|
||||||
|
${libraries.wifimanager8266}
|
||||||
|
${libraries.esp8266_mdns}
|
||||||
|
build_flags =
|
||||||
|
${com-esp.build_flags}
|
||||||
|
'-UZmqttDiscovery' ; disables MQTT Discovery
|
||||||
|
; '-UZmqttDiscovery="HADiscovery"'
|
||||||
|
'-DvalueAsATopic=true' ; MQTT topic includes model and device
|
||||||
|
'-DGateway_Name="OpenMQTTGateway_MQ2_GAS"'
|
||||||
|
'-DZsensorMQ2="MQ2"'
|
||||||
|
'-DTimeBetweenReadingmq2=8000'
|
||||||
|
board_build.flash_mode = dout
|
||||||
|
custom_description = Gas flammable sensor gateway
|
||||||
|
custom_hardware = Gas flammable sensor first version
|
||||||
|
|
||||||
|
;ESP12E with an DS1820 waterproof temperature probe, custom interval, max temperature resolution and DEEP SLEEP to conserve battery power
|
||||||
|
[env:esp12e-ds18b20-deepsleep-pool]
|
||||||
|
platform = ${com.esp8266_platform}
|
||||||
|
board = esp12e
|
||||||
|
lib_deps =
|
||||||
|
${com-esp.lib_deps}
|
||||||
|
${libraries.wifimanager8266}
|
||||||
|
${libraries.esp8266_mdns}
|
||||||
|
${libraries.dallastemperature}
|
||||||
|
build_flags =
|
||||||
|
${com-esp.build_flags}
|
||||||
|
'-UZmqttDiscovery' ; disables MQTT Discovery
|
||||||
|
; '-UZmqttDiscovery="HADiscovery"'
|
||||||
|
'-DvalueAsATopic=true' ; MQTT topic includes model and device
|
||||||
|
'-DGateway_Name="OpenMQTTGatewayDS1820Pool"'
|
||||||
|
'-DZsensorDS1820="DS1820"'
|
||||||
|
'-DDS1820_OWBUS_GPIO=D2'
|
||||||
|
'-DESP8266_DEEP_SLEEP_IN_US=120000000'
|
||||||
|
'-DDS1820_RESOLUTION=12'
|
||||||
|
'-DDS1820_INTERVAL_SEC=15UL'
|
||||||
|
board_build.flash_mode = dout
|
||||||
|
custom_description = Pool temp sensor gateway
|
||||||
|
custom_hardware = Pool temp sensor first version
|
||||||
Reference in new issue
Block a user