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

发布时间:2026/6/13 14:26:52

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功耗测量仪测试下。

相关新闻