반응 게임: 타이머
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가 걸립니다.
챌린지
중급플레이어의 반응 시간을 측정하세요:
- 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;
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
프로젝트의 모든 레슨
직접 연습해 보세요: Arduino 플레이그라운드