3 #include "LowPowerCommon.h"
4 #include "driver/gpio.h"
5 #include "driver/rtc_io.h"
6 #include "esp32-hal-touch.h"
9 #define TOUCH_THREASHOLD 40
14 enum class wakeup_t { ext0, ext1 };
16 #if defined(CONFIG_IDF_TARGET_ESP32C3) || \
17 defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32H2)
18 #define ESP_STD_SLEEP 0
20 #define ESP_STD_SLEEP 1
52 case sleep_mode_enum_t::noSleep:
55 case sleep_mode_enum_t::lightSleep:
58 case sleep_mode_enum_t::deepSleep:
61 case sleep_mode_enum_t::modemSleep:
71 case sleep_mode_enum_t::lightSleep:
72 esp_light_sleep_start();
74 case sleep_mode_enum_t::deepSleep:
75 esp_deep_sleep_start();
77 case sleep_mode_enum_t::noSleep:
78 wifiSetPS(WIFI_PS_NONE);
79 delay(sleep_time_us / 1000);
82 case sleep_mode_enum_t::modemSleep:
83 wifiSetPS(WIFI_PS_MAX_MODEM);
84 delay(sleep_time_us / 1000);
92 if (sleep_mode == sleep_mode_enum_t::modemSleep)
return false;
93 sleep_time_us = toUs(time, time_unit);
94 return esp_sleep_enable_timer_wakeup(toUs(time, time_unit)) == ESP_OK;
99 if (sleep_mode == sleep_mode_enum_t::modemSleep)
return false;
100 pin_mask |= 1 << pin;
101 switch (change_type) {
102 case pin_change_t::on_high: {
103 if (wakeup_type == wakeup_t::ext0)
104 esp_sleep_enable_ext0_wakeup((gpio_num_t)pin, 1);
106 esp_sleep_enable_ext1_wakeup_io(pin_mask,
107 ESP_EXT1_WAKEUP_ANY_HIGH);
110 rtc_gpio_pulldown_en((gpio_num_t)pin);
112 rtc_gpio_pullup_dis((gpio_num_t)pin);
115 case pin_change_t::on_low: {
116 if (wakeup_type == wakeup_t::ext0)
117 esp_sleep_enable_ext0_wakeup((gpio_num_t)pin, 0);
119 esp_sleep_enable_ext1_wakeup_io(pin_mask,
120 ESP_EXT1_WAKEUP_ALL_LOW);
122 rtc_gpio_pullup_en((gpio_num_t)pin);
123 rtc_gpio_pulldown_dis((gpio_num_t)pin);
134 #if CONFIG_IDF_TARGET_ESP32H2
135 bool addWakeupPin(
int pin, pin_change_t change_type)
override {
136 if (sleep_mode == sleep_mode_enum_t::modemSleep)
return false;
138 gpio_wakeup_enable((gpio_num_t)pin, change_type == pin_change_t::on_high
140 : GPIO_INTR_NEGEDGE);
141 esp_sleep_enable_gpio_wakeup();
146 #if !ESP_STD_SLEEP && !CONFIG_IDF_TARGET_ESP32H2
147 bool addWakeupPin(
int pin, pin_change_t change_type)
override {
148 if (sleep_mode == sleep_mode_enum_t::modemSleep)
return false;
149 pin_mask |= 1 << pin;
150 if (sleep_mode == sleep_mode_enum_t::deepSleep) {
151 esp_deep_sleep_enable_gpio_wakeup(pin_mask,
152 change_type == pin_change_t::on_high
153 ? ESP_GPIO_WAKEUP_GPIO_HIGH
154 : ESP_GPIO_WAKEUP_GPIO_LOW);
157 if (sleep_mode == sleep_mode_enum_t::lightSleep) {
158 gpio_wakeup_enable((gpio_num_t)pin, change_type == pin_change_t::on_high
160 : GPIO_INTR_NEGEDGE);
161 esp_sleep_enable_gpio_wakeup();
171 if (!isTouchPin(pin))
return false;
172 touchSleepWakeUpEnable(pin, touch_threshold);
195 wifiSetPS(WIFI_PS_NONE);
200 void setCpuFrequencyMhz(
int mhz){
201 ::setCpuFrequencyMhz(mhz);
205 wakeup_t wakeup_type = wakeup_t::ext1;
206 uint32_t sleep_time_us = 0;
207 std::vector<int> touch_pins;
208 uint32_t pin_mask = 0;
210 void wifiSetPS(wifi_ps_type_t type) {
211 #if !CONFIG_IDF_TARGET_ESP32H2
212 esp_wifi_set_ps(type);
216 bool isTouchPin(
int pin) {
217 for (
int tp : touch_pins) {
218 if (tp == pin)
return true;
224 RTC_DATA_ATTR
static ArduinoLowPowerESP32 LowPower;
Common API for power saving modes for different processor architectures.
Definition: LowPowerCommon.h:33
virtual void clear()
reset the processing
Definition: LowPowerCommon.h:117
Low Power Management for ESP32:
Definition: LowPowerESP32.h:47
void clear() override
Reset to the initial state.
Definition: LowPowerESP32.h:192
bool addWakeupTouchPin(int pin, int touch_threshold=TOUCH_THREASHOLD)
Wakup by touch pin.
Definition: LowPowerESP32.h:169
void setWakeupType(wakeup_t wakeup)
There are two types for ESP32, ext0 and ext1 . ext0 uses RTC_IO to wakeup thus requires RTC periphera...
Definition: LowPowerESP32.h:187
bool sleep(void) override
sets processor into sleep mode
Definition: LowPowerESP32.h:69
bool setSleepTime(uint32_t time, time_unit_t time_unit) override
Defines the sleep time.
Definition: LowPowerESP32.h:91
bool isModeSupported(sleep_mode_enum_t sleep_mode) override
Provides information if the indicated mode is supported.
Definition: LowPowerESP32.h:189
bool isProcessingOnSleep(sleep_mode_enum_t sleep_mode)
Returns true if processing is possible in the current sleep mode.
Definition: LowPowerESP32.h:49
bool addWakeupPin(int pin, pin_change_t change_type) override
Defines the wakup pin.
Definition: LowPowerESP32.h:98