СОДЕРЖАНИЕ ►
Настольная игра на реакцию — простой проект на Ардуино, где вам понадобятся только светодиоды, резисторы кнопки и макетная плата. В этой статье мы разместили схему сборки игры и работающий скетч с подробными комментариями. На анимации ниже, продемонстрирован принцип работы игры. В настройках можно поменять режим работы — изменить временные интервалы, число попыток и количество кнопок.

Принцип работы игры довольно простой — после включения светодиода (они включаются рандомно), необходимо как можно быстрее нажать соответствующую кнопку. Временной интервал включения светодиода и прочие настройки можно изменить в скетче. После выполнения всех попыток, на монитор порта Arduino IDE выводится количество правильных попыток, среднее и лучшее время реакции.
Как сделать настольную игру на Ардуино
Для этого проекта потребуется:
- Arduino Uno / Arduino Nano;
- макетная плата;
- 3 тактовых кнопки Ардуино;
- 3 светодиода;
- 6 резисторов 220 Ом;
- провода «папа-папа».
Схема сборки игры на реакцию с Ардуино

На схеме показано подключение трех пар светодиодов и кнопок, но вы можете подключить до шести пар, изменив соответствующие настройки в скетче. Важно! Подключайте светодиоды последовательно, начиная с 4 пина, а кнопки с пина A0 до A5. Игра начинается после кратковременного зажигания всех светодиодов. При желании можно подключить пьезодинамик в Ардуино, для звукового сигнала к началу игры.
Скетч для игры на реакцию с Ардуино
/* эти переменные можно изменять */ int d1 = 1000; // начальный интервал включения в миллисекундах int d2 = 2000; // конечный интервал включения в миллисекундах int d3 = 3000; // время ожидания для кнопки byte tarrgr = 5; // количество заданий в раунде byte knp = 3; // количество пар кнопок и светодиодов /* остальной код игры не меняется */ byte pinD = 4 + knp; // светодиоды подключаются строго с pin4 и до pin9 byte pinA = 14 + knp; // кнопки подключаются строго c pinA0 и до pinA5 byte ext = 9; // переменная для выхода из while byte hit; // верно нажатые кнопки byte err; // неверно нажатые или пропущенные кнопки byte tarrgn; // подсчет количества попыток boolean finich = true; // переменная для вывода результатов unsigned long timing; // переменная для точки отсчета unsigned long setreakt; // время реакции нажатия unsigned long bestreakt = 99999; // лучшее время реакции unsigned long medreakt; // среднее время реакции void setup() { Serial.begin(9600); // подключаем цифровые пины для светодиодов for (byte i = 4; i < pinD; i++) { pinMode(i, OUTPUT); digitalWrite(i, HIGH); } delay(500); // после паузы выключаем светодиоды for (byte i = 4; i < pinD; i++) { digitalWrite(i, LOW); } // инициализируем аналоговые пины для кнопок for (byte i = 14; i < pinA; i++) { pinMode(i, INPUT); } // отключаем аналоговые пины для кнопок for (byte i = 14; i < pinA; i++) { analogWrite(i, LOW); } } void loop() { while (tarrgn < tarrgr) { // рандомно задаем пин для включения светодиода int LED = random(4, 4 + knp); int BTN = LED + 10; // задаем временной интервал, через который включится светодиод int DEL = random(d1, d2); delay(DEL); digitalWrite(LED, HIGH); timing = millis(); ext = 9; while (ext < 10 && tarrgn < tarrgr) { if (digitalRead(BTN) == HIGH) { digitalWrite(LED, LOW); setreakt = millis() - timing; delay(300); hit++; tarrgn++; ext = 11; } if (millis() - timing > d3) { digitalWrite(LED, LOW); delay(300); setreakt = 0; err++; tarrgn++; ext = 11; } } // запоминаем лучшее время реакции, исключая промахи // суммируем общее время реакции if (setreakt < bestreakt && setreakt > 100) { bestreakt = setreakt; } medreakt = medreakt + setreakt; } if (tarrgn == tarrgr && finich == true) { // вычисляем среднее время реакции medreakt = medreakt / hit; if (medreakt > 99998) { medreakt = 0; } if (bestreakt > 99998) { bestreakt = 0; } // выводим итоговые результаты на монитор порта Serial.println(); Serial.println("--- End of Raund ---"); Serial.println(); Serial.println("Hits - " + String(hit)); Serial.println("Errors - " + String(err)); Serial.println("Bestreakt - " + String(bestreakt)); Serial.println("Medreakt - " + String(medreakt)); Serial.println(); Serial.println("Please reboot for restart"); finich = false; } }
Пояснения к коду:
- все настройки скетча можно менять в начале программы;
- неправильный порядок подключения светодиодов и кнопок повлияют на работу программы. Подключать можно не более шести пар светодиодов и кнопок.
Заключение. К плате можно подключить LCD дисплей Ардуино и выводить результаты уже на экран. Дополнительно можно придумать различные варианты включения светодиодов, например, одновременно включать два светодиода. Возникшие вопросы, можно оставлять в комментариях к этой записи — мы всегда стараемся решить возникшие проблемы и отвечать на все комментарии пользователей.










Светодиоды загораются очень тускло, почти неразличимо. Предстартный запуск светодиодов очень яркий, а в игре невидно. Подскажите пути решения проблемы.
Исправили неточность в схеме подключения кнопок — резисторы нужно было подтянуть к GND. Также исправили скетч для игры
Удалили из скетча условия для ложного нажатия кнопок — программа работает без ошибок, но не учитывается неправильное нажатие кнопок. Возможно, в будущем исправим этот недочет
Объясните пожалуйста, что значит подключать светодиоды\кнопки последовательно по пинам? Например, светодиоды, начиная с пина 4, значит сначала вставляем светодиод под фиолетовым проводом, затем под голубым и в конце под синим (по вашей схеме)? И кнопки с пина А0 значит, что после вставки трех светодиодов, вставляем три кнопки слева направа?
Все верно. Главное соблюдать соответствие кнопок и светодиодов в схеме: pin4 — A0, pin5 — A1, pin6 — A2 и т.д.
Светодиоды не зажигаются рандомно. Всегда в одном и том же порядке
Нужно добавить randomSeed(millis()); в основной while, тогда они будут зажигаться каждый раз разные
Все попытки показывает как «ошибка»
у меня не работает одна кнопка светодиод загораеться а когда нажимаю на кнопку нажатие не защитываеться. что делать?