Игра «Whack-a-Mole» на Arduino Uno — интерактивный проект с LED и джойстиком
Компоненты и материалы
| Arduino UNO | × | 1 |
| Светодиоды (LED) | × | 7 |
| Резистор 221 Ом | × | 7 |
| Аналоговый джойстик (универсальный) | × | 1 |
| Провода-перемычки (универсальные) | × | 8 |
| Провода Male/Female | × | 4 |
О проекте
Это был мой первый проект на Arduino, я создал его, опираясь на знания из первых уроков по светодиодам и базовому управлению.
Эта игра «Whack-a-Mole» (Ударь крота) использует 7 светодиодов и джойстик. Имеется 4 «крота», представленных 2-м, 3-м, 4-м и 5-м светодиодами слева на моей плате. Один из четырех светодиодов случайным образом загорается и дает определенное время на нажатие соответствующего направления на джойстике. Я расположил светодиоды так, что слева направо направления джойстика соответствуют: влево, вверх, вниз, вправо. Это просто моя условность, проявите фантазию и попробуйте другие варианты!
Два крайних слева светодиода — красный и зеленый — указывают на неправильный или правильный выбор. Желтый светодиод справа мигает, показывая текущий рекорд, и отображает счет каждый раз при завершении попытки (когда сделан неверный выбор). Естественно, новый рекорд заменяет старый.
Пожалуй, самая сложная часть проекта — аналоговый джойстик. Для обоих направлений джойстика максимальные значения составляют 0 и 1024 (у меня было 1023, так что если выборы не срабатывают правильно, попробуйте это значение). Эти значения можно измерить через монитор последовательного порта. Я упростил эти входные значения с помощью операторов switch для осей X и Y. Не уверен, что это лучший способ, но так как мне нужны были только максимальные значения каждого направления (всего 4 варианта, 4 светодиода-крота), я присвоил целые числа каждой возможности: 1, 2, 3, 4, соответствующие Влево, Вправо, Вверх, Вниз.

Уровни сложности, заданные в коде как константы, — это время в миллисекундах, которое у игрока есть на выбор. Вы можете изменить эти времена для настройки сложности под себя. Думал о выборе сложности с помощью кнопок или джойстика в начале игры, но это не стоило бы усилий, так как показалось довольно сложным и не очень удобным для пользователя.
Буду рад любым предложениям по модификациям и улучшениям! :)
Код
WhackALED
// Whack a LED (Ударь светодиод)
// Переменные джойстика
int sX = A0; // ось X джойстика, аналоговый вход
int sY = A1; // ось Y джойстика, аналоговый вход
int sSX; // состояние X, чтение с sX
int sSY; // состояние Y, чтение с sY
int sS; // преобразованное состояние (возможно, не самое эффективное)
// Игровые переменные
int rNum; // случайное число, выбирающее светодиод
int wins=0; // счетчик последовательных побед
int highScore=0; // сохранение максимального счета последовательных побед
// Константы сложности, время реакции
const int easy=1000;
const int medium=500;
const int hard=325;
const int stupid=250;
int ledPins[]={5,2,4,3,6,7,8}; // пины светодиодов
int pinCount=7; // количество пинов светодиодов
void setup() {
Serial.begin(9600);
pinMode(sX, INPUT);
pinMode(sY, INPUT);
for (int thisPin = 0; thisPin < pinCount; thisPin++) {
// назначение всех пинов как выходы в цикле
pinMode(ledPins[thisPin], OUTPUT);
}
}
void loop() {
rNum=random(4); // генерация случайного выбора
delay(1000);
digitalWrite(ledPins[rNum], HIGH); // зажигание случайно выбранного светодиода
delay(stupid); // сложность
// работа с джойстиком
sSX = analogRead(sX); // чтение входа оси X
delay(100);
sSY = analogRead(sY); // чтение входа оси Y
// преобразование входов X и Y в 4 возможности. 0 и 1023 — максимальные значения на каждой оси джойстика, по измерениям.
sS=0;
switch (sSX) {
case 0: sS=1; // Влево
break;
case 1023: sS=2; // Вправо
break;
}
switch (sSY) {
case 0: sS=3; // Вверх
break;
case 1023: sS=4; // Вниз
break;
}
digitalWrite(ledPins[rNum], LOW); // гашение случайно выбранного светодиода после выбора джойстика
if (sS-1==rNum) // проверка, ввел ли игрок правильное направление загоревшегося светодиода
{
wins++;
for (int k=0; k<=3; k++) {
// мигание зеленым светодиодом, указывая на правильный выбор
digitalWrite(ledPins[4], HIGH);
delay(50);
digitalWrite(ledPins[4], LOW);
delay(50);
}
}
else {
if (wins>highScore) {
// если последовательные победы больше предыдущего рекорда, устанавливается новый рекорд
highScore=wins;
wins=0;
}
for (int i=0; i<=3; i++) {
// мигание красным светодиодом, указывая на неверный выбор
digitalWrite(ledPins[5], HIGH);
delay(50);
digitalWrite(ledPins[5], LOW);
delay(50);
}
for (int w=0; w<highScore; w++) {
// отображение рекорда через подсчет и мигание желтым светодиодом
digitalWrite(ledPins[6], HIGH);
delay(200);
digitalWrite(ledPins[6], LOW);
delay(200);
}
}
}
Схемы
Всё должно соответствовать реальной фотографии проекта, за исключением джойстика. У моего джойстика 5 пинов, 4 из которых я использовал: сверху вниз «GND», «+5V», «VRx» и «VRy». «GND» и «+5V» подключены к GND и 5V на Arduino, «VRx» и «VRy» — к A0 и A1.


Производственный процесс
- Газовые фонари: эволюция, дизайн и современное производство
- Лазерный указатель: дизайн, производство и обзор безопасности
- Фонарик: от изобретения к современным инновациям
- Калейдоскоп: от науки Брюстера к современному дизайну
- Полупроводниковые лазеры: точное генерирование света для современных технологий
- Искусство и наука фотографических процессов: от dageерротипов к современной пленке
- Светофоры: инженерия, история и будущие инновации
- Светодиоды (LED): от зарождения к 100-летнему ресурсу
- Освоение аксессуаров для LED лент: подключение, управление и кастомизация
- Расшифровка приборной панели: лампы, индикаторы и их значение