Игра на реакцию: случайное ожидание
Часть раздела Проекты путешествия по Arduino на Coddy. Урок 5 из 24.
Следующий проект — игра на скорость реакции. Ты нажимаешь кнопку, плата ждёт, затем зажигает светодиод, а ты нажимаешь ещё раз как можно быстрее.
Время ожидания случайное, иначе ты бы выучил ритм. random(1000, 3001) выдаёт целое число от 1000 до 3000.
random() — это вычисление: после каждого включения питания оно выдаёт одни и те же числа в одном и том же порядке. randomSeed() задаёт начало этой последовательности. Задай начальное значение моментом нажатия в микросекундах — он отличается в каждой игре:
randomSeed(micros());
waitTime = random(1000, 3001);Игра представляет собой машину состояний с тремя состояниями: READY (ожидание нажатия), WAITING (случайное ожидание) и LIT (светодиод включён). Для ожидания используется millis(), поэтому на следующих шагах можно следить за кнопкой во время ожидания.
В стартовом коде уже определяется pressed: сейчас кнопка считывается как LOW, а в прошлый раз считывалась как HIGH. Эта кнопка не дребезжит, поэтому подавление дребезга не требуется.
Задание
СреднеКнопка подключена к выводу 2, а светодиод — к выводу 12. Заполни три состояния:
READY: при нажатии инициализируй генератор с помощьюmicros(), выбери время ожидания от 1000 до 3000 мс, сохрани время начала и перейди вWAITINGWAITING: когда время ожидания истечёт, включи светодиод и перейди вLITLIT: при нажатии выключи светодиод и перейди в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, и игра снова готова к началу
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Проекты
2Игра на реакцию
Игра на реакцию: случайное ожиданиеИгра на реакцию: таймерИгра на реакцию: фальстартИгра на реакцию: лучшее времяПотренируйтесь самостоятельно: Песочница Arduino