如何处理arduino和millis中的多个时间?

时间:2014-10-03 12:08:48

标签: arduino

我有一系列继电器,我用一个连接到电磁阀的arduino控制,电磁阀反过来控制管道系统周围的水流。继电器将按照以下方式定期切换: 继电器1和3高 等13秒 继电器2和4高 等17秒 继电器1和3低 等13秒 继电器2和4低 等待300秒 重复

我从一系列简单的延迟命令开始:

#include <DmxMaster.h>

void setup() {
  DmxMaster.maxChannel(8);
}

void loop() {


  delay(300000);
  DmxMaster.write(1,HIGH);
  DmxMaster.write(7,HIGH);

  delay(13000);

  DmxMaster.write(2,HIGH);
  DmxMaster.write(8,HIGH);

  delay(17000);
  DmxMaster.write(1,LOW);
  DmxMaster.write(7,LOW);

  delay(13000);
  DmxMaster.write(2,LOW);
  DmxMaster.write(8,LOW);    
}

大部分时间都有效,但我会看到它跳过一个或多个延迟线并跳转到下一步的情况。我开始研究最长延迟(300s)的毫秒功能,并得出以下内容,但我想知道如何实现这一目标以缩短延迟时间,如果这有任何改进的话:

#include <DmxMaster.h>
unsigned long currentTime;
unsigned long loopTime;

void setup()
{
  DmxMaster.maxChannel(8);
  currentTime = millis();
  loopTime = currentTime;
}
void loop()
{
  currentTime=millis();
  if(currentTime >= (loopTime + 300000)){
      DmxMaster.write(1,HIGH);
      DmxMaster.write(7,HIGH);

      delay(13000);
      DmxMaster.write(2,HIGH);
      DmxMaster.write(8,HIGH);

      delay(17000);
      DmxMaster.write(1,LOW);
      DmxMaster.write(7,LOW);

      delay(13000);
      DmxMaster.write(2,LOW);
      DmxMaster.write(8,LOW);

      loopTime = currentTime;
    }
}

提前致谢, 卡梅伦

1 个答案:

答案 0 :(得分:0)

在我自己的项目中,我有相同的约束条件:我需要检查传感器,获取数据,分析数据并选择不同时间间隔的操作。

我找到的最佳解决方案是ChibiOS/RT。它是由意法半导体的Giovanni Di Sirio开发的实时操作系统(RTOS)。

它已被Bill Greiman移植到Arduino上,可在Github上找到:ChibiOS-Arduino

它非常易于使用,文档记录很少,内存和大小都很小。

我在机器人项目Moti中使用它,您可以查看是否需要,但Bill有很多great examples

一开始可能看起来有点过头了,但是一旦你习惯了它,你就会想知道为什么你之前没有使用它,而你正在研究的每个Arduino项目都会有一个新的维度。

希望这会有所帮助:)