Arduino闪烁计时器无法正常工作

时间:2017-03-04 04:30:37

标签: arduino arduino-ide

我正在尝试执行Flicker(zig zag)计时器,其中每次执行后计时器间隔都会更改。以下是我的代码:

unsigned long timer;             // the timer
unsigned long interval_A = 1000; // first interval
unsigned long interval_B = 2000; // second interval
unsigned long cur_interval = 0;  // current interval
bool timer_on = false;           // flag for timer first initialization
int count = 0;                   // for alternating interval

void loop()
{
  if (!timer_on) {
    timer = millis();
    count = 1;
    cur_interval = interval_A;
    timer_on = true;
  } else {
    if ((millis() - timer) >= cur_interval) {

      if (count % 2 == 0 ){ // even
        cur_interval = interval_A;
      } else {              // odd
        cur_interval = interval_B;
      }

      timer += cur_interval;

      //do something
      Serial.println(millis(), 10);
      Serial.println(timer, 10);
      Serial.println((millis() - timer), 10);
      Serial.println("Time up !");
      Serial.println("");

      count++;  
  }
}

上述计时器不起作用。运行时,它将在串行监视器中产生以下结果:

1000
2000
4294966296
Time up !

1000
4000
4294964297
Time up !

但是,如果我删除以下代码以使其交替使用,则可以正常工作:

if (count % 2 == 0){ // even
  cur_interval = interval_A;
} else {             // odd
  cur_interval = interval_B;
}

结果如下:

9000
9000
0
Time up !

10000
10000
0
Time up !

问题是为什么原始代码不起作用以及为什么它会产生有趣的结果?任何帮助都会非常感激,因为我已经被困在这里一段时间了:(

1 个答案:

答案 0 :(得分:0)

<强>问题: 您在此行前更改cur_interval 的值:

 timer += cur_interval

如果timercur_interval的初始值分别为50001000,则在执行上一条指令后,其值分别为7000和{ {1}}。由于您刚刚输入了该代码区域,因此您可以期望2000返回略大于millis()的值。因此,当您计算5000 + 1000 = 6000时,您会获得millis() - timer,因为所有计时器都属于6000 - 7000 = some large number类型。

<强>解决方案: 移动

unsigned
在更新timer += cur_interval; 的值之前

,以便获得合理的结果。

注意:而不是在代码中十几次调用cur_interval,最好将其返回的值存储在变量millis()中并改为使用它。< / p>