Arduino Nano和我需要一个计时器内的计时器,并且在解决逻辑问题时遇到一些问题。我在GitHub,Timer,SimpleTimer和Metro上玩了一些Libraries,但似乎没有人能做我需要的。或者,如果可以,我似乎无法让他们去做。
我需要每小时打开一个继电器约2分钟然后关闭。我正在尝试
loop
{ if (millis() - 3600000 > TimeMax)
{ relay(on);
if (millis() - 12000 > relayMax)
TimeMax = millis();
}
}
它似乎无法正常工作,我需要这一切才能在"循环中继续工作#34;因为我有一台nRF24L无线电收听。
有人可以帮我提供代码片段,或者至少概述如何解决这个问题。
由于
答案 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