在一段时间不活动后启用 esp32 深度睡眠模式

Posted

技术标签:

【中文标题】在一段时间不活动后启用 esp32 深度睡眠模式【英文标题】:Enable esp32 deep sleep mode after a certain period of inactivity 【发布时间】:2021-06-02 14:52:17 【问题描述】:

我有一个用 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();    
    

谢谢!

【问题讨论】:

【参考方案1】:

当您像这样重写代码时,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) 进行监听。还有其他选项概述here。

【讨论】:

嗨!感谢您的帮助,但我认为它不起作用。这样,系统就不会进入深度睡眠模式,而是一直在等待输入 你是否从循环中删除了主要的millis()? 这个主要的millis()是什么? 我编辑了答案。如果没有帮助,您可能应该先熟悉基础知识... 我做了一个测试,发现(millis() - timer)总是大于5000

以上是关于在一段时间不活动后启用 esp32 深度睡眠模式的主要内容,如果未能解决你的问题,请参考以下文章

MQTT 订阅 / OTA 更新深度睡眠 / ESP32 / FreeRTOS

Arduino ESP32深度睡眠触摸唤醒(触摸唤醒)

Arduino ESP32 通过定时器(Timer)功能唤醒深度睡眠

停止设备进入睡眠模式一段时间

Arduino ESP32 深度睡眠与外部唤醒(EXT0)

ESP8266入门教程-ESP8266睡眠和唤醒功能