定时器唤醒

ESP32 可以进入深度睡眠模式,然后在预定义的时间段内唤醒。如果您正在运行需要时间戳或日常任务的项目,同时保持低功耗,则此功能特别有用。

ESP32 RTC 控制器具有一个内置计时器,可用于在预定义的时间后唤醒 ESP32。

启用定时器唤醒

让 ESP32 在预定义的时间后唤醒非常简单。在 Arduino IDE 中,您只需在以下函数中以微秒为单位指定休眠时间:

esp_sleep_enable_timer_wakeup(time_in_us)

法典

让我们使用库中的示例来看看它是如何工作的。打开 Arduino IDE,转到 ESP32 >深度睡眠>文件>示例,然后打开 TimerWakeUp 草图。

/*
Simple Deep Sleep with Timer Wake Up
=====================================
ESP32 offers a deep sleep mode for effective power
saving as power is an important factor for IoT
applications. In this mode CPUs, most of the RAM,
and all the digital peripherals which are clocked
from APB_CLK are powered off. The only parts of
the chip which can still be powered on are:
RTC controller, RTC peripherals ,and RTC memoriesThis code displays the most basic deep sleep with
a timer to wake it up and how to store data in
RTC memory to use it over rebootsThis code is under Public Domain License.Author:
Pranav Cherukupalli <cherukupallip@gmail.com>
*/#define uS_TO_S_FACTOR 1000000  /* Conversion factor for micro seconds to seconds */
#define TIME_TO_SLEEP  5        /* Time ESP32 will go to sleep (in seconds) */RTC_DATA_ATTR int bootCount = 0;/*
Method to print the reason by which ESP32
has been awaken from sleep
*/
void print_wakeup_reason(){esp_sleep_wakeup_cause_t wakeup_reason;wakeup_reason = esp_sleep_get_wakeup_cause();switch(wakeup_reason){case ESP_SLEEP_WAKEUP_EXT0 : Serial.println("Wakeup caused by external signal using RTC_IO"); break;case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break;case ESP_SLEEP_WAKEUP_TIMER : Serial.println("Wakeup caused by timer"); break;case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("Wakeup caused by touchpad"); break;case ESP_SLEEP_WAKEUP_ULP : Serial.println("Wakeup caused by ULP program"); break;default : Serial.printf("Wakeup was not caused by deep sleep: %d\n",wakeup_reason); break;}
}void setup(){Serial.begin(115200);delay(1000); //Take some time to open up the Serial Monitor//Increment boot number and print it every reboot++bootCount;Serial.println("Boot number: " + String(bootCount));//Print the wakeup reason for ESP32print_wakeup_reason();/*First we configure the wake up sourceWe set our ESP32 to wake up every 5 seconds*/esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);Serial.println("Setup ESP32 to sleep for every " + String(TIME_TO_SLEEP) +" Seconds");/*Next we decide what all peripherals to shut down/keep onBy default, ESP32 will automatically power down the peripheralsnot needed by the wakeup source, but if you want to be a poweruserthis is for you. Read in detail at the API docshttp://esp-idf.readthedocs.io/en/latest/api-reference/system/deep_sleep.htmlLeft the line commented as an example of how to configure peripherals.The line below turns off all RTC peripherals in deep sleep.*///esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_OFF);//Serial.println("Configured all RTC Peripherals to be powered down in sleep");/*Now that we have setup a wake cause and if needed setup theperipherals state in deep sleep, we can now start going todeep sleep.In the case that no wake up sources were provided but deepsleep was started, it will sleep forever unless hardwarereset occurs.*/Serial.println("Going to sleep now");delay(1000);Serial.flush(); esp_deep_sleep_start();Serial.println("This will never be printed");
}void loop(){//This is not going to be called
}

查看原始代码

让我们看一下此代码。第一条评论描述了在深度睡眠和定时器唤醒期间关闭电源的内容。

In this mode CPUs, most of the RAM,
and all the digital peripherals which are clocked
from APB_CLK are powered off. The only parts of
the chip which can still be powered on are:
RTC controller, RTC peripherals ,and RTC memories

使用定时器唤醒时,将通电的部件是RTC控制器、RTC外设和RTC存储器。

定义睡眠时间

前两行代码定义了 ESP32 将休眠的时间段。

#define uS_TO_S_FACTOR 1000000 /* Conversion factor for micro seconds to seconds */
#define TIME_TO_SLEEP 5 /* Time ESP32 will go to sleep (in seconds) */

此示例使用从微秒到秒的转换因子,以便您可以在TIME_TO_SLEEP在几秒钟内变量。在这种情况下,该示例会将 ESP32 置于深度睡眠模式 5 秒钟。

将数据保存在 RTC 存储器上

借助 ESP32,您可以将数据保存在 RTC 存储器上。ESP32 在 RTC 部分具有 8kB SRAM,称为 RTC 快速存储器。保存在此处的数据在深度睡眠期间不会被删除。但是,当您按下重置按钮(ESP32 开发板上标有 EN 的按钮)时,它将被擦除。

要将数据保存在RTC存储器上,您只需添加RTC_DATA_ATTR在变量定义之前。该示例保存启动计数变量。此变量将计算 ESP32 从深度睡眠中醒来的次数。

RTC_DATA_ATTR int bootCount = 0;

唤醒原因

然后,代码定义print_wakeup_reason()函数,打印 ESP32 从睡眠状态唤醒的原因。

void print_wakeup_reason(){esp_sleep_wakeup_cause_t wakeup_reason;wakeup_reason = esp_sleep_get_wakeup_cause();switch(wakeup_reason){case ESP_SLEEP_WAKEUP_EXT0 : Serial.println("Wakeup caused by external signal using RTC_IO"); break;case ESP_SLEEP_WAKEUP_EXT1 : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break;case ESP_SLEEP_WAKEUP_TIMER : Serial.println("Wakeup caused by timer"); break;case ESP_SLEEP_WAKEUP_TOUCHPAD : Serial.println("Wakeup caused by touchpad"); break;case ESP_SLEEP_WAKEUP_ULP : Serial.println("Wakeup caused by ULP program"); break;default : Serial.printf("Wakeup was not caused by deep sleep: %d\n",wakeup_reason); break;}
}

设置()

在setup()是您应该放置代码的位置。在深度睡眠中,素描永远不会到达loop()陈述。所以,你需要把所有的草图都写在setup().

此示例首先以波特率为 115200 初始化串行通信。

Serial.begin(115200);

然后,启动计数变量在每次重新启动时都会增加一个,并且该数字将打印在串行监视器中。

++bootCount;
Serial.println("Boot number: " + String(bootCount));

然后,代码调用print_wakeup_reason()函数,但您可以调用任何要执行所需任务的函数。例如,您可能希望每天唤醒一次 ESP32,以便从传感器读取值。

接下来,代码使用以下函数定义唤醒源:

esp_sleep_enable_timer_wakeup(time_in_us)

此函数接受以微秒为单位的睡眠时间作为参数,如前所述。

在我们的例子中,我们有以下内容:

esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);

然后,在执行所有任务后,esp 通过调用以下函数进入睡眠状态:

esp_deep_sleep_start()

循环()

这loop()部分为空,因为 ESP32 将在到达代码的这一部分之前进入休眠状态。因此,您需要将所有草图写在setup().

将示例草图上传到 ESP32。确保选择了正确的主板和 COM 端口。

测试计时器唤醒

以波特率为115200打开串行显示器。

每隔 5 秒,ESP 唤醒,在串行监视器上打印一条消息,然后再次进入深度睡眠状态。

每次 ESP 唤醒启动计数变量增加。它还会打印唤醒原因,如下图所示。

但是,请注意,如果按下 ESP32 开发板上的 EN 按钮,它会再次将引导计数重置为 1。

您可以修改提供的示例,而不是打印消息,您可以让 ESP 执行任何其他任务。计时器唤醒功能可用于使用 ESP32 执行定期任务,例如日常任务,而不会消耗太多电量。

ESP32定时器睡眠模式相关推荐

  1. 了解ESP32睡眠模式及其功耗

    陈拓翻译 2022/05/30-2022/05/30 原文 https://lastminuteengineers.com/esp32-sleep-modes-power-consumption/ 毫 ...

  2. ESP32 学习笔记(二十二)睡眠模式

    睡眠模式 睡眠模式 概述 WiFi/BT 和睡眠模式 唤醒源 定时器 Touch pad External 唤醒(ext0) External 唤醒(ext1) ULP 协处理器唤醒 GPIO 唤醒( ...

  3. ESP32 (Sleep Modes)-睡眠模式学习(8)

    提示:本博客作为学习笔记,有错误的地方希望指正 文章目录 一.ESP32 Sleep Modes概述 1.Sleep模式 1.1.1. Light-sleep 模式 1.1.2. Deep-sleep ...

  4. 计算机增加睡眠模式,如果我的计算机处于睡眠模式,Windows 10是否会更新? | MOS86...

    Windows 10将通过自动应用更新来确保您的安全. 通常,用户计划工作时间,因此Windows 10不会在不方便的时间安装更新. 如果PC处于睡眠状态,Windows 10会更新吗? 从技术上讲, ...

  5. STM32CubeMX学习笔记(15)——电源管理(PWR)低功耗睡眠模式

    一.低功耗模式简介 系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外部事件时)节省功耗.由用户根据应用选择具体的低功耗模式,以在低功耗.短启动时间和可用唤醒源之间寻求最佳平衡. 睡眠模 ...

  6. ESP8266模块睡眠模式

    当我们使用电池给esp模块进行供电的时候,为了节省电量.我们要实际应用的时候,这个问题就需要去解决. 而这个问题的解决方法就是使用esp模块的睡眠模式 睡眠模式的类型 共有三种不同的睡眠模式:调制解调 ...

  7. win7计算机睡眠快捷键,Win7系统在桌面创建睡眠模式快捷键的方法

    Windows7系统自带有睡眠模式功能,电脑处于睡眠模式可以节省电源,保养电脑都会对电脑进行睡眠设置,但是开启睡眠模式步骤比较麻烦.有什么办法可以在桌面创建睡眠模式快捷键,这样开启也比较方便,当然是可 ...

  8. RISC-V MCU应用教程之PWR睡眠模式

    简介 CH32V103系列是以青稞V3A处理器为核心的32位通用MCU,该处理器是基于RISC-V开源指令集设计.片上集成了时钟安全机制.多级电源管理.通用DMA控制器.此系列具有1路USB2.0主机 ...

  9. 睡眠键重启计算机,Windows10进入睡眠模式后按任意键会自动重启怎么办

    win10正式版自发布后就一直备受好评,不过用户在使用时也会遇到不少问题.比如,有位用户就反馈自己的win10系统电脑在进入睡眠模式后,只要按任意键后就会自动重启.这该怎么办呢?下面,小编就向大家分享 ...

最新文章

  1. Qt 小技巧之“To-Do 事项”
  2. 戴尔硬盘保护增强套件_拆解戴尔服务器,看看内部构造与普通计算机的区别
  3. JavaScript 笔记Day1
  4. MyBatis:事务回滚
  5. 王小云:“设谜”与“猜谜”,实现中国“密码梦”
  6. JAVA培训—线程同步--卖票问题
  7. oracle导入导出多个文件
  8. 转 layout_weight体验(实现按比例显示)
  9. debian 系统配置网易镜像源
  10. iconfont-阿里巴巴矢量图标库使用教程
  11. Isight多学科参数优化软件模块构成
  12. GDELT数据库入门与了解(码字中...)
  13. 为什么会有这么多种Python?
  14. 马来西亚数字自由贸易区的发展实践
  15. Docker容器学习笔记(看了狂神视频)
  16. Calcite的RelFieldTrimmer简介
  17. 全新安装Windows10系统(PE下)
  18. 关于保险的基础知识总结
  19. 服务器发送了 HTTP 状态代码 401: Unauthorized
  20. mac电脑常用快捷键总结

热门文章

  1. Java第十五篇:详解一元二次方程
  2. 湖南广电台长吕焕斌:湖南电视台的新媒体发展战略
  3. php 中字符串长度不正确
  4. 41首送别诗词,首首经典,值得为孩子们收藏!
  5. 各种开放API接口汇总信息
  6. 华为平板电脑装linux系统,专为平板设计的Linux JingOS来了,神似iPadOS,已适配华为...
  7. electron-rebuild 编译遇到的奇葩问题
  8. 使用stata临床决策曲线进行外部模型验证
  9. 标梵分享微信官方账号运营推广思路
  10. Mac电脑怎样关闭sip,苹果电脑关闭系统完整性保护SIP的方法