2016-06-09 123 views
1

Arduino Nano和我需要一个定时器内的定时器,并有一些问题让我的头绕着逻辑。我在GitHub,Timer,SimpleTimer和Metro上玩过一些库,但似乎没有做我需要的。或者,如果他们能,我似乎无法让他们这样做。定时器内的Arduino定时器

我需要开关继电器约2分钟,然后关闭,每小时。我想

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

它似乎没有工作,我需要这一切留在“循环”中工作,因为我有一个nRF24L收听广播。

有人可以帮助我的代码片段或至少一个大纲如何去做这件事。

感谢

+0

为什么嵌套定时器?你不能在内部触发外部时间吗?有一个定时器打开继电器,同时激活另一个定时器,它在2分钟后开始关闭继电器。 –

回答

2

好吧,首先定时器在嵌入式开发讲的是指被延迟一段时间后发射中断。一般而言,您希望中​​断处理非常原子的操作,因为您不希望在触发另一个中断时触发中断,因为这可能是恐怖电影的场景。

但是,当它可以变得简单时,为什么要制作一些困难,复杂和过度工程?

所有你需要做的是通过一个简单的双状态机处理:

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

有一个关于定时器好的文档,你可能需要阅读(当心头痛,虽然):

下面是如何把Arduino的睡了长时间的延迟:

HTH

+1

谢谢,我会尝试。我很欣赏你进入的细节。 – user2175495