Menu
CoddyTech

unsigned long 类型的时间

本课属于 Coddy Arduino 学习旅程的“无需 delay 的计时”单元。第 2 课,共 18 课。

变量能存储的数字大小有限,具体取决于它的类型。Uno 上的 int 范围是 -32768 到 32767。32.8 秒后,millis() 的值会超过这个范围,而试图存储这个值的 int 会回绕成负数。

unsigned 类型不能存储负数,因此它能达到的最大值是原来的两倍:unsigned int 的范围是 0 到 65535,大约相当于 65 秒的毫秒数。但这仍然不够。

unsigned long 的范围是 0 到 4,294,967,295。换算成毫秒,这超过 49 天,而且 millis() 本身返回的就是这种类型。每次都用它来存储时间:

unsigned long now = millis();
unsigned long startTime = 0;

类型用错的 sketch 能正常运行半分钟,然后就会出错,所以这个 bug 很容易被忽略。

challenge icon

挑战

简单

这段程序每秒输出一次时间,但 32 秒后会输出负数。更改 now 的类型,让时间在几天内都保持正确。

按“运行”,等待超过 33 秒来查看这个 bug,然后修复它并按“检查”。

亲手试试

void setup() {
  Serial.begin(9600);
}

void loop() {
  int now = millis();   // 这个数据类型存不下时间值:把它换掉。
  Serial.println(now);
  delay(1000);
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

无需 delay 的计时中的所有课

自己练习: Arduino 在线编辑器