计时器中的Arduino计时器

时间:2016-06-09 18:50:42

标签: timer arduino

Arduino Nano和我需要一个计时器内的计时器,并且在解决逻辑问题时遇到一些问题。我在GitHub,Timer,SimpleTimer和Metro上玩了一些Libraries,但似乎没有人能做我需要的。或者,如果可以,我似乎无法让他们去做。

我需要每小时打开一个继电器约2分钟然后关闭。我正在尝试

loop
{ if (millis() - 3600000 > TimeMax)
  { relay(on);
    if (millis() - 12000 > relayMax)
    TimeMax = millis();
  }
} 

它似乎无法正常工作,我需要这一切才能在"循环中继续工作#34;因为我有一台nRF24L无线电收听。

有人可以帮我提供代码片段,或者至少概述如何解决这个问题。

由于

1 个答案:

答案 0 :(得分:2)

好的,首先,嵌入式开发中的 timers 是指在延迟后被触发的中断。一般来说,你需要中断来处理非常原子的动作,因为你不想在触发另一个中断时触发中断,因为这可能是恐怖电影的场景。

但是,当它变得简单时,你为什么要想做一些艰难,复杂和过度设计的东西呢?

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

#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,然后在{{1}中运行loop()一次状态回到睡眠状态 - 你不需要编写ISR,主循环()就足够了,或者在CLOSE状态下保持整整两分钟。

关于您可能想要阅读的计时器的详细文档(但要注意头痛):

这里是如何让arduino长时间睡觉的。

HTH