文章目录

  • 目的
  • 基础说明
    • DeepSleep
    • RTC Memory
  • 使用示例
  • 部分方法说明
  • 总结

目的

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

部分方法说明

  • 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

总结

DeepSleep和RTC内容其实不少,这里只是列举了一些基础的,更多需求可以参考如下:
https://blog.csdn.net/espressif/article/details/79360365
https://github.com/espressif/arduino-esp32/tree/master/libraries/ESP32/examples/DeepSleep
https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/system/sleep_modes.html
https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/deep-sleep-stub.html

使用Arduino开发ESP32(16):DeepSleep和RTC Memory的使用相关推荐

  1. 使用Arduino开发ESP32(11):IO口与相关外设说明与记录

    文章目录 目的 数字IO口 基本使用 外部中断 使用示例 参考链接 LEDC(PWM) 常用方法 使用示例 参考链接 SigmaDelta 参考链接 ADC 常用方法 使用示例 参考链接 存在的问题 ...

  2. 使用Arduino开发ESP32(八):ESP32的EPROM的写入读取

    写入EPROM /* 该代码向EEPROM写入4096字节数据 */ #include <EEPROM.h>void setup() {Serial.begin(115200);Seria ...

  3. 使用Arduino开发ESP32(13):SD卡的使用

    文章目录 目的 SDMMC方式 常用方法 使用示例 SPI方式 常用方法 使用示例 注意事项 总结 目的 对于嵌入式设备来说SD卡也是个比较好用的功能,比如用来存放设备的配置文件.日志文件.执行脚本. ...

  4. 使用Arduino开发ESP32(07):系统时间和定时任务调度器Ticker

    文章目录 目的 系统时间及应用 定时任务调度器Ticker 使用步骤 常用方法 使用事例 事例一 事例二 事例三 总结 目的 开发中经常会用到时间相关操作,主要就是用到系统时间.延时操作.定时任务调度 ...

  5. 使用Arduino开发ESP32(21):蓝牙基础说明与作为服务器使用

    文章目录 目的 蓝牙基础说明 测试工具 作为服务器使用 创建蓝牙设备并广播 创建Server 创建Service并启动 创建Characteristic 读写Characteristic中的Value ...

  6. 使用Arduino开发ESP32:wifi基本功能使用

    1.建立网络(AP) 2.连接网络(STA) 3.扫描网络 1.建立网络(AP) 只需两步:1.引用WiFi库include<WiFi.h> 2.启动AP网络WiFi.softAP(ssi ...

  7. 使用Arduino开发ESP32(06):Ethernet的使用(基于LAN8720)

    文章目录 目的 基本说明 接线定义 使用步骤 常用方法说明 使用演示 数据通讯 事件响应 其他说明 PHY地址 时钟 通讯应用 总结 目的 ESP32除了可以使用无线网络外还可以通过外接PHY模块来使 ...

  8. 基于arduino 开发 esp32 点亮ili9341屏幕

    第一次编写csdn文章,也同时做一下笔记方便以后可以快速上手, 内容介绍:用esp32利用arduino点亮ili9341屏幕,本章内容没有触控以及,函数的使用介绍 ili9341引脚介绍: 1 VC ...

  9. 使用Arduino开发ESP32:关于esp32 wifi连接不上的解决办法

    今天在学习MQTT订阅的过程中 发现esp32时钟连接不上wifi 主体代码如下: while(WiFi.status()!=WL_CONNECTED){delay(200);Serial.print ...

最新文章

  1. 二、深度学习数据增强方法汇总
  2. 关于Exchange Server 201数据库故障处理
  3. 上拉加载 php,php+jquery 上拉加载
  4. 2023年考研之路或将更难
  5. Android之实现首尾带圆角的多颜色水平条
  6. 学者:比特币暴涨有合理性但仍应警惕其风险
  7. HADOOP生态圈知识概述
  8. Eclipse安装SVN插件三种方式
  9. Javascrīpt开发工具大集合
  10. itest听力答案2020_itest大学英语测试答案2019
  11. 微信公众号应用开发(一)
  12. 思源宋体+Courier New字体
  13. android分享微信获取资源失败怎么办,Android处理使用Intent分享图片,以及在微信7.0版本出现“获取资源失败,无法分享到朋友圈”,导致分享失败的问题...
  14. python代码情话_python教你谈恋爱-之-土味情话5000条
  15. 肾囊肿有什么症状呢?
  16. 十年,AMD“三剑合一”再出击
  17. 【JZOJ2109】清兵线【dp】
  18. LiveGBS国标GB/T28181如何配置按需云端录像(播放时候录像)和一直录像
  19. 再先进的在线教学,也要回归这个本质
  20. python 量化交易:MACD指标双金叉形态识别

热门文章

  1. 小程序在日常遇到的一些限制及解决方法
  2. 新云东方:正在打造一个怎样的科幻证人
  3. 训练营第四天作业 - 用盒子模型制作卡片
  4. 可解释性论文笔记:Interpretability Beyond Feature Attribution(TCAV)
  5. AD软件制手工板导出元器件流水号
  6. 抖音直播间增加人气的几个妙招:国仁楠哥
  7. 货运服务网络设计:经典文献阅读笔记(1)
  8. t480s java,Appium 多点触摸报错
  9. 湖北首富是谁?有怎样的发家历程?
  10. PDF变小的简单方法分享