Menu
CoddyTech

반응 게임: 무작위 대기

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

다음 프로젝트는 반응 속도 게임입니다. 버튼을 누르면 보드가 기다렸다가 LED를 켜고, 가능한 한 빨리 다시 버튼을 누릅니다.

random(1000, 3001)은 1000부터 3000까지의 정수를 반환합니다.

random()은 계산식입니다. 전원을 켤 때마다 같은 순서로 같은 숫자를 반환합니다. randomSeed()는 그 순서가 어디서 시작할지 정합니다. 누른 순간의 마이크로초 값으로 시드 값을 설정하세요. 이 값은 게임마다 달라집니다.

randomSeed(micros());
waitTime = random(1000, 3001);

게임은 세 가지 상태를 가진 상태 머신입니다. READY(버튼을 누르기를 기다리는 상태), WAITING(무작위 대기 시간), LIT(LED가 켜진 상태)입니다. 대기 시간에는 millis()를 사용하므로, 이후 단계에서 대기 중에 버튼을 확인할 수 있습니다.

시작 코드에는 이미 pressed를 계산하는 로직이 있습니다. 버튼은 현재 LOW를 읽고 이전에는 HIGH를 읽었습니다. 이 버튼은 바운스가 발생하지 않으므로 디바운스가 필요하지 않습니다.

challenge icon

챌린지

중급

버튼은 핀 2에, LED는 핀 12에 연결되어 있습니다. 세 가지 상태를 채우세요:

  • READY: 버튼을 누르면 micros()로 시드를 설정하고, 1000~3000 ms의 대기 시간을 선택하고, 시작 시간을 저장한 다음 WAITING으로 이동합니다
  • WAITING: 대기 시간이 끝나면 LED를 켜고 LIT으로 이동합니다
  • LIT: 버튼을 누르면 LED를 끄고 READY로 이동합니다

Run을 누르고 몇 라운드 진행한 다음 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;

  // READY: 버튼을 누르면 대기가 시작됨
  // WAITING: 대기가 끝나면 LED를 켬
  // LIT: 버튼을 누르면 LED가 꺼지고 게임이 다시 준비 상태가 됨

}
quiz icon실력 점검

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

프로젝트의 모든 레슨

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