首页 > 解决方案 > 在一段时间不活动后启用 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();    
    }
}

谢谢!

标签: arduinosleepesp32

解决方案


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)这里还列出了其他选项。


推荐阅读