В этом проекте мы создадим игру на скорость реакции. Это будет устройство из ЖК-дисплея, RGB-светодиода и пьезоизлучателя.
Нам понадобится
Компоненты
- Плата Arduino
- Макетная плата
- Перемычки
- ЖК-дисплей размером 16x2
- RGB-светодиод (с модулем)
- Пьезоизлучатель
- Тактовая четырехконтактная кнопка
- Потенциометр с сопротивлением 50 кОм
- Резистор с сопротивлением 220 Ом
Библиотеки
- LiquidCrystal

Нам понадобится
Принцип работы
Начинаем игру, нажав и удерживая кнопку. RGB-светодиод загорается и светится разными цветами. Ваша цель — отреагировать как можно быстрее и отпустить кнопку, когда он загорится красным цветом. На ЖК-дисплее будет показана скорость вашей реакции в миллисекундах, с момента включения красного цвета до того, как вы отпустили кнопку (см. рис. 15.1).

Пьезоизлучатель будет отвлекать вас, издавая звуки в случайном порядке. Если вы отпустите кнопку слишком рано, на ЖК-дисплее появится соответствующее сообщение, и вам придется начать игру заново. RGB-светодиод на самом деле состоит из трех светодиодов в одном корпусе: красного, зеленого и синего цветов (см. рис. 15.2).

RGB — аддитивная цветовая модель. Это означает, что, комбинируя свет двух или более цветов, мы можем создавать другие цвета. Красный, зеленый и синий — это основные цвета, используемые для получения других оттенков, как показано на рис. 15.3.
Давайте рассмотрим RGB-светодиод более детально. На рис. 15.4 показан прозрачный светодиод с общим катодом. Обратите внимание, что светодиод имеет четыре ножки вместо привычных двух: по одной для красного, зеленого и синего, а последняя — либо катод, либо анод. В данном случае самым длинным выводом является катод, и он подключается к заземлению.


RGB-светодиод, используемый в этом проекте, уже установлен на модуль со встроенными резисторами, что позволяет нам сэкономить место на макетной плате.
Сборка
1. Подготовьте ЖК-дисплей в соответствии с инструкциями, приведенными в разделе «Подготовка ЖК-дисплея» в проекте №12.
2. Установите ЖК-дисплей, вставив его штырьки в отверстия макетной платы. Также установите на макетную плату потенциометр и с помощью перемычек подключите ЖК-дисплей и потенциометр к плате Arduino.

3. Центральный контакт потенциометра должен быть подключен к контакту 3 ЖК-дисплея (VO). Теперь подключите один из внешних контактов потенциометра к контакту GND, а другой — к контакту 5V платы Arduino. Потенциометр управляет контрастностью ЖК-дисплея.
4. Установите кнопку на макетную плату так, чтобы она перекрыла канавку в центре. Метки контактов показаны на рис. 15.5.

Подключите ножку А кнопки через резистор с сопротивлением 220 Ом к контакту GND, ножку С — к контакту 9, а ножку D — к контакту 5V платы Arduino (см. проект 1 для получения подробной информации о том, как работают тактовые кнопки).

5. Установите модуль RGB-светодиода и подключите ножку красного светодиода к контакту 8 платы Arduino, зеленого — к контакту б, синего — к контакту 7, а ножку питания (+) — к контакту 5V.

Если на вашем модуле используется штырь - (катод) вместо + (анод), его следует подключать к контакту GND платы Arduino.
6. Подключите красный провод пьезоизлучателя непосредственно к контакту 13 платы Arduino, а черный провод — к заземлению.

7. Убедитесь, что ваша цепь соответствует схеме, показанной на рис. 15.6, и загрузите в память Arduino код скетча, приведенный в разделе «Скетч» далее в этом проекте.

Скетч
Когда вы нажимаете и удерживаете кнопку, светодиод мигает случайными цветами и в какой-то момент становится красным. Время, на протяжении которого горит каждый цвет, устанавливается случайным образом, равно как и продолжительность пауз между цветами. Это означает, что вы не можете вычислить последовательность свечения цветов и предсказать, когда светодиод загорится красным.
Вы можете усложнить игру, увеличив продолжительность интервалов в следующей строке кода скетча:
PSE = random(500, 1200);
Вот полный скетч:
// Использовался RGB-светодиод с общим анодом (3 катода: R, G, B) #includeLiquidCrystal lcd(12, 11, 5, 4, 3, 2); int LEDR = 8; // Вывод, подключенный к красному светодиоду int LEDB = 7; // Вывод, подключенный к синему светодиоду int LEDGr = 6; // Вывод, подключенный к зеленому светодиоду int Button = 9; // Вывод, подсоединенный к кнопке int COLOR; // Переменная цвета int Beep; int PSE; // Переменная паузы int TME; // Время int RTME = 0; // Время реакции void setup() { lcd.begin(16, 2); pinMode(LEDR, OUTPUT); // Установка контактов светодиода в качестве выходных данных pinMode(LEDB, OUTPUT); pinMode(LEDGr, OUTPUT); pinMode(Button, INPUT); // Установка кнопки в качестве входных данных digitalWrite(LEDR, LOW); // Включите всех светодиодов digitalWrite(LEDB, LOW); digitalWrite(LEDGr, LOW); } void loop() { lcd.clear(); // Очистить экран lcd.print("Hold Button to"); // Отображение сообщения на жидкокристаллическом экране lcd.setCursor(0, 1); // Переход ко второй строке lcd.print("start."); while (digitalRead(Button) == LOW) { // Проверка не запускается до тех пор, пока кнопка не будет нажата (и удерживается). tone(13, 1200, 30); delay(1400); noTone(13); } lcd.clear(); digitalWrite(LEDR, HIGH); // Выключение индикатора запуска digitalWrite(LEDB, HIGH); digitalWrite(LEDGr, HIGH); randomSeed(analogRead(0)); // Случайный звук от контакта 0 COLOR = random(1, 4); // Генерирует случайные цвет PSE = random(500, 1200); // Произвольная продолжительность паузы между огнями // Повторение цикла, пока цвет зеленый или синий, а кнопка удерживается while (COLOR != 1 && digitalRead(Button) == HIGH) { digitalWrite(LEDGr, HIGH); digitalWrite(LEDB, HIGH); delay(PSE); randomSeed(analogRead(0)); Beep = random(1, 4); // Выбор случайных звуковых сигналов из зуммера (зуммер подает звуковой сигнал 1 из 3 раз) PSE = random(750, 1200); // Выбор произвольной продолжительности паузы между огнями (для усиления эффекта неожиданности) if (Beep == 1) { tone(13, 1600, 350); delay(750); noTone(13); } if (COLOR == 2) { digitalWrite(LEDGr, LOW); } if (COLOR == 3) { digitalWrite(LEDB, LOW); } delay(PSE); randomSeed(analogRead(0)); COLOR = random(1, 4); // Выбор случайного цвета } // Цыкл выполняется, если цвет красный if (COLOR == 1 && digitalRead(Button) == HIGH) { digitalWrite(LEDGr, HIGH); digitalWrite(LEDB, HIGH); delay(PSE); TME = millis(); // Рекордное время с момента запуска программы digitalWrite(LEDR, LOW); while (digitalRead(Button) == HIGH) { // Выполняется до тех пор, пока кнопка не будет отпущена, записывая время реакции delay(1); } lcd.display(); RTME = millis() - TME; // Время реакции в миллисекундах lcd.print("Reaction Time:"); // Отображение на ЖК-экране lcd.setCursor(0, 1); lcd.print(RTME); } // Выполняется, если цвет не красный, но кнопка отпущена if (COLOR != 1) { lcd.print("Released too"); lcd.setCursor(0, 1); // Перейти ко второй строке lcd.print("soon!!!"); tone(13, 3000, 1500); delay(500); noTone(13); } // Проверка не перезапускается до тех пор, пока кнопка не будет нажата один раз while (digitalRead(Button) == LOW) { delay(10); } digitalWrite(LEDR, LOW); // Сброс всех индикаторов, чтобы начать все сначала digitalWrite(LEDB, LOW); digitalWrite(LEDGr, LOW); lcd.clear(); lcd.print("Hold Button to"); lcd.setCursor(0, 1); lcd.print("start."); int Time = 0; delay(1000); }
Теги: