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를 끈 다음 시간을 밀리초 단위로 출력합니다

Run을 누르고 버튼을 두 번 누른 다음 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);
}

// 버튼을 누를 때마다 한 번 호출됩니다.
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 플레이그라운드