使用Arduino开发ESP32(十四):DeepSleep&RTC Memory

基本介绍:

ESP32正常运转功率大,在不需要的时候,使其休眠以降低功耗

DeepSleep

使用步骤
1.配置唤醒源(可以配置多个唤醒源);
2.启动DeepSleep;

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 count = 0; //将变量存放于RTC Memory

void setup()
{
  Serial.begin(115200);
  Serial.println();

  count++; //累加计数
  Serial.printf("这是第 %d 次复位\n", count);

  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()
{
}

结果:
在这里插入图片描述

参考文章:
使用Arduino开发ESP32(16):DeepSleep和RTC Memory的使用

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值