我是新来的,我正在使用 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);
}
delay(1000) 函数是阻塞的,并且会等到一秒过去之后代码才会继续,所以总的来说,你的循环会持续延迟一秒+其余代码执行的时间。如果你想使用非阻塞延迟,使用 millis() 是一个很好的做法。例如:
timepassed = millis();
if (timepassed > lasttime + 1000){
buzzer();
lasttime = millis();
}
只有在超过 1000 毫秒且不阻塞代码的情况下,才会进入 if 语句。 (此代码将每 1000 毫秒打开和关闭蜂鸣器)。