首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Arduino上每天只运行一次if语句

如何在Arduino上每天只运行一次if语句
EN

Stack Overflow用户
提问于 2016-07-01 12:18:59
回答 3查看 800关注 0票数 2

我做了一个测量温度的项目,如果温度太高,Arduino会给一个数字打电话或发短信。但是如果温度太高,我想通知一个人一两次,不是每一次。我有RTC,但更喜欢没有RTC的解决方案。这个微控制器还能运行几个月。

我写这个伪码作为例子:

代码语言:javascript
复制
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);
  }

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-01 12:42:00

看看millis函数。注意两个问题:

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

第一个结论是,您需要使用时间差,而不是绝对值。如下所示:

代码语言:javascript
复制
unsigned long passedTime = millis() - prevWatchTime;
if (passedTime > 1UL * 24UL * 60UL * 60UL * 1000UL) // 1 day
    ...
prevWatchTime = millis();

它应与旗帜相结合:

代码语言:javascript
复制
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 - 1y = x + 101 ~ 100,那么即使在溢出之后,y - x = 101也是如此。

请注意,该标志是必要的,不能交换以直接进行millis() - sendTime检查。

票数 2
EN

Stack Overflow用户

发布于 2016-07-01 12:23:46

我不知道Arduino是否支持它,但一个天真的解决方案可能是使用time获得时间戳,并且在当前时间戳发送后不到24小时时不要重新发送。最后一次发送消息的时间存储在一个变量中,并与time返回的当前时间戳进行比较。

这个天真的解决方案不能很好地处理夏季/冬季的时间切换,而且可能还有其他一些角落的情况,它也不能很好地处理。

如果不支持time函数,则Arduino必须具有类似的特性才能返回可以使用的当前时间。还要注意的是,“当前时间”实际上并不一定是实际的“当前时间”,但可以是系统启动时的运行计数器。

票数 2
EN

Stack Overflow用户

发布于 2016-07-01 12:49:59

跟随你可以找到你的代码。我所做的就是测量温度。当温度第一次过高的时候,它就会发出一条手臂。只有在{Period_ms_1day}之后才能有第二个allarm。因此,您可以设置这个变量,因为您希望达到您的目的:

代码语言:javascript
复制
unsigned long Period_ms_1day = 86400000; //time in milliseconds = (60s * 60m *24h*1000) = 1 day
unsigned long prec_event = millis()-Period_ms_1day; 
unsigned long counter;


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

        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38145266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档