esp32开发与应用(深度睡眠)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

对于嵌入式设备,有些是需要部署在外面的。这些外部环境,不是所有地方都有条件外接电源的,所以很多设备本身不能一直维持在高速运行的状态,需要有时采集数据,有时处于深度睡眠状态,这样设备可以长时间处于低功耗状态,大大降低人工维护的成本。今天正好看一下,esp32怎么进入深度睡眠的。

1、如何进入睡眠

进入睡眠比较简单,调用esp_deep_sleep_start即可。

2、如何恢复

调用esp_sleep_enable_timer_wakeup这个函数,也就是说在进入深度睡眠之前,有必要告诉系统大约什么时候恢复,以什么样的形式恢复。

3、一直在内存中的数据

对于系统来说,系统恢复就好像是重启了一样,但是系统中的一些数据还是在的,只要它还保存在RTC_DATA_ATTR这个区域内。这就是深度睡眠和冷重启最大的区别所在。

4、编写示例代码

代码部分尽量让ai编写,因为esp32的case比较多,相关demo也不少,所以ai这部分基本上可以马上给出demo代码,我们会看懂就好。

复制代码
#include <stdio.h>
#include <string.h>
#include "esp_sleep.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"      // Add FreeRTOS header
#include "freertos/task.h"           // Add task header (contains vTaskDelay)

static const char *TAG = "TIMER_WAKEUP";

// Variable defined in RTC memory, data will not be lost during Deep Sleep
RTC_DATA_ATTR static int boot_count = 0;

// Print wakeup reason
static void print_wakeup_reason(void) {
    esp_sleep_wakeup_cause_t cause = esp_sleep_get_wakeup_cause();
    
    switch(cause) {
        case ESP_SLEEP_WAKEUP_TIMER:
            ESP_LOGI(TAG, "Wakeup reason: Timer wakeup");
            break;
        case ESP_SLEEP_WAKEUP_UNDEFINED:
            ESP_LOGI(TAG, "Wakeup reason: Power-on/Reset (first boot)");
            break;
        default:
            ESP_LOGI(TAG, "Wakeup reason: Other (code: %d)", cause);
            break;
    }
}

void app_main(void) {
    // Increment boot counter
    boot_count++;
    ESP_LOGI(TAG, "========================================");
    ESP_LOGI(TAG, "System boot - Count: %d", boot_count);
    ESP_LOGI(TAG, "========================================");
    
    // Print wakeup reason
    print_wakeup_reason();
    
    // Configure timer wakeup: wake up after 10 seconds (unit: microseconds)
    esp_sleep_enable_timer_wakeup(10 * 1000000ULL);
    ESP_LOGI(TAG, "✅ Timer wakeup configured, will wake up after 10 seconds");
    
    // Display countdown (optional, for debugging)
    for (int i = 10; i > 0; i--) {
        ESP_LOGI(TAG, "⏰ Entering sleep in %d seconds...", i);
        vTaskDelay(1000 / portTICK_PERIOD_MS);  // Delay 1000ms
    }
    
    // Enter Deep Sleep
    ESP_LOGI(TAG, "😴 Entering Deep Sleep mode...");
    ESP_LOGI(TAG, "========================================");
    
    // Flush log buffer to ensure all logs are output
    esp_log_timestamp();
    vTaskDelay(100 / portTICK_PERIOD_MS);
    
    // Enter deep sleep (system will pause here)
    esp_deep_sleep_start();
    
    // This line will never be executed
    ESP_LOGE(TAG, "Error: System should not reach here!");
}

5、编译、测试和学习

代码都ok了,就可以编译、烧录测试一下,看看系统是不是循环进入类似重启的状态。这种编程模式非常省电,对于一些场景,比如数据采集,都是非常实用的一个做法。有兴趣的同学,可以继续看看不同mode下,对应的功耗是多少,例如可以买一个usb功耗测量仪测试下。

相关推荐
Brilliantwxx36 分钟前
【STM32】 NVIC 与 EXTI 中断 · 超详细源码级解析
stm32·单片机·嵌入式硬件
加载力科技2 小时前
硬盘咔咔响是坏盘信号!赶在数据丢失前克隆换盘:不重装系统、不丢文件
windows·嵌入式硬件·系统安全·策略模式·命令模式·硬盘
思茂信息3 小时前
CST软件BCI仿真模型及仿真案例
开发语言·单片机·嵌入式硬件·算法·emc
李永奉4 小时前
中科蓝讯SDK开发-BT897X、BT891X、AB573X、AB572X 系列 触摸按键提示音功能实现
网络·单片机·嵌入式硬件·mcu·物联网
三佛科技-187366133975 小时前
FT32F405RE02-LB是什么芯片?基于ARM Cortex M4带FPU的MCU芯片解析
stm32·单片机·嵌入式硬件
嵌入式分享6 小时前
嵌入式分#49:浅 8080,RGB,LVDS 与 MIPI 显口
嵌入式硬件·lcd
szarron6 小时前
VNA6 便携式矢量网络分析仪|1MHz‑6.3GHz 手持 VNA 真实应用场景全解析
前端·嵌入式硬件·信息可视化·数据挖掘·数据分析
゛凌乱的记忆づ7 小时前
50元从零到成品:一套AI辅助的嵌入式实战入门教程——ADC采集篇
stm32·单片机·嵌入式硬件
女神下凡7 小时前
芯参谋(31):SPI NOR Flash 电路设计指南
arm开发·单片机·嵌入式硬件·fpga开发·设计规范
csg11078 小时前
上电没反应、运行中死机、现场“抽风”——单片机控制板异常排查六步法
单片机·嵌入式硬件