我想用我的arduino计算秒针的位置,精度为1/3秒。这意味着我有180个可能的手位置,位置每1/3更新一次。我目前的代码如下:
millisec = millis() % 1000;
new_second_pos = second() * 3;
if (millisec > 666){
new_second_pos += 2;
}
else if (millisec > 333){
new_second_pos += 1;
}
if (sec_pos != new_second_pos){
Serial.print(millisec);
Serial.print(", ");
Serial.println(new_second_pos);
sec_pos = new_second_pos;
}
但我收到的串口输出如下:
...
11002, 0
11334, 1
11667, 2
12000, 0
12002, 3
12334, 4
12667, 5
13000, 3
13002, 6
13334, 7
...
正如你可以在很短的时间内看到的每一秒,这个数值比它应该少3。我想这是因为second()
没有同步递增到millis()
。我可以通过添加另一个if语句来解决这个问题:
millisec = millis() % 1000;
if ((millisec) > 5){
new_second_pos = second() * 3;
if (millisec > 666){
new_second_pos += 2;
}
else if (millisec > 333){
new_second_pos += 1;
}
if (sec_pos != new_second_pos){
Serial.print(millisec);
Serial.print(", ");
Serial.println(new_second_pos);
sec_pos = new_second_pos;
}
}
但这对我来说看起来很可怕。如果CPU太忙而second()
需要6ms怎么办?有没有更好的写作方式?