我发现很难找到关于如何使用 ESP32C6(ESP32-C6-DevKitC-1,版本 1.12)结合外部 IO 唤醒来实现深度睡眠的可靠信息。经过几天的错误开始,我决定回到基础并尝试以我能想到的符合我的标准的最简单的方式来实现它。我认为我可能遇到的问题与文档中的注释有关:
当 RTC 外设关闭时,内部上拉和下拉不起作用。在这种情况下,需要添加外部电阻。或者,可以使用 esp_sleep_pd_config 函数保持 RTC 外设(和上拉/下拉)启用。
我不明白如何实现
esp_sleep_pd_config()
以及我的用例有哪些最佳选项。如果答案是使用外部上拉,我可以这样做,但我想要将功耗保持在最低限度的最佳选择(并且至少对摆在我面前的选项有一些理解)。
低功耗开关监视器,其中开关可以长时间打开或关闭(而不是瞬时)。开发板应在低电平 -> 高电平和高电平 -> 低电平时唤醒。状态更改后,连接到 WiFi,并向本地服务器发送不安全的 POST 消息。以下草图仅适用于睡眠/唤醒组件。
这是我的简单草图,只是为了唤醒外部 IO 来工作;更改引脚状态没有得到响应(我使用的是 Arduino IDE,而不是 ESP-IDF)。
#include <Arduino.h>
#include <esp_sleep.h>
uint64_t gpio_pin_mask = (1ULL << 4);
RTC_DATA_ATTR unsigned btn_state;
void setup() {
Serial.begin(115200);
pinMode(4, INPUT_PULLUP);
}
void loop() {
if (digitalRead(4) == 0) {
Serial.println("btn state 0");
btn_state = 0;
esp_sleep_enable_ext1_wakeup_io(gpio_pin_mask, ESP_EXT1_WAKEUP_ANY_HIGH);
esp_deep_sleep_start();
} else {
Serial.println("btn state 1");
btn_state = 1;
esp_sleep_enable_ext1_wakeup_io(gpio_pin_mask, ESP_EXT1_WAKEUP_ANY_LOW);
esp_deep_sleep_start();
}
delay(1000);
}
ESP32-C6-DevKitC-1,修订版。 1.12
Arduino IDE 2.3.4(CLI 1.1.1)
上面的逻辑是好的,我的原型有问题。这是一些更干燥的代码,我可以确认它可以在 ESP32C6 上运行,并且还实现了 @romkey 的建议。这是使用 10K 外部电阻运行的,而不是
esp_sleep_pd_config()
。
#include <Arduino.h>
#include <esp_sleep.h>
uint64_t gpio_pin_mask = (1ULL << 4);
RTC_DATA_ATTR unsigned btn_state;
void setup() {
Serial.begin(115200);
pinMode(4, INPUT_PULLUP);
}
void loop() {
btn_state = digitalRead(4);
Serial.println("btn state " + String(btn_state));
if (btn_state == 0) {
esp_sleep_enable_ext1_wakeup_io(gpio_pin_mask, ESP_EXT1_WAKEUP_ANY_HIGH);
} else {
esp_sleep_enable_ext1_wakeup_io(gpio_pin_mask, ESP_EXT1_WAKEUP_ANY_LOW);
}
Serial.println("Entering sleep...");
delay(1500);
esp_deep_sleep_start();
}