我这里有一个 esp32 的简单代码。我只能使用板上的 GPIO 引脚号 35。 因此 esp32 应该进入浅睡眠状态并在按下按钮时唤醒。 当我运行下面的程序时,我的 esp32 进入浅睡眠状态,但按下按钮时它不会唤醒。 有什么问题?有什么想法吗?谢谢你。
#include <esp_sleep.h>
void setup() {
Serial.begin(115200);
delay(2000);
gpio_wakeup_enable(GPIO_NUM_35, GPIO_INTR_HIGH_LEVEL);
esp_sleep_enable_gpio_wakeup();
delay(2000);
Serial.println("Going to sleep now");
delay(2000);
esp_light_sleep_start();
delay(2000);
Serial.println("This will be NOT printed");
}
void loop() {
delay(2000);
Serial.println("Hi after wake up via GPIO Button!");
delay(2000);
}
我自己找出了问题所在:只需更改为 rtc_io ext0 并将 level 设置为 0。然后就可以正常工作了。 (也许这会对其他用户有所帮助。)
我找到了解决方案,我已经更新了代码和解决方案,在这里,
先决条件:
我添加了几个额外的功能:
#include <esp_sleep.h>
#include "esp32/rom/uart.h"
#include "driver/rtc_io.h"
void setup() {
Serial.begin(115200);
gpio_wakeup_enable(GPIO_NUM_15, GPIO_INTR_HIGH_LEVEL);
esp_sleep_enable_timer_wakeup(5000000);
rtc_gpio_pulldown_en(GPIO_NUM_15);
rtc_gpio_pullup_dis(GPIO_NUM_15);
Serial.println("Going to sleep now");
uart_tx_wait_idle(CONFIG_ESP_CONSOLE_UART_NUM);
esp_sleep_enable_ext0_wakeup(GPIO_NUM_15, 1);
esp_light_sleep_start();
delay(2000);
Serial.println("This will be printed");
}
void loop() {
if (rtc_gpio_get_level(GPIO_NUM_15) == 1) {
printf("please release button\n");
do
{
vTaskDelay(pdMS_TO_TICKS(10));
} while (rtc_gpio_get_level(GPIO_NUM_15) == 1);
}
Serial.println("Hi after wake up!");
Serial.println("Going to sleep now!");
uart_tx_wait_idle(CONFIG_ESP_CONSOLE_UART_NUM);
esp_light_sleep_start();
}
对于任何有 RTOS 背景的人,这是我的解决方案,
#include "driver/rtc_io.h"
#include "stdio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_sleep.h"
#include "esp32/rom/uart.h"
#include "time.h"
#include "sys/time.h"
#include "esp_timer.h"
#define PIN_SWITCH 15
#define PIN_LED 2
void app_main()
{
printf("\nSleep Program Running..\n");
gpio_set_direction(PIN_SWITCH, GPIO_MODE_INPUT);
gpio_wakeup_enable(PIN_SWITCH, GPIO_INTR_HIGH_LEVEL);
rtc_gpio_pulldown_en(PIN_SWITCH);
rtc_gpio_pullup_dis(PIN_SWITCH);
gpio_set_direction(PIN_LED, GPIO_MODE_OUTPUT);
esp_sleep_enable_timer_wakeup(5000000);
while (true)
{
if (rtc_gpio_get_level(PIN_SWITCH) == 1)
{
printf("please release button\n");
do
{
vTaskDelay(pdMS_TO_TICKS(10));
} while (rtc_gpio_get_level(PIN_SWITCH) == 1);
}
printf("Going for a nap\n");
uart_tx_wait_idle(CONFIG_ESP_CONSOLE_UART_NUM);
int64_t before = esp_timer_get_time();
gpio_set_level(PIN_LED, 0);
esp_sleep_enable_ext0_wakeup(PIN_SWITCH, 1);
esp_light_sleep_start();
gpio_set_level(PIN_LED, 1);
int64_t after = esp_timer_get_time();
esp_sleep_wakeup_cause_t reason = esp_sleep_get_wakeup_cause();
printf("Waked up Event %d - Sleep for %lld \n", reason, (after - before) / 1000);
vTaskDelay(1);
}
}