Arduino Nano和我需要一个定时器内的计时器和有一些问题,使我的头脑在逻辑。我曾在GitHub、Timer、SimpleTimer和Metro上玩过一些图书馆,但似乎没有一个能满足我的需要。或者,如果他们可以的话,我似乎不能让他们这么做。
我需要打开一个继电器大约2分钟,然后关闭,每小时。我在努力
loop
{ if (millis() - 3600000 > TimeMax)
{ relay(on);
if (millis() - 12000 > relayMax)
TimeMax = millis();
}
} 它似乎不工作,我需要这一切保持工作在“循环”,因为我有一个nRF24L收音机收听。
有谁能帮我处理一下代码片段,或者至少概述一下如何解决这个问题?
谢谢
发布于 2016-06-10 11:06:02
好的,首先,embedded中的计时器意味着延迟后被触发的中断。一般来说,您希望中断处理非常原子的操作,因为您不希望中断被触发,而另一个中断被触发,因为这可能是恐怖电影的场景。
但是,既然事情可以很简单,为什么你想要制造一些困难、复杂和过度设计的东西呢?
您所需要做的就是通过一个简单的双状态机来处理它:
#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状态下整整两分钟。
关于您可能想要阅读的计时器有很好的文档(不过要小心头痛):
下面是如何让arduino长时间延迟睡眠的方法:
HTH
https://stackoverflow.com/questions/37733988
复制相似问题