【问题标题】:Arduino timer within a timer计时器内的 Arduino 计时器
【发布时间】:2016-06-09 18:50:42
【问题描述】:

Arduino Nano 和我需要一个计时器内的计时器,并且在理解逻辑时遇到了一些问题。我在 GitHub、Timer、SimpleTimer 和 Metro 上玩过一些库,但似乎没有一个能满足我的需求。或者,如果他们可以,我似乎无法让他们这样做。

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

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

它似乎不起作用,我需要它来保持在“循环”内工作,因为我有一个 nRF24L 无线电收听。

有人可以帮助我编写代码 sn-ps 或至少概述如何解决这个问题。

谢谢

【问题讨论】:

  • 为什么要嵌套计时器?你不能在内部有外部时间触发器吗?让一个计时器打开继电器并激活另一个计时器,该计时器在 2 分钟后启动以关闭继电器。

标签: timer arduino


【解决方案1】:

好的,首先,嵌入式开发语言中的 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,然后您在CLOSE 状态下运行一次loop() 回到sleep - 你不需要编写 ISR,主循环()就足够了,或者在 OPEN 状态下保持整整两分钟。

您可能想阅读有关计时器的好文档(不过请注意令人头疼的问题):

以下是如何让 arduino 长时间休眠:

HTH

【讨论】:

  • 谢谢,我会试试的。我很欣赏你的细节。
猜你喜欢
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多