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
如果timer
和cur_interval
的初始值分别为5000
和1000
,执行完上一条指令后,它们的值分别为7000
和 2000
。由于您刚刚输入该代码区域,因此您可以期望 millis()
到 return 的值略大于 5000 + 1000 = 6000
。因此,当您计算 millis() - timer
时,您会得到 6000 - 7000 = some large number
,因为所有计时器都是 unsigned
类型。
解法:
移动
timer += cur_interval;
在更新 cur_interval
的值之前,以便获得 合理的 结果。
注意: 与其在代码中多次调用 millis()
,不如将其 returned 值存储在变量 cur_time
并改用它。
我正在尝试执行闪烁(之字形)计时器,其中计时器间隔在每次执行后都会发生变化。下面是我的代码:
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
如果timer
和cur_interval
的初始值分别为5000
和1000
,执行完上一条指令后,它们的值分别为7000
和 2000
。由于您刚刚输入该代码区域,因此您可以期望 millis()
到 return 的值略大于 5000 + 1000 = 6000
。因此,当您计算 millis() - timer
时,您会得到 6000 - 7000 = some large number
,因为所有计时器都是 unsigned
类型。
解法: 移动
timer += cur_interval;
在更新 cur_interval
的值之前,以便获得 合理的 结果。
注意: 与其在代码中多次调用 millis()
,不如将其 returned 值存储在变量 cur_time
并改用它。