Игра на Ардуино с LCD дисплеем

Игра на Arduino Uno с дисплеем LCD — это простой проект для начинающих программировать микроконтроллеры. Для сборки потребуется жк дисплей с I2C модулем, тактовая кнопка и пьезодинамик. Программу для игры и схему сборки проекта вы найдете ниже на этой странице. Кнопку и пьезодинамик можно собрать на макетной плате или подключить к Ардуино модули с кнопкой и пьезоизлучателем.
Суть игры «Дракончик» очень простая. На жк дисплее выводится уровень игры и главный персонаж, которому необходимо уклоняться от препятствий. На экране рандомно появляются дерево, камень или птица, а дракончику нужно перепрыгивать через них. Для управления дракончиком к плате Arduino подключатся тактовая кнопка. С каждым уровнем скорость движения препятствий по дисплею I2C увеличивается.
Игра на Ардуино с дисплеем LCD I2C
Для этого проекта нам потребуется:
- плата Arduino Uno / Arduino Nano / Arduino Mega;
- жидкокристаллический дисплей с I2C;
- одна тактовая кнопка и резистор;
- пьезодинамик;
- провода «папа-папа», «папа-мама».

Вместо подключения кнопки к Ардуино через резистор на макетной плате можно использовать модуль с кнопкой. Пьезодинамик (пьезоизлучатель) подключается к плате при желании, можно обойтись и без него. Соберите схему, как на картинке выше, и загрузите следующий скетч. Скачать программу для игры «Дракончик» на Arduino с жк дисплеем можно здесь. Скорость игры и звуки можно изменить в программе.
Скетч для игры «Дракончик» на дисплее
#include <Wire.h> // библиотека для протокола IIC #include <LiquidCrystal_I2C.h> // подключаем библиотеку LCD IIC LiquidCrystal_I2C LCD(0x27, 20, 2); // присваиваем имя lcd для дисплея int level = 1; // переменная для отсчета уровня int pause = 400; // переменная для задержки byte p = 0; // переменная для времени прыжка // создаем массивы дракончика, дерева, камня и птицы byte dracon[8] = { 0b01110, 0b11011, 0b11111, 0b11100, 0b11111, 0b01100, 0b10010, 0b11011 }; byte derevo[8] = { 0b00000, 0b00000, 0b00000, 0b11011, 0b11011, 0b11011, 0b01100, 0b01100 }; byte kamen[8] = { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b11111 }; byte ptica[8] = { 0b00100, 0b00101, 0b01111, 0b11111, 0b10100, 0b00100, 0b00000, 0b00000 }; void setup() { pinMode (10, OUTPUT); // подключаем пьезодинамик pinMode (A1, INPUT); // подключаем кнопку analogWrite(A1, LOW); LCD.init(); // инициализация LCD дисплея LCD.backlight(); // включение подсветки дисплея // создаем символы дракончика, дерева, камня и птицы LCD.createChar(0, dracon); LCD.createChar(1, derevo); LCD.createChar(2, kamen); LCD.createChar(3, ptica); // начинаем игру: выводим надпись GO! LCD.setCursor(7, 0); LCD.print("GO!"); delay(400); tone(10, 600); delay(100); noTone(10); LCD.clear(); } void loop() { // первоначальное положение дракончика и препятствия byte d = 1; byte x = 15; byte y = 1; // выбираем препятствие, которое появится, рандомно byte i = random (1, 4); if (i == 3) y = 0; else y = 1; while (x > 0) { // очищаем экран и выводим номер уровня LCD.clear(); LCD.setCursor(0, 0); LCD.print(level); // считываем данные с кнопки и учитываем количество циклов в прыжке // если дакончик находится в прыжке долго - возвращаем его вниз if (digitalRead(A1) == LOW) d = 1; if (digitalRead(A1) == HIGH) d = 0; if (p > 3) d = 1; // выводим дракончика в нужной строке LCD.setCursor(4, d); LCD.print(char(0)); // выводим препятствие LCD.setCursor(x, y); tone(10, 50); LCD.print(char(i)); noTone(10); // если дракончик наткнулся на препятствие выводим надпись GAME OVER! if (x == 4 && y == d) { delay(400); tone(10, 50); delay(100); noTone(10); delay(100); tone(10, 20); delay(300); noTone(10); LCD.clear(); delay(200); LCD.setCursor(3, 0); LCD.print("GAME OVER!"); delay(600); LCD.clear(); delay(400); LCD.setCursor(3, 0); LCD.print("GAME OVER!"); delay(600); LCD.clear(); LCD.setCursor(3, 1); LCD.print("LEVEL: "); LCD.print(level); delay(400); LCD.setCursor(3, 0); LCD.print("GAME OVER!"); delay(3000); LCD.clear(); // начинаем игру заново, обнулив уровень игры LCD.setCursor(7, 0); LCD.print("GO!"); delay(400); tone(10, 600); delay(100); noTone(10); LCD.clear(); level = 0; pause = 400; p = 0; y = 1; x = 0; break; } // если дракончик прыгнул, издаем звук if (d == 0) { tone(10, 200); delay(100); noTone(10); } else { delay(100); } // если дракончик не столкнулся, то меняем положение препятствия // начинаем считать сколько циклов дракончик находится в прыжке delay(pause); x = x - 1; p = p + 1; if (p > 4) p = 0; } // переходим на следующий уровень и сокращаем время задержки tone(10, 800); delay(20); level = level + 1; pause = pause - 20; if (pause < 0) pause = 0; }
Пояснения к коду:
- в начале программы создаются массивы, где нарисован дракончик и препятствия, их можно изменить и создать свои символы или изображения;
- переменная
int pause = 400;
задает начальную скорость движения препятствий по экрану (можно поставить свое значение в скетче); - после прохождения каждого уровня, скорость игры увеличивается, путем уменьшения времени задержки на 20 миллисекунд
pause = pause - 20;
.
Подборка на тему: Игра на Ардуино с LCD дисплеем
16 комментариев для “Игра на Ардуино с LCD дисплеем”
Добавить комментарий
Записи похожие на: Игра на Arduino и LCD с кнопкой
- Подключение матрицы WS2812B к Ардуино
- Аналоговый и цифровой выход Ардуино
- Метеостанция на Ардуино с дисплеем
- Подключение датчика цвета к Ардуино
Проекты похожие на: Игра на Arduino и LCD с кнопкой
Экран включился и Больше нечего не происходит , не подскажете в чём может быть проблема ?
А простые скетчи работают? Например, из этого примера — https://xn--18-6kcdusowgbt1a4b.xn--p1ai/lcd-1602-arduino/
Вся проблема в не корректности установленной библиотеки к LCD.
Добрый день! Проблема следующая: при нажатии на кнопку, дракончик не прыгает. Все контакты прозвонил, проверил работоспособность входа АЦП А1 через простейший скейтч с выводом результатов нажатия кнопки на монитор портов. Использовал резисторы от 1 кОм до 10 кОм
Резистор можно использовать любой, так как в скетче игры Arduino можно поменять значения с аналогового порта. Недавно эту схему собирали пятиклашки — у всех игра работала.
Попробуйте заменить строки
«if (analogRead(A1) > 100) d = 0;
if (analogRead(A1) < 100) d = 1;"
на строки
"if (digitalRead(2) == LOW) d = 0;
if (digitalRead(2) == HIGH) d = 1;"(Предварительно подключив кнопку на пин 2 и заменив строку " pinMode (A1, INPUT);" на строку "pinMode (2, INPUT);").
Можно даже так (без замены pinMode):
Спасибо
Все работает, только когда не держу кнопку, дракончик прыгает, а когда удерживаю он бежит
Поменяйте у кнопки «плюс» и «минус» местами. Второй вариант — поменять местами знаки «больше», «меньше» в строчках:
exit status 1
‘class LiquidCrystal_I2C’ has no member named ‘init’
в чем проблема?
Проблема с библиотекой LiquidCrystal_I2C.h
exit status 1
within this context
Что делать?
Первым делом проверьте, установлена ли библиотека LiquidCrystal_I2C.h Инструкция по установке библиотек здесь
Не прыгает динозаврик
Сделали правки в программе для игры на дисплее