Menu
CoddyTech

반응 게임: 타이머

Coddy Arduino 여정의 프로젝트 섹션에 포함된 레슨. 24개 중 6번째.

이제 게임에서 반응 시간을 측정합니다. 반응 시간은 LED가 켜진 순간부터 버튼을 누를 때까지의 시간이므로, 스케치는 한 순간, 즉 LED가 켜진 시점을 기억해야 합니다.

digitalWrite(ledPin, HIGH);
litAt = millis();
state = LIT;

LIT 상태에서 버튼을 누르면 그 차이가 반응 시간입니다.

unsigned long reaction = millis() - litAt;
Serial.print("Reaction: ");
Serial.print(reaction);
Serial.println(" ms");

스케치가 delay()에서 멈춰 있지 않기 때문에만 이 방법이 작동합니다. loop()는 매 밀리초마다 수천 번 버튼을 확인하므로, 버튼을 누른 뒤 1밀리초도 지나기 전에 이를 감지합니다. 대부분의 사람은 200~300 ms가 걸립니다.

challenge icon

챌린지

중급

플레이어의 반응 시간을 측정하세요:

  • LED가 켜질 때 millis()를 litAt에 저장하세요
  • LIT 상태에서 버튼 입력이 들어오면 millis() - litAt을 계산하세요
  • Reaction: 250 ms 형식으로 출력하세요

Run을 누르고, 게임을 한 다음, Serial 모니터를 확인하고 Check를 누르세요.

직접 해보기

const int ledPin = 12;
const int buttonPin = 2;

// 한 라운드의 세 가지 상태
enum State { READY, WAITING, LIT };
State state = READY;

int lastButton = HIGH;       // 직전 버튼 입력값
unsigned long waitStart = 0; // 대기가 시작된 시점
unsigned long waitTime = 0;  // 이번 대기가 지속되는 시간

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println("Press the button to start");
}

void loop() {
  int button = digitalRead(buttonPin);
  bool pressed = (button == LOW && lastButton == HIGH);  // 방금 눌림
  lastButton = button;
  unsigned long now = millis();

  switch (state) {
    case READY:
      if (pressed) {
        randomSeed(micros());  // 버튼을 누른 시각은 매번 다름
        waitTime = random(1000, 3001);
        waitStart = now;
        state = WAITING;
      }
      break;
    case WAITING:
      if (now - waitStart >= waitTime) {
        digitalWrite(ledPin, HIGH);
        state = LIT;
      }
      break;
    case LIT:
      if (pressed) {
        digitalWrite(ledPin, LOW);
        state = READY;
      }
      break;
  }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

프로젝트의 모든 레슨

직접 연습해 보세요: Arduino 플레이그라운드