daily pastebin goal
64%
SHARE
TWEET

Arduino Reaction Test

a guest Dec 7th, 2017 58 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #define RED_LED 11 // пин, куда подключен красный светодиод (должен поддерживать ШИМ!)
  2. #define GRN_LED 10 // пин, куда подключен зелёный светодиод (должен поддерживать ШИМ!)
  3. #define BLU_LED 9 // пин, куда подключен синий светодиод (должен поддерживать ШИМ!)
  4. #define LED_GND 8 // земля RGB светодиода
  5. #define BUTTON 2 // пин, куда подключена кнопка
  6.  
  7. unsigned long last_time, start_time; // переменные для таймеров
  8. boolean gameStarted; // булево, которое определяет, запущена ли игра
  9. int interval, react_time; // переменные - первая для хранения времени задержки, вторая для результата игры
  10.  
  11. #include <LiquidCrystal_I2C.h> // подключаем библиотеку дисплея
  12. LiquidCrystal_I2C lcd(0x3f, 16, 2); // настриваем дисплей 16x2 символа
  13.  
  14. void setup() {
  15.   // настраиваем пины светодиодов
  16.   pinMode(RED_LED, OUTPUT);
  17.   pinMode(GRN_LED, OUTPUT);
  18.   pinMode(BLU_LED, OUTPUT);
  19.   pinMode(LED_GND, OUTPUT);
  20.   pinMode(BUTTON, INPUT_PULLUP);
  21.   digitalWrite(LED_GND, 0);
  22.  
  23.   randomSeed(analogRead(0)); // создаём "зерно" для случайного числа на основе помех с неподключенного аналогового пина 0.
  24.  
  25.   lcd.init(); // инициализируем дисплей
  26.   lcd.backlight(); // включаем подсветку
  27.   lcd.print("Mikheev Maxim"); // выводим текст на первой строке
  28.   lcd.setCursor(0, 1); // переносим курсор на вторую строку
  29.   lcd.print("Development"); // выводим текст на второй строке
  30.   delay(1000); // ждём секунду
  31. }
  32.  
  33. void loop() {
  34.   if (!gameStarted) { // если игра не запущена
  35.     // гасим все светодиоды
  36.     analogWrite(RED_LED, 0);
  37.     analogWrite(GRN_LED, 0);
  38.     analogWrite(BLU_LED, 0);
  39.     lcd.clear(); // чистим дисплей
  40.     lcd.setCursor(0, 0); // переносим курсор в начало
  41.     lcd.print("Hold button"); // выводим текст
  42.    
  43.     while (digitalRead(BUTTON)) delay(2); // ожидаем нажатия кнопки. Задержка delay(2) для того, чтобы Arduino не "скопытилась" миллион раз в секунду считывать кнопку.
  44.     analogWrite(GRN_LED, 50); // зажигаем зелёный светодиод с яркостью 50/255 по ШИМ
  45.     lcd.clear(); // чистим дисплей
  46.     lcd.setCursor(0, 0); // переносим курсор в начало
  47.     lcd.print("Wait..."); // выводим текст
  48.     interval = random(500, 10000); // создаём рандомное время задержки
  49.     last_time = millis(); // инициализируем таймер
  50.     gameStarted = true; // запоминаем, что игра запущена
  51.   }
  52.   else { // если игра запущена
  53.     if (millis() - last_time > interval) { // если прошёл таймер по рандомному времени
  54.       // зажигаем красный и синий светодиод с яркостью 50/255 по ШИМ, зелёный гасим (получается фиолетовый цвет для RGB светодиода).
  55.       analogWrite(RED_LED, 50);
  56.       analogWrite(GRN_LED, 0);
  57.       analogWrite(BLU_LED, 50);
  58.       start_time = millis(); // сразу запоминаем текущее время работы Arduino для вычисления времени реакции, чтобы избежать неточности из-за задержек.
  59.       lcd.setCursor(0, 0); // переносим курсор в начало
  60.       lcd.print("Release!"); // выводим текст. Дисплей не чистим, так как предыдущий текст затрётся.
  61.       while (!digitalRead(BUTTON)); // ждём, когда кнопку отпустят
  62.       react_time = millis() - start_time; // высчитываем время реакции по текущему времени работы Arduino после отпускания кнопки, и времени до отпускания кнопки.
  63.       analogWrite(RED_LED, 0); // гасим красный светодиод, оставляем только синий, который уже горел.
  64.       lcd.setCursor(0, 0); // переносим курсор в начало
  65.       lcd.print("Reaction time:"); // выводим текст
  66.       lcd.setCursor(0, 1); // переносим курсор на вторую строку
  67.       lcd.print(react_time); // выводим время реакции
  68.       lcd.setCursor(14, 1); // переносим курсор почти в конец дисплея на второй строке, чтобы надпись из двух букв уместилась "впритык" к краю дисплея.
  69.       lcd.print("ms"); // выводим эти две буквы, которые означают, что эта цифра означает миллисекунды.
  70.       delay(2000); // ждём две секунды
  71.       gameStarted = false; // запоминаем, что игра закончилась
  72.     }
  73.     else { // если таймер не прошёл
  74.       if (digitalRead(BUTTON)) { // проверяем, не отпущена ли кнопка. Если да, то
  75.         // гасим зелёный, зажигаем красный светодиод с яркостью 50/255 по ШИМ.
  76.         analogWrite(RED_LED, 50);
  77.         analogWrite(GRN_LED, 0);
  78.         lcd.setCursor(0, 0); // переносим курсор в начало
  79.         lcd.print("Early released!"); // выводим текст о проигрыше
  80.         delay(2000); // ждём две секунды
  81.         gameStarted = false; // запоминаем, что игра закончилась
  82.       }
  83.     }
  84.   }
  85.   delay(20); // задержка для того, чтобы Arduino не "скопытилась" миллион раз в секунду выполнять цикл loop().
  86. }
RAW Paste Data
Top