ボタン式ストップウォッチ
CoddyのArduinoジャーニー「delayを使わないタイミング制御」セクションの一部。レッスン 18/18。
ストップウォッチには、動作中と停止中の2つの状態があり、ボタンを押すと一方からもう一方に切り替わります。安全な方法で時間を計測します。開始時にmillis()を保存し、終了時に差し引きます。
if (!running) {
running = true;
startTime = millis();
} else {
running = false;
Serial.println(millis() - startTime);
}ボタンのチャタリング除去はモードボタンの場合と同じです。読み取り値が変化したときに動作し、その後20 ms待ちます。どちらのボタン操作の後も同じ20 ms待つため、操作間の時間は正確に保たれます。
LEDは状態を示します。ストップウォッチの動作中は点灯します。
チャレンジ
中級ボタンはすでに読み取られてデバウンスされており、onPress() は押すたびに1回実行されます。onPress() を作成してください。
- ストップウォッチが動作していない場合:開始し、
millis()をstartTimeに保存して、LEDを点灯させます - 動作している場合:停止し、LEDを消灯させて、時間をミリ秒単位で出力します
Run を押し、ボタンを2回押してから、Check を押してください。
自分で試してみよう
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);
}
// ボタンが押されるたびに1回呼び出される。
void onPress() {
// 動作していない場合: 開始し、時刻を記録してLEDを点灯する
// 動作中の場合: 停止し、LEDを消灯して経過時間をms単位で出力する
}
void loop() {
bool pressed = digitalRead(buttonPin) == LOW;
if (pressed != wasPressed) {
if (pressed) {
onPress();
}
wasPressed = pressed;
delay(20); // 接点が安定するのを待つ
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
delayを使わないタイミング制御のすべてのレッスン
自分で練習してみよう: Arduinoプレイグラウンド