我正在尝试执行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 !
问题是为什么原始代码不起作用以及为什么它会产生有趣的结果?任何帮助都会非常感激,因为我已经被困在这里一段时间了:(
答案 0 :(得分:0)
<强>问题:强>
您在此行前更改cur_interval
的值:
timer += cur_interval
如果timer
和cur_interval
的初始值分别为5000
和1000
,则在执行上一条指令后,其值分别为7000
和{ {1}}。由于您刚刚输入了该代码区域,因此您可以期望2000
返回略大于millis()
的值。因此,当您计算5000 + 1000 = 6000
时,您会获得millis() - timer
,因为所有计时器都属于6000 - 7000 = some large number
类型。
<强>解决方案:强> 移动
unsigned
在更新timer += cur_interval;
的值之前,以便获得合理的结果。
注意:而不是在代码中十几次调用cur_interval
,最好将其返回的值存储在变量millis()
中并改为使用它。< / p>