Menu
CoddyTech

ボタン式ストップウォッチ

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は状態を示します。ストップウォッチの動作中は点灯します。

challenge icon

チャレンジ

中級

ボタンはすでに読み取られてデバウンスされており、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);   // 接点が安定するのを待つ
  }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

delayを使わないタイミング制御のすべてのレッスン

自分で練習してみよう: Arduinoプレイグラウンド