Menu
CoddyTech

按钮秒表

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

秒表有两种状态:运行和停止,按下按钮会让它在两种状态之间切换。它用安全的方式计时:开始时存储 millis(),结束时再相减。

if (!running) {
  running = true;
  startTime = millis();
} else {
  running = false;
  Serial.println(millis() - startTime);
}

按钮的消抖方式和模式按钮相同:读数发生变化时执行操作,然后等待 20 ms。两次按下都会等待相同的 20 ms,因此两次按下之间的计时是准确的。

LED 用来显示状态:秒表运行时亮起。

challenge icon

挑战

中等

按钮已经完成读取和消抖,并且每次按下时都会运行一次 onPress()。编写 onPress():

  • 如果秒表没有运行:启动秒表,将 millis() 存入 startTime,并点亮 LED
  • 如果秒表正在运行:停止秒表,熄灭 LED,并输出时间(毫秒)

按“运行”,按两次按钮,然后按“检查”。

亲手试试

const int ledPin = 13;
const int buttonPin = 2;

bool wasPressed = false;
bool running = false;
unsigned long startTime = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
}

// 每按下一次,就调用一次。
void onPress() {
  // 未运行时:开始计时,记下时间,点亮 LED。
  // 运行时:停止计时,关闭 LED,并打印以 ms 为单位的时间。
}

void loop() {
  bool pressed = digitalRead(buttonPin) == LOW;
  if (pressed != wasPressed) {
    if (pressed) {
      onPress();
    }
    wasPressed = pressed;
    delay(20);   // 等待按键触点稳定。
  }
}
quiz icon自我测试

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

无需 delay 的计时中的所有课

自己练习: Arduino 在线编辑器