Menu
CoddyTech

Игра на реакцию: случайное ожидание

Часть раздела Проекты путешествия по Arduino на Coddy. Урок 5 из 24.

Следующий проект — игра на скорость реакции. Ты нажимаешь кнопку, плата ждёт, затем зажигает светодиод, а ты нажимаешь ещё раз как можно быстрее.

Время ожидания случайное, иначе ты бы выучил ритм. random(1000, 3001) выдаёт целое число от 1000 до 3000.

random() — это вычисление: после каждого включения питания оно выдаёт одни и те же числа в одном и том же порядке. randomSeed() задаёт начало этой последовательности. Задай начальное значение моментом нажатия в микросекундах — он отличается в каждой игре:

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

Игра представляет собой машину состояний с тремя состояниями: READY (ожидание нажатия), WAITING (случайное ожидание) и LIT (светодиод включён). Для ожидания используется millis(), поэтому на следующих шагах можно следить за кнопкой во время ожидания.

В стартовом коде уже определяется pressed: сейчас кнопка считывается как LOW, а в прошлый раз считывалась как HIGH. Эта кнопка не дребезжит, поэтому подавление дребезга не требуется.

challenge icon

Задание

Средне

Кнопка подключена к выводу 2, а светодиод — к выводу 12. Заполни три состояния:

  • READY: при нажатии инициализируй генератор с помощью micros(), выбери время ожидания от 1000 до 3000 мс, сохрани время начала и перейди в WAITING
  • WAITING: когда время ожидания истечёт, включи светодиод и перейди в LIT
  • LIT: при нажатии выключи светодиод и перейди в 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