在 esp32 上通过 GPIO 进行浅睡眠唤醒

问题描述 投票:0回答:2

我这里有一个 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); 
}
sleep esp32 gpio light wakeup
2个回答
2
投票

我自己找出了问题所在:只需更改为 rtc_io ext0 并将 level 设置为 0。然后就可以正常工作了。 (也许这会对其他用户有所帮助。)


0
投票

我找到了解决方案,我已经更新了代码和解决方案,在这里,

先决条件:

  • 按钮在 GPIO PIN 处连接 3.3V(在我的例子中,用于 ESP32 Devkit v3 的 GPIO-15)

我添加了几个额外的功能:

  • uart_tx_wait_idle(CONFIG_ESP_CONSOLE_UART_NUM),这样esp32会等到所有console都打印出来,否则会中途中断。
  • 设置适当的下拉电阻(对于初学者来说,这有一个非常清晰的解释 - https://www.youtube.com/watch?v=_8HYjjaT7BM
  • esp_sleep_enable_ext0_wakeup 用于监听唤醒端口。
#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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.