首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定时器内的Arduino定时器

定时器内的Arduino定时器
EN

Stack Overflow用户
提问于 2016-06-09 18:50:42
回答 1查看 705关注 0票数 1

Arduino Nano和我需要一个定时器内的计时器和有一些问题,使我的头脑在逻辑。我曾在GitHub、Timer、SimpleTimer和Metro上玩过一些图书馆,但似乎没有一个能满足我的需要。或者,如果他们可以的话,我似乎不能让他们这么做。

我需要打开一个继电器大约2分钟,然后关闭,每小时。我在努力

代码语言:javascript
复制
loop
{ if (millis() - 3600000 > TimeMax)
  { relay(on);
    if (millis() - 12000 > relayMax)
    TimeMax = millis();
  }
} 

它似乎不工作,我需要这一切保持工作在“循环”,因为我有一个nRF24L收音机收听。

有谁能帮我处理一下代码片段,或者至少概述一下如何解决这个问题?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-10 11:06:02

好的,首先,embedded中的计时器意味着延迟后被触发的中断。一般来说,您希望中断处理非常原子的操作,因为您不希望中断被触发,而另一个中断被触发,因为这可能是恐怖电影的场景。

但是,既然事情可以很简单,为什么你想要制造一些困难、复杂和过度设计的东西呢?

您所需要做的就是通过一个简单的双状态机来处理它:

代码语言:javascript
复制
#define OPEN_DELAY 120*1000
#define CLOSE_DELAY 3600*1000 
// N.B.: to be precise here, to make 2 minutes every hour, 
// CLOSE_DELAY should be 3600*1000-OPEN_DELAY so it
// does not shift by 2 minutes every hour. 

void loop() {
    static bool open=false;
    static long timestamp = millis();

    if (!open && millis()-timestamp > CLOSE_DELAY) {
        open=true;            // change state
        timestamp = millis(); // rearm timestamp
        set_relay_on();
    } else if (open && millis()-timestamp > OPEN_DELAY) {
        open=false;
        timestamp = millis();
        set_relay_off();
    }
}

您可能想使用计时器的唯一原因是尽可能保持AVR处于睡眠模式,从而节省电池。然后,在睡眠前将计时器设置为最大可能的值,使它每隔几秒钟就用中断唤醒AVR,然后在CLOSE状态下运行一次CLOSE状态--在那里您不需要写一个ISR,主循环()就足够了,或者保持它在OPEN状态下整整两分钟。

关于您可能想要阅读的计时器有很好的文档(不过要小心头痛):

  • http://maxembedded.com/2011/06/introduction-to-avr-timers/

下面是如何让arduino长时间延迟睡眠的方法:

  • http://www.bot-thoughts.com/2013/11/avr-watchdog-as-sleep-delay.html

HTH

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

https://stackoverflow.com/questions/37733988

复制
相关文章

相似问题

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