Arduino 闪烁定时器不工作

Arduino Flicker Timer not working

我正在尝试执行闪烁(之字形)计时器,其中计时器间隔在每次执行后都会发生变化。下面是我的代码:

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++;  
  }
}

上述计时器不起作用。当运行时,它会在Serial Monitor中产生如下结果:

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 !

问题是为什么原始代码不起作用,为什么会产生有趣的结果?任何帮助将不胜感激,因为我已经在这里停留了一段时间:(

问题: 您在 这一行之前更改 cur_interval 的值:

 timer += cur_interval

如果timercur_interval的初始值分别为50001000,执行完上一条指令后,它们的值分别为70002000。由于您刚刚输入该代码区域,因此您可以期望 millis() 到 return 的值略大于 5000 + 1000 = 6000。因此,当您计算 millis() - timer 时,您会得到 6000 - 7000 = some large number,因为所有计时器都是 unsigned 类型。


解法: 移动

timer += cur_interval;

在更新 cur_interval 的值之前,以便获得 合理的 结果。


注意: 与其在代码中多次调用 millis(),不如将其 returned 值存储在变量 cur_time 并改用它。