上下文:我正在使用此 ESP32 S3 变体:https://www.waveshare.com/product/esp32-s3-zero.htm。 ESP32 C3 上的类似设置可以按预期工作 - 即使按钮在运行时使用 OneButton 库也是如此。
对于此简化测试,按钮位于定义的 GPIO 引脚和接地之间(使用万用表验证预期电压)。
我正在尝试在预定义的空闲时间后将 ESP32 S3 置于深度睡眠状态,并通过按下按钮将其唤醒。这是一个简化的草图:
#define PIN_BUTTON GPIO_NUM_7
unsigned long startTime;
unsigned long time2sleep = 15000;
void setup() {
Serial.begin(115200);
delay(500);
if (esp_sleep_is_valid_wakeup_gpio(PIN_BUTTON)) {
Serial.printf("Wakeup pin: %d\n", PIN_BUTTON);
pinMode(PIN_BUTTON, INPUT_PULLUP);
esp_sleep_enable_ext0_wakeup(PIN_BUTTON, 0);
} else {
Serial.printf("Invalid wakeup pin: %d\n", PIN_BUTTON);
}
startTime = millis();
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - startTime < time2sleep) {
return;
}
Serial.printf("Sleeping...\n");
delay(500);
esp_deep_sleep_start();
}
我还尝试使用唤醒掩码等定义 ext1。但是,在这两种情况下,S3 都会在 esp_deep_sleep_start 之后不久自动唤醒:
10:19:04.933 -> Wakeup pin: 7
10:19:19.835 -> Sleeping...
10:19:21.234 -> Wakeup pin: 7
10:19:35.935 -> Sleeping...
10:20:09.467 -> Wakeup pin: 7
10:20:24.229 -> Sleeping...
10:20:57.741 -> Wakeup pin: 7
10:21:12.544 -> Sleeping...
如果我注释掉 GPIO 唤醒部分,S3 将按其应有的方式保持睡眠状态。我尝试了其他引脚(即 3 个),结果相同。
在花了几个小时,包括阅读相关问题后,我已经无能为力了:)请问有人有建议吗?
好吧,经过更多研究后,我终于偶然发现了ESP32外部引脚唤醒与内部上拉电阻。主要技巧是:
#include "driver/rtc_io.h"
这反过来可以访问以下函数,这些函数在 ESP 手册中有所暗示,但如果没有包含则无法编译:
rtc_gpio_pullup_en(PIN_BUTTON);
rtc_gpio_pulldown_dis(PIN_BUTTON);
这使得事情按预期工作 - 也与 OneButton 库结合使用。