用 micros() 测量
本课属于 Coddy Arduino 学习旅程的“无需 delay 的计时”单元。第 16 课,共 18 课。
millis() 按整毫秒计数,对于很短的时间来说精度太低:按下 2.5 ms 会读作 2 或 3。micros() 是同类计时器,但它按微秒计数,也就是百万分之一秒:每毫秒有 1000 微秒。
在 Uno 上,它每次以 4 微秒为步长递增,并且也会返回一个 unsigned long。要计时,先读取一次,再读取一次,然后相减:
unsigned long start = micros();
int reading = analogRead(A0);
unsigned long took = micros() - start;
Serial.println(took); // 约 110:analogRead() 执行一次大约需要 0.1 ms由于计数速度很快,micros() 会比 millis() 更早用完数字:大约 70 分钟后,它会从 0 重新开始。用它测量较短的时间,超过几分钟的时间则用 millis()。
挑战
简单以微秒为单位,测量按钮按下的时长:
- 按下按钮时,将
micros()存储到pressedAt中 - 松开按钮时,输出
micros() - pressedAt
点击运行,按一下按钮,然后点击检查。
亲手试试
const int buttonPin = 2;
bool wasPressed = false;
unsigned long pressedAt = 0;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
bool pressed = digitalRead(buttonPin) == LOW;
if (pressed && !wasPressed) {
// 按钮刚被按下:记下当前时间
}
if (!pressed && wasPressed) {
// 按钮刚松开:输出按住的时长,单位为微秒
}
wasPressed = pressed;
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
无需 delay 的计时中的所有课
自己练习: Arduino 在线编辑器