Игра Cowboy на Arduino
В этом проекте мы создадим игру «Ковбой» на платформе Arduino. В этой игре два игрока соревнуются на реакцию: кто первым нажмет кнопку после сигнала, получает 1 балл. Если игрок нажимает кнопку до сигнала или после соперника, ему не дается балл. Побеждает тот, кто первым наберет 5 баллов. Игра включает световую и звуковую индикацию состояния игры с помощью светодиодов и зуммера, а также отображение счета на ЖК-дисплее 1602 i2c.
Необходимые компоненты:
Arduino Uno или Nano
ЖК-дисплей 1602 i2c
2 кнопки
2 светодиода
Зуммер
Резисторы (10 кОм для кнопки и 220 Ом для светодиодов)
Соединительные провода
Макетная плата (breadboard)
Подключение компонентов:
Подключение ЖК-дисплея:
SDA -> A4 (Uno/Nano)
SCL -> A5 (Uno/Nano)
VCC -> 5V
GND -> GND

Шаги реализации:
Подключите ЖК-дисплей, кнопки, светодиоды и зуммер к Arduino согласно схеме выше.
Подключите библиотеку для Arduino.
Для это выполните следующие шаги:
Скачайте обе библиотеки с официального сайта или из репозитория GitHub:
Откройте программу Arduino IDE и перейдите в меню «Скетч» → «Подключить библиотеку» → «Добавить .ZIP библиотеку…».
В открывшемся окне выберите скачанный .zip файл и нажмите «Открыть».
Снизу Arduino IDE появится сообщение «Библиотека добавлена. Проверьте меню «Подключить библиотеку» «.
Теперь библиотека будет доступна для использования в ваших проектах.
Создайте новый скетч.
Перепишите следующий код:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Инициализация LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int button1 = 2; // Пин первой кнопки
const int button2 = 3; // Пин второй кнопки
const int led1 = 8; // Пин первого светодиода
const int led2 = 9; // Пин второго светодиода
const int buzzer = 10; // Пин зуммера
int score1 = 0; // Счет первого игрока
int score2 = 0; // Счет второго игрока
const int winScore = 5; // Количество баллов для победы
bool gameOn = false; // Флаг начала игры
bool signalGiven = false; // Флаг подачи сигнала
unsigned long startTime;
unsigned long signalTime;
struct MusicStruct { //generating tones
int A = 550;
int As = 582;
int B = 617;
int C = 654;
int Cs = 693;
int D = 734;
int Ds = 777;
int E = 824;
int F = 873;
int Fs = 925;
int G = 980;
int Gs = 1003;
int A2 = 1100;
int A2s = 1165;
int B2 = 1234;
int C3 = 1308;
int C3s = 1385;
int D3 = 1555;
} Music;
struct LengthStruct {
float half = 0.5;
float one = 1.0;
float one_half = 1.5;
float two = 2.0;
float two_half = 2.5;
} Length;
int tempo = 400;
void setup() {
pinMode(button1, INPUT);
pinMode(button2, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(buzzer, OUTPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(" Created by");
lcd.setCursor(0, 1);
lcd.print(" Alash engineer");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Cowboy Game");
delay(2000);
lcd.clear();
resetGame();
}
void loop() {
if (gameOn) {
if (millis() >= signalTime && !signalGiven) {
// Сигнал начала реакции
lcd.setCursor(0, 0);
lcd.print("Press Now!");
tone(buzzer, 1000, 200); // Сигнал зуммера
signalGiven = true;
}
if (signalGiven) {
if (digitalRead(button1) == HIGH) {
handleButtonPress(1);
}
if (digitalRead(button2) == HIGH) {
handleButtonPress(2);
}
} else {
if (digitalRead(button1) == HIGH) {
handleFalseStart(1);
}
if (digitalRead(button2) == HIGH) {
handleFalseStart(2);
}
}
} else {
if (score1 == winScore || score2 == winScore) {
lcd.setCursor(0, 0);
lcd.print("Player ");
lcd.print(score1 == winScore ? "1 Wins!" : "2 Wins!");
harrypotter();
// delay(5000);
resetGame();
} else {
startNewRound();
}
}
}
void startNewRound() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Get Ready...");
delay(100);
lcd.setCursor(0, 1);
lcd.print("Score: ");
lcd.print(score1);
lcd.print(" - ");
lcd.print(score2);
startTime = millis();
signalTime = startTime + random(1500, 2500); // Сигнал через 1.5-2.5 секунд
gameOn = true;
signalGiven = false;
}
void handleButtonPress(int player) {
gameOn = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Player ");
lcd.print(player);
lcd.print(" Wins!");
if (player == 1) {
score1++;
digitalWrite(led1, HIGH);
delay(500);
digitalWrite(led1, LOW);
} else {
score2++;
digitalWrite(led2, HIGH);
delay(500);
digitalWrite(led2, LOW);
}
lcd.setCursor(0, 1);
lcd.print("Score: ");
lcd.print(score1);
lcd.print(" - ");
lcd.print(score2);
delay(2000);
lcd.clear();
}
void handleFalseStart(int player) {
gameOn = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Player ");
lcd.print(player);
lcd.print(" False!");
tone(buzzer, 500, 500); // Сигнал ложного старта
if (player == 1) {
score2++;
digitalWrite(led1, HIGH);
delay(500);
digitalWrite(led1, LOW);
} else {
score1++;
digitalWrite(led2, HIGH);
delay(500);
digitalWrite(led2, LOW);
}
lcd.setCursor(0, 1);
lcd.print("Score: ");
lcd.print(score1);
lcd.print(" - ");
lcd.print(score2);
delay(2000);
lcd.clear();
}
void resetGame() {
score1 = 0;
score2 = 0;
gameOn = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Cowboy Game");
lcd.setCursor(0, 1);
lcd.print("Score: 0 - 0");
delay(1000);
startNewRound();
}
void setTone(int pin, int note, int duration) {
tone(pin, note, duration);
delay(duration);
noTone(pin);
}
void harrypotter() {
setTone(buzzer, Music.B, tempo * Length.one);
setTone(buzzer, Music.E, tempo * Length.one_half);
setTone(buzzer, Music.G, tempo * Length.half);
setTone(buzzer, Music.F, tempo * Length.one);
setTone(buzzer, Music.E, tempo * Length.two);
setTone(buzzer, Music.B2, tempo * Length.one);
setTone(buzzer, Music.A2, tempo * Length.two_half);
setTone(buzzer, Music.Fs, tempo * Length.two_half);
setTone(buzzer, Music.E, tempo * Length.one_half);
setTone(buzzer, Music.G, tempo * Length.half);
setTone(buzzer, Music.F, tempo * Length.one);
setTone(buzzer, Music.Ds, tempo * Length.two);
setTone(buzzer, Music.F, tempo * Length.one);
setTone(buzzer, Music.B, tempo * Length.two_half);
}
Заключение
В этом проекте вы научились создавать простую игру на реакцию для двух игроков с использованием Arduino. Мы использовали ЖК-дисплей для отображения состояния игры, светодиоды для индикации победы, и зуммер для подачи звуковых сигналов. Этот проект является отличным примером того, как можно комбинировать различные компоненты и библиотеки Arduino для создания увлекательных и интерактивных приложений. Наслаждайтесь игрой и продолжайте развивать свои навыки программирования и работы с электроникой!