按钮秒表
本课属于 Coddy Arduino 学习旅程的“无需 delay 的计时”单元。第 18 课,共 18 课。
秒表有两种状态:运行和停止,按下按钮会让它在两种状态之间切换。它用安全的方式计时:开始时存储 millis(),结束时再相减。
if (!running) {
running = true;
startTime = millis();
} else {
running = false;
Serial.println(millis() - startTime);
}按钮的消抖方式和模式按钮相同:读数发生变化时执行操作,然后等待 20 ms。两次按下都会等待相同的 20 ms,因此两次按下之间的计时是准确的。
LED 用来显示状态:秒表运行时亮起。
挑战
中等按钮已经完成读取和消抖,并且每次按下时都会运行一次 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); // 等待按键触点稳定。
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
无需 delay 的计时中的所有课
自己练习: Arduino 在线编辑器