arduino - 在一段时间不活动后启用 esp32 深度睡眠模式
问题描述
我有一个用 esp 设计的设备,它包含两个按钮,每个按钮都执行一个功能。但是,他一直在监视这些按钮并且电池电量耗尽。在一段时间不活动后,如何实现 esp 的深度睡眠?例如,如果设备在 30 秒内未读取,则激活睡眠模式。要退出该模式,只需按任何现有按钮。
我从团队中想到了一些东西,但它不起作用,因为 milis() 参数永远不会重置。
void loop()
{
unsigned long timer=millis();
int botaoRfid = digitalRead(butRFID);
int botaoDig = digitalRead(butDIG);
if(botaoRfid == HIGH){
timer=0;
Serial.println("botao RFID pressionado");
checkRFID();
}
else if(botaoDig == HIGH){
timer=0;
Serial.println("botao DIGITAL pressionado");
checkFingerprint();
return;
}
else if(timer >=10000){
Serial.println("Sleep…");
esp_deep_sleep_start();
}
}
谢谢!
解决方案
millis()
当您像这样重写代码时,这并不是真正的问题,启动后不会重置:
unsigned long timer = 0;
void setup()
{
}
void loop()
{
int botaoRfid = digitalRead(butRFID);
int botaoDig = digitalRead(butDIG);
if(botaoRfid == HIGH){
timer = millis();
Serial.println("botao RFID pressionado");
checkRFID();
}
else if(botaoDig == HIGH){
timer = millis();
Serial.println("botao DIGITAL pressionado");
checkFingerprint();
return;
}
else if(millis() - timer >= 10000){
Serial.println("Sleep…");
esp_deep_sleep_start();
}
}
这将使 ESP32 在 10 秒后进入深度睡眠,而不会重置为电流millis()
(当前在每个循环周期中都会发生这种情况,但您当然可以将该代码放在循环之外......)。但请注意,millis()
大约 49 天后会溢出,您必须正确处理。
此外,为了将 ESP32 从 DeepSleep 中唤醒,您必须定义一个 PIN 以用于监听,例如esp_sleep_enable_ext1_wakeup(bitmask, mode)
。这里还列出了其他选项。
推荐阅读
- vba - 如何根据 Outlook 项目的文件夹采取不同的操作?
- powerbi - Power BI - 在实时连接中选择最新日期作为默认日期
- python - 如何在屏幕(乌龟)上而不是在终端上向用户显示问题?
- android - Codepush 不适用于多个 AppRegistry.registerComponent 定义
- docker - 即使正在解析 DNS,也无法连接到同一主机中的容器
- wso2 - 如何通过请求生成不同的令牌而不撤销之前的令牌
- python - 每个班级的分组
- r - 基于R中所有列值的其他1列获取列的最小值
- python - 如何在 Django 项目中创建 requirements.txt 文件?
- html - 使用 rvest(或另一个 R 包)来检测 HTML 段落的开头何时是不同的格式(例如加粗)