ESP32 循环时间太长

问题描述 投票:0回答:1

我是新来的,我正在使用 ESP32 和一些传感器制作一个项目。所以基本上我想创建一个简单的温度和门传感器,通过 Telegram 与互联网连接。

我希望我的ESP能够检测温度和门位置。如果达到某个温度限制或门打开,它将通过 Telegram 发送机器人消息并打开蜂鸣器。还有一个液晶屏显示当前温度和门位置。我还希望它能够接收消息,以便我可以检查当前温度和门位置并关闭蜂鸣器。但屏幕变化或蜂鸣器打开/关闭需要很长时间。

我在循环中使用延迟,我认为这就是问题所在。我已经搜索过 millis() 函数,但还无法使用它。有什么建议吗?这是代码:

void loop() {
  lastDoorState = doorState;
  doorState = digitalRead(DOOR_PIN);
  temp = dht.readtemperature();

  printLCD(doorState, temp);  // Printing LCD temp and door position.
  
  // Checking incoming tele message
  if (millis() - bot_lasttime > BOT_MTBS) {
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    while (numNewMessages) {
      Serial.println("got response");
      handleNewMessages(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    }
    bot_lasttime = millis();
  }

  sensorCheck(); // Function to send message when sensor is triggered.
  buzzer(); // Turning buzzer on/off
  delay(1000);
}
arduino telegram-bot esp32
1个回答
0
投票

delay(1000) 函数是阻塞的,并且会等到一秒过去之后代码才会继续,所以总的来说,你的循环会持续延迟一秒+其余代码执行的时间。如果你想使用非阻塞延迟,使用 millis() 是一个很好的做法。例如:

    timepassed = millis();
    if (timepassed > lasttime + 1000){
        buzzer();
        lasttime = millis();
    }

只有在超过 1000 毫秒且不阻塞代码的情况下,才会进入 if 语句。 (此代码将每 1000 毫秒打开和关闭蜂鸣器)。

© www.soinside.com 2019 - 2024. All rights reserved.