Игра на реакцию с платой Arduino

Игра на реакцию с платой Ардуино

Настольная игра на реакцию ► простой и интересный проект на Ардуино. В статье мы разместили схему сборки игры и пример программы с подробными комментариями.

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

Игра на реакцию с Arduino - Flash

Принцип работы игры довольно простой — после включения светодиода (они включаются рандомно), необходимо как можно быстрее нажать соответствующую кнопку. Временной интервал включения светодиода и прочие настройки можно изменить в скетче. После выполнения всех попыток, на монитор порта Arduino IDE выводится количество правильных попыток, среднее и лучшее время реакции.

Как сделать настольную игру на Ардуино




Для этого проекта нам потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • макетная плата;
  • 3 тактовых кнопки Ардуино;
  • 3 светодиода;
  • 6 резисторов;
  • провода «папа-папа».

Схема сборки игры на реакцию с Ардуино

Схема сборки Arduino Game
Схема сборки Arduino Game на проверку реакции

На схеме показано подключение трех пар светодиодов и кнопок, но вы можете подключить до пяти пар, изменив соответствующие настройки в скетче. Важно! Подключайте светодиоды последовательно, начиная с 4 пина, а кнопки с пина A0 до A5. Игра начинается после кратковременного зажигания всех светодиодов. При желании можно подключить пьезодинамик в Ардуино, для звукового сигнала к началу игры.

Скетч для игры на реакцию с Ардуино

/* эти переменные можно изменять */
int d1 = 1000;           // начальный интервал включения в миллисекундах
int d2 = 2000;           // конечный интервал включения в миллисекундах
int d3 = 3000;           // время ожидания для кнопки
byte tarrgr = 5;         // количество заданий в раунде
byte knp = 3;            // количество пар кнопок и светодиодов
/* остальной код игры не меняется */
 
byte pinD = 4 + knp;      // светодиоды подключаются строго с pin4 и до pin8
byte pinA = 14 + knp;    // кнопки подключаются строго c pinA0 и до pinA4
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 light = random(0, knp);
      int LED = light + 4;
      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 (digitalRead(BTN - 4) == HIGH || digitalRead(BTN - 3) == HIGH ||
             digitalRead(BTN - 2) == HIGH || digitalRead(BTN - 1) == HIGH) {
            digitalWrite(LED, LOW);
            delay(300); setreakt = 0; err++; tarrgn++; ext = 11;
         }

         if (digitalRead(BTN + 4) == HIGH || digitalRead(BTN + 3) == HIGH ||
             digitalRead(BTN + 2) == HIGH || digitalRead(BTN + 1) == HIGH) {
            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;
  }
}

Пояснения к коду:

  1. все настройки скетча можно менять в начале программы;
  2. неправильный порядок подключения светодиодов и кнопок повлияют на работу программы. Подключать можно не более пяти пар светодиодов и кнопок.

Заключение. К плате можно подключить LCD дисплей Ардуино и выводить результаты уже на экран. Дополнительно можно придумать различные варианты включения светодиодов, например, одновременно включать два светодиода. Возникшие вопросы, можно оставлять в комментариях к этой записи — мы всегда стараемся решить возникшие проблемы и отвечать на все комментарии пользователей.

1 Star2 Stars3 Stars4 Stars5 Stars (1 votes, average: 5,00 out of 5)
Загрузка...

Примеры похожие на Игра на реакцию с платой Arduino:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *