gpt4 book ai didi

c++ - 如何每天只运行一次 if 语句,如果它在 Arduino 上为真

转载 作者:太空狗 更新时间:2023-10-29 23:43:57 24 4
gpt4 key购买 nike

我做了一个测量温度的项目,如果温度太高,Arduino 会打电话或发短信。但如果温度太高,我想通知此人一两次,而不是每次。我有 RTC,但更喜欢没有 RTC 的解决方案。此外,这个微 Controller 可以运行数月。
我写这个伪代码作为例子:

void  loop() {
int temp = request.temp();
if (temp > 30) { // Do this once every 24 hours or every some long time if it is true
send_sms(6985XXXXXX, "Temp is over 30C");
call(6985XXXXXX);
}

}

最佳答案

millis功能。注意两个问题:

  1. 它返回 32 位值,它们每 2^32 毫秒溢出一次;
  2. 确保您编写的整数常量正确(例如 0xAABBCC 被编译为 16 位 0xBBCC signed int,必须有 0xAABBCCul)。

第一个是你需要用时间差来操作,而不是绝对值。像这样:

unsigned long passedTime = millis() - prevWatchTime;
if (passedTime > 1UL * 24UL * 60UL * 60UL * 1000UL) // 1 day
...
prevWatchTime = millis();

它应该与标志结合:

const unsigned long sleepTime = 1UL * 24UL * 60UL * 60UL * 1000UL;  // 1 day
bool messageIsSent = false;
unsigned long sendTime;

void loop()
{
unsigned long passedTime = millis() - sendTime;
if (passedTime > sleepTime)
messageIsSent = false;

if (<must send message> && !messageIsSent) {
<send message>
messageIsSent = true;
sendTime = millis();
}
}

这可以正确地阻止消息发送长达近 25 天。如您所见,溢出不会影响小于 2^31 的差异。例如。如果x = 2^32 - 1 , y = x + 101 ~ 100 , 然后 y - x = 101即使在溢出之后。

请注意,标志是必需的,不能交换为直接 millis() - sendTime检查。

关于c++ - 如何每天只运行一次 if 语句,如果它在 Arduino 上为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38145266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com