反応ゲーム:ランダムな待ち時間
CoddyのArduinoジャーニー「プロジェクト」セクションの一部。レッスン 5/24。
次のプロジェクトは反応ゲームです。ボタンを押すと、ボードは待機し、その後LEDを点灯し、できるだけ速くもう一度ボタンを押します。
待ち時間はランダムです。そうでなければ、リズムを覚えてしまうでしょう。random(1000, 3001)は1000から3000までの整数を返します。
random()は計算です。電源を入れるたびに、同じ順序で同じ数値を返します。randomSeed()は、その数列の開始位置を選びます。ゲームごとに異なる、押した瞬間のマイクロ秒を使ってシードを設定します。
randomSeed(micros());
waitTime = random(1000, 3001);このゲームは、3つの状態を持つ状態機械です。READY(ボタンが押されるのを待機)、WAITING(ランダムな待ち時間)、そしてLIT(LEDが点灯中)です。待ち時間にはmillis()を使うため、後続の処理で待ち時間中にボタンを監視できます。
スターターコードでは、すでにpressedを判定しています。現在ボタンがLOWで、前回はHIGHだった場合です。このボタンはチャタリングしないため、デバウンスは不要です。
チャレンジ
中級ボタンはピン 2 に、LED はピン 12 に接続されています。3 つの状態を完成させましょう。
READY: ボタンを押すとmicros()でシードを設定し、待ち時間を 1000~3000 ms から選び、開始時刻を保存して、WAITINGに移りますWAITING: 待ち時間が終わったら、LED を点灯し、LITに移りますLIT: ボタンを押すと LED を消灯し、READYに移ります
Runを押して、何ラウンドかプレイし、それからCheckを押してください。
自分で試してみよう
const int ledPin = 12;
const int buttonPin = 2;
// 1ラウンドの3つの状態
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が消え、ゲームは再び開始できる状態になる
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
プロジェクトのすべてのレッスン
自分で練習してみよう: Arduinoプレイグラウンド