微雪 esp32c3 深度睡眠和 gpio 唤醒

当项目由电源适配器供电时,我们一般不会太关心功耗。但是,如果要使用电池为项目供电,则需要精打细算。

esp32 深度睡眠

在深度睡眠模式下,CPU、大多数 RAM 和所有数字外围设备都可以关闭。从深度睡眠中出来后,芯片通过复位重新启动,并从一开始就开始执行程序。系统无法自动进入深度睡眠模式。 esp_deep_sleep_start() 函数用于配置唤醒源后立即进入深度睡眠。

esp32 深度睡眠唤醒源

esp32c3 可以使用 定时器 gpio 等方式唤醒。

esp32 唤醒源:定时器

esp32RTC 控制器具有一个内置定时器,您可以在预定义的时间后用来唤醒 ESP32。

此功能在需要时间戳或日常任务的同时保持低功耗的项目中特别有用。

esp_sleep_enable_timer_wakeup(time_in_us) 函数用于将计时器配置为唤醒源。

#include <esp_sleep.h>

#define uS_TO_S_FACTOR 1000000ULL  /* Conversion factor for micro seconds to seconds */
#define TIME_TO_SLEEP  5           /* Time ESP32 will go to sleep (in seconds) */

void setup(){
  Serial.begin(115200);
  delay(2000); // 给于一定的时间用于开启 Serial 控制台,在深度睡眠的时候是无法连接 esp32 的
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
  
  Serial.println("Going to sleep now");
  esp_deep_sleep_start();
}

这个程序将每 5s 唤醒一次,然后再次入睡。

esp32 唤醒源:gpio 唤醒

有时候我们需要通过按钮来唤醒 esp32。这里通过 gpio0 来唤醒。注意 esp32c3 只能通过 gpio 0-5 来唤醒。

代码演示使用 gpio0 触发低电平(接地)来唤醒。

#include <esp_sleep.h>

void setup(){
  Serial.begin(115200);
  delay(2000); // 给于一定的时间用于开启 Serial 控制台,在深度睡眠的时候是无法连接 esp32 的
  
  // 要使得 gpio0 唤醒,下面 2 行代码是关键
  gpio_set_direction(GPIO_NUM_0, GPIO_MODE_INPUT);
  esp_deep_sleep_enable_gpio_wakeup(BIT(0), ESP_GPIO_WAKEUP_GPIO_LOW);

  Serial.println("Going to sleep now");
  esp_deep_sleep_start();
}
posted @ 2024-04-26 09:31  LiuChengloong  阅读(25)  评论(0编辑  收藏  举报