使用Arduino开发ESP32:DeepSleep和RTC Memory的使用

网友投稿 2019-07-31 14:27

目的

ESP32在工作时功耗蛮大的,所以我们可以在不需要时进行休眠,这也是蛮常用的功能。

基础说明

DeepSleep

使用DeepSleep主要分为两步:

    1、配置唤醒源(可以同时配置多个唤醒源);

    2、启动DeepSleep;

EPS32 DeepSleep的唤醒源有如下几个:

```定时器;

```触摸信号(touchpad);

```Ext(0):RTC IO 中某个指定 GPIO 满足指定电平即唤醒;

```Ext(1):RTC IO 中某些指定 GPIO 同时满足指定电平即唤醒;

```ULP 协处理器;

在启动DeepSleep后ESP32只剩RTC相关模块继续工作,其它所有模块全部关闭,所以我们需要根据需求手动处理一些事务,比如手动结束蓝牙、wifi等工作

(esp_bluedroid_disable() esp_bt_controller_disable() esp_wifi_stop());

从DeepSleep唤醒后在Arduino core for the ESP32中对于用户来说程序将重新从void setup(){}开始运行;

RTC Memory

ESP32在进入DeepSleep时内存中所有的数据将无法保持,如果我们需要将某些数据进行存储的话使用RTC Memory是不错的选择。ESP32有快速和慢速两片RTC内存区域,各8K大小。对于我们用户引用来说用来存储数据主要用到慢速的RTC内存。

使用RTC_DATA_ATTR标记的数据将被放置在RTC内存中,比如RTC_DATA_ATTR int data = 0;,在程序中可以通过变量名直接访问。

使用示例

使用下面代码进行测试:

RTC_DATA_ATTR int bootCount = 0; //将变量存放于RTC Memory

void setup()

{

  Serial.begin(115200);

  Serial.println();

  bootCount++; //累加计数值

  Serial.printf("这是第 %d 次复位n", bootCount);

  switch(esp_sleep_get_wakeup_cause()) //获取唤醒原因

  {

    case ESP_SLEEP_WAKEUP_TIMER : Serial.println("通过定时器唤醒"); break;

    case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("通过触摸唤醒"); break;

    case ESP_SLEEP_WAKEUP_EXT0 : Serial.println("通过EXT0唤醒"); break;

    case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("通过EXT1唤醒"); break;

    case ESP_SLEEP_WAKEUP_ULP : Serial.println("通过ULP唤醒"); break;

    default : Serial.println("并非从DeepSleep中唤醒"); break;

  }

  esp_sleep_enable_timer_wakeup(4000000); //设置定时器4秒唤醒

  esp_deep_sleep_start(); //启动DeepSleep

}

void loop()

{

}

https://cdn.china-scratch.com/timg/190802/142IM5N-0.jpg

部分方法说明

esp_err_t esp_sleep_enable_timer_wakeup(uint64_t time_in_us)

设置通过定时器唤醒,输入参数为微秒计数时间;

esp_err_t esp_sleep_enable_ext0_wakeup(gpio_num_t gpio_num, int level)

设置通过外部唤醒,输入参数为gpio口(如GPIO_NUM_35),电平(0=low 1=high);

可以使用的IO口为0,2,4,12-15,25-27,32-39;

void esp_deep_sleep_start()

启动DeepSleep;

void esp_deep_sleep(uint64_t time_in_us)

相当于直接设置定时器唤醒并启动DeepSleep;

esp_sleep_wakeup_cause_t esp_sleep_get_wakeup_cause()

返回DeepSleep唤醒源,具体如下:

ESP_SLEEP_WAKEUP_UNDEFINED reset was not caused by exit from deep sleep

ESP_SLEEP_WAKEUP_EXT0

ESP_SLEEP_WAKEUP_EXT1

ESP_SLEEP_WAKEUP_TIMER

ESP_SLEEP_WAKEUP_TOUCHPAD

ESP_SLEEP_WAKEUP_ULP

ESP_SLEEP_WAKEUP_GPIO light sleep only

ESP_SLEEP_WAKEUP_UART light sleep only

--end--

声明:本文章由网友投稿作为教育分享用途,如有侵权原作者可通过邮件及时和我们联系删除:freemanzk@qq.com