Skip to content

Commit

Permalink
[LPM] ESP8266 and DS1820 DeepSleep (#1591)
Browse files Browse the repository at this point in the history
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
  • Loading branch information
diepeterpan authored and DigiH committed Apr 10, 2023
1 parent 1b7f073 commit 08d46fb
Show file tree
Hide file tree
Showing 8 changed files with 113 additions and 8 deletions.
17 changes: 17 additions & 0 deletions docs/use/boards.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).
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.
1 change: 1 addition & 0 deletions environments.ini
Original file line number Diff line number Diff line change
Expand Up @@ -1117,6 +1117,7 @@ build_flags =
;'-DZgatewayWeatherStation="WeatherStation"'
'-DsimplePublishing=true'
'-DGateway_Name="OpenMQTTGateway_ESP8266_ALL"'
'-DESP8266_DEEP_SLEEP_IN_US=120000000'
board_build.flash_mode = dout

[env:nodemcuv2-fastled-test]
Expand Down
10 changes: 10 additions & 0 deletions main/User_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,16 @@ static_assert(MQTT_SECURE_SELF_SIGNED_INDEX_DEFAULT < (sizeof(certs_array) / siz
# 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 ------------------*/
//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)
Expand Down
3 changes: 3 additions & 0 deletions main/ZsensorDS1820.ino
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
persisted_temp[i] = current_temp[i];
# ifdef ESP8266_DEEP_SLEEP_IN_US
ready_to_sleep = true;
# endif
}
}
}
Expand Down
18 changes: 11 additions & 7 deletions main/config_DS1820.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,17 @@ extern void pubOneWire_HADiscovery();

/*----------------------------USER PARAMETERS-----------------------------*/
/*-------------DEFINE YOUR MQTT PARAMETERS BELOW----------------*/
#define OW_TOPIC "/OneWiretoMQTT/ds1820"
#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_INTERVAL_SEC 60UL // time between DS1820 readings (seconds)
#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_DETAILS true // publish extended info for each sensor (resolution, address, type)
#define DS1820_CONV_TIME 2000UL // trigger conversion before requesting temperature readings (ms)
#define OW_TOPIC "/OneWiretoMQTT/ds1820"
#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
#ifndef DS1820_INTERVAL_SEC
# define DS1820_INTERVAL_SEC 60UL // time between DS1820 readings (seconds)
#endif
#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----------------------*/

#ifndef DS1820_OWBUS_GPIO
Expand Down
4 changes: 3 additions & 1 deletion main/config_MQ2.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,9 @@ extern void MQ2toMQTT();
# endif
#endif

#define TimeBetweenReadingmq2 10000
#ifndef TimeBetweenReadingmq2
# define TimeBetweenReadingmq2 10000
#endif
/*----------------------------USER PARAMETERS-----------------------------*/
/*-------------DEFINE YOUR MQTT PARAMETERS BELOW----------------*/
#define subjectMQ2toMQTT "/GAStoMQTT/mq2"
Expand Down
24 changes: 24 additions & 0 deletions main/main.ino
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,14 @@ unsigned long timer_sys_checks = 0;
# define ARDUINOJSON_ENABLE_STD_STRING 1
#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 <ArduinoLog.h>
#include <PubSubClient.h>
Expand Down Expand Up @@ -771,6 +779,11 @@ void setup() {
Log.notice(F("OpenMQTTGateway Version: " OMG_VERSION CR));
# 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
Note that the ONOFF module need to start after the RN8209 so that the overCurrent task is launched after the setup of the sensor
Expand Down Expand Up @@ -1779,6 +1792,17 @@ void loop() {
#if defined(ZdisplaySSD1306)
loopSSD1306();
#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
}

/**
Expand Down
44 changes: 44 additions & 0 deletions prod_env.ini.example
Original file line number Diff line number Diff line change
Expand Up @@ -125,3 +125,47 @@ build_flags =
board_build.flash_mode = dout
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

;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

0 comments on commit 08d46fb

Please sign in to comment.