Menu
CoddyTech

用 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()。

challenge icon

挑战

简单

以微秒为单位,测量按钮按下的时长:

  • 按下按钮时,将 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;
}
quiz icon自我测试

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

无需 delay 的计时中的所有课

自己练习: Arduino 在线编辑器