СОДЕРЖАНИЕ ►
Игра на 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;.










Экран включился и Больше нечего не происходит , не подскажете в чём может быть проблема ?
А простые скетчи работают? Например, из этого примера — https://xn--18-6kcdusowgbt1a4b.xn--p1ai/lcd-1602-arduino/
Вся проблема в не корректности установленной библиотеки к LCD.
добрый день, как вы решили эту проблему
если вы использовали драйвер для матрицы i2c то на самом драйвере есть переменный резистор его нужно покрутить тем самым отрегулировав контрастность дисплея
Может поможет покрутить потенциометр на переходнике айтуси
ну ты всё правильно подключил у меня была эта проблема а я просто не подключил GND
RКонтрастность у дисплея порегулируй-ка.
Доброго времени. Все работает. Но лучше для пинов ставить константы. Для легкого переноса. А то у меня кнопка на 10 пине. Намучался пока понял от чего он сам прыгает😁. Увеличили с 3 до 6. Теперь дракончик в воздухе или земле зависит от нажатия кнопки играть легко. Думаю нужно сделать что бы при нажатии он перескок делал ( Не реагировал на кнопку, пока не преземлится). И хотелось бы по чаще припятсвий. А так супер 👍. Спасибо.
Работает
Добрый день! Проблема следующая: при нажатии на кнопку, дракончик не прыгает. Все контакты прозвонил, проверил работоспособность входа АЦП А1 через простейший скейтч с выводом результатов нажатия кнопки на монитор портов. Использовал резисторы от 1 кОм до 10 кОм
Попробуйте заменить строки
«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):
Спасибо
Можно без резистроров
Все работает, только когда не держу кнопку, дракончик прыгает, а когда удерживаю он бежит
Поменяйте у кнопки «плюс» и «минус» местами. Второй вариант — поменять местами знаки «больше», «меньше» в строчках:
Проблема с библиотекой LiquidCrystal_I2C.h
Первым делом проверьте, установлена ли библиотека LiquidCrystal_I2C.h Инструкция по установке библиотек здесь
Сделали правки в программе для игры на дисплее
у меня ошибка в этой строчке
LCD.init(); // инициализация LCD дисплея
Попробуйте LCD.begin();
Здравствуйте, я всё собрал, но кнопка не работает. При нажатии на кнопку дракон не прыгает, пробовал менять кнопку, но не помогло. С чем это может быть связано и как устранить проблему?
ДА если кнопка не работает то просто плюс и минус местами поменять надо
Когда нажимаешь на кнопку прыгнуть то ничего не происходит кто может подскажите пожалуйста
Там где выбирается препятствие можно стереть одну строчки после строчки рандом
И написать: if (i==3){
y = random(0,2);
}
Почему динозаврик не прыгает?