#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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS