#author("2022-03-09T19:10:28+08:00","default:Admin","Admin") #author("2023-01-16T16:32:45+08:00","default:Admin","Admin") [[ESP32]] &color(red){※This article is based on esp-idf 4.2.1}; #contents * 概要 [#d4811ba9] ESP32做低功耗不是一个好的选择 #codeprettify{{ https://www.icxbk.com/ask/detail/20819.html https://diyprojects.io/esp32-arduino-code-for-deep-sleep-and-wake-ups-timer-touch-pad-gpio/#.YXFOamJByUk }} * 5种功耗模式 [#n2b4566b] Active 模式、Modem-sleep 模式、Light-sleep 模式、Deep-sleep 模式、休眠模式. 除了Active模式外其他四种模式都属于低功耗模式,按照顺序越往后功耗越低,工作的模块越少。modem-sleep的电流消耗为30mA~3mA,Light-sleep的电流消耗为800uA,deep-sleep模式的电流消耗为6.5uA,休眠模式的电流消耗最低可以达到4.5uA,可以看到esp32在低功耗模式是非常强大的。 &ref(ESP32_powersave1.png); ** Deep Sleep [#b767262e] - deep sleep睡眠时 CPU 与 SRAM 均掉电,唤醒后 CPU 需要重新初始化 wiif,睡眠后连接会断开。 - 连接是一个双方验证的过程,超时断开后连接信息会废弃,保持一方的连接参数信息没有意义。所以仅仅保存路由器的信道可以加速连接,并无方法维持上一次连接。 * 唤醒源 [#of2949a8] |唤醒源|Light-Sleep|Deep-sleep|休眠|h |EXT0|Y|Y|-| |EXT1|Y|Y|Y| |GPIO|Y|Y|-| |RTC计时器|Y|Y|Y| |SDIO|Y|-|-| |Wi-Fi|Y|-|-| |UART0|Y|-|-| |UART1|Y|-|-| |TOUCH|Y|Y|-| |ULP协处理器|Y|Y|-| |BT|Y|-|-| API ||Method|Modem-Sleep|Light-Sleep|Deep-Sleep|Hibernate|h |Timer|esp_sleep_enable_timer_wakeup()|✓|✓|✓|✓| |Touch|esp_sleep_enable_touchpad_wakeup()|✓|✓|✓|| |Ext0 or Ext1|esp_sleep_enable_ext0_wakeup() &br;esp_sleep_enable_ext1_wakeup()|✓|✓|✓|| |GPIO|esp_sleep_enable_gpio_wakeup()|✓|✓||| |UART|esp_sleep_enable_uart_wakeup()|✓|✓||| |ULP|esp_sleep_enable_ulp_wakeup()|✓|✓|✓|| ** EXT0/1唤醒源 [#j124ee7c] 只能使用以下几个GPIO - GPIO_0 - GPIO_2 - GPIO_4 - GPIO_12 - GPIO_13 - GPIO_14 - GPIO_15 - GPIO_25 - GPIO_26 - GPIO_27 - GPIO_32 - GPIO_33 - GPIO_34 - GPIO_35 ** 例程 [#i962ed1d] #codeprettify{{ EXT0唤醒 void app_main() { switch(esp_speep_get_wakeup_cause()) switch(esp_sleep_get_wakeup_cause()) { case ESP_SLEEP_WAKEUP_EXT0: printf("wake up.........\n"); break; case ESP_SLEEP_WAKEUP_UNDEFINED: default: printf("not sleep...............\n"); break; } //第一个参数:RTCIO的编号 //第二个参数:是高电平唤醒还是低电平唤醒 esp_sleep_enable_ext0_wakeup(34,0); esp_deep_sleep_start(); } EXT1唤醒 void app_main() { switch(esp_speep_get_wakeup_cause()) { case ESP_SLEEP_WAKEUP_EXT1: printf("wake up.........\n"); break; case ESP_SLEEP_WAKEUP_UNDEFINED: default: printf("not sleep...............\n"); break; } uint64_t mask; mask = 1ull << 34; //第一个参数:mask位,如果引脚为34 则mask = 1ull<<34 //第二个参数:是高电平唤醒还是低电平唤醒 esp_sleep_enable_ext1_wakeup(mask,0); esp_deep_sleep_start(); } }} #hr(); コメント: #comment_kcaptcha