Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define RED_LED 11 // пин, куда подключен красный светодиод (должен поддерживать ШИМ!)
- #define GRN_LED 10 // пин, куда подключен зелёный светодиод (должен поддерживать ШИМ!)
- #define BLU_LED 9 // пин, куда подключен синий светодиод (должен поддерживать ШИМ!)
- #define LED_GND 8 // земля RGB светодиода
- #define BUTTON 2 // пин, куда подключена кнопка
- unsigned long last_time, start_time; // переменные для таймеров
- boolean gameStarted; // булево, которое определяет, запущена ли игра
- int interval, react_time; // переменные - первая для хранения времени задержки, вторая для результата игры
- #include <LiquidCrystal_I2C.h> // подключаем библиотеку дисплея
- LiquidCrystal_I2C lcd(0x3f, 16, 2); // настриваем дисплей 16x2 символа
- void setup() {
- // настраиваем пины светодиодов
- pinMode(RED_LED, OUTPUT);
- pinMode(GRN_LED, OUTPUT);
- pinMode(BLU_LED, OUTPUT);
- pinMode(LED_GND, OUTPUT);
- pinMode(BUTTON, INPUT_PULLUP);
- digitalWrite(LED_GND, 0);
- randomSeed(analogRead(0)); // создаём "зерно" для случайного числа на основе помех с неподключенного аналогового пина 0.
- lcd.init(); // инициализируем дисплей
- lcd.backlight(); // включаем подсветку
- lcd.print("Mikheev Maxim"); // выводим текст на первой строке
- lcd.setCursor(0, 1); // переносим курсор на вторую строку
- lcd.print("Development"); // выводим текст на второй строке
- delay(1000); // ждём секунду
- }
- void loop() {
- if (!gameStarted) { // если игра не запущена
- // гасим все светодиоды
- analogWrite(RED_LED, 0);
- analogWrite(GRN_LED, 0);
- analogWrite(BLU_LED, 0);
- lcd.clear(); // чистим дисплей
- lcd.setCursor(0, 0); // переносим курсор в начало
- lcd.print("Hold button"); // выводим текст
- while (digitalRead(BUTTON)) delay(2); // ожидаем нажатия кнопки. Задержка delay(2) для того, чтобы Arduino не "скопытилась" миллион раз в секунду считывать кнопку.
- analogWrite(GRN_LED, 50); // зажигаем зелёный светодиод с яркостью 50/255 по ШИМ
- lcd.clear(); // чистим дисплей
- lcd.setCursor(0, 0); // переносим курсор в начало
- lcd.print("Wait..."); // выводим текст
- interval = random(500, 10000); // создаём рандомное время задержки
- last_time = millis(); // инициализируем таймер
- gameStarted = true; // запоминаем, что игра запущена
- }
- else { // если игра запущена
- if (millis() - last_time > interval) { // если прошёл таймер по рандомному времени
- // зажигаем красный и синий светодиод с яркостью 50/255 по ШИМ, зелёный гасим (получается фиолетовый цвет для RGB светодиода).
- analogWrite(RED_LED, 50);
- analogWrite(GRN_LED, 0);
- analogWrite(BLU_LED, 50);
- start_time = millis(); // сразу запоминаем текущее время работы Arduino для вычисления времени реакции, чтобы избежать неточности из-за задержек.
- lcd.setCursor(0, 0); // переносим курсор в начало
- lcd.print("Release!"); // выводим текст. Дисплей не чистим, так как предыдущий текст затрётся.
- while (!digitalRead(BUTTON)); // ждём, когда кнопку отпустят
- react_time = millis() - start_time; // высчитываем время реакции по текущему времени работы Arduino после отпускания кнопки, и времени до отпускания кнопки.
- analogWrite(RED_LED, 0); // гасим красный светодиод, оставляем только синий, который уже горел.
- lcd.setCursor(0, 0); // переносим курсор в начало
- lcd.print("Reaction time:"); // выводим текст
- lcd.setCursor(0, 1); // переносим курсор на вторую строку
- lcd.print(react_time); // выводим время реакции
- lcd.setCursor(14, 1); // переносим курсор почти в конец дисплея на второй строке, чтобы надпись из двух букв уместилась "впритык" к краю дисплея.
- lcd.print("ms"); // выводим эти две буквы, которые означают, что эта цифра означает миллисекунды.
- delay(2000); // ждём две секунды
- gameStarted = false; // запоминаем, что игра закончилась
- }
- else { // если таймер не прошёл
- if (digitalRead(BUTTON)) { // проверяем, не отпущена ли кнопка. Если да, то
- // гасим зелёный, зажигаем красный светодиод с яркостью 50/255 по ШИМ.
- analogWrite(RED_LED, 50);
- analogWrite(GRN_LED, 0);
- lcd.setCursor(0, 0); // переносим курсор в начало
- lcd.print("Early released!"); // выводим текст о проигрыше
- delay(2000); // ждём две секунды
- gameStarted = false; // запоминаем, что игра закончилась
- }
- }
- }
- delay(20); // задержка для того, чтобы Arduino не "скопытилась" миллион раз в секунду выполнять цикл loop().
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement