Перейти к содержанию

Игра на Ардуино «Dino T-Rex» с дисплеем 16×2

dino

Игра на Arduino Динозаврик T-Rex (Дракончик) с дисплеем LCD 1602 — простой и интересный проект для начинающих программистов. Для сборки игры вам понадобится lcd экран I2C, кнопка, пьезодинамик и макетная плата с коннекторами. Программа для игры и схема проекта размещена на этой странице. Кнопка и пьезодинамик могут быть собраны на макетной плате, а модули кнопки и зуммера следует подключать напрямую к Arduino.

Необходимые компоненты:

  • Arduino Uno / Arduino Nano / Arduino Mega
  • дисплей LCD 1602 i2c
  • тактовая кнопка
  • пьезодинамик
  • макетная плата
  • коннекторы
  • библиотека LiquidCrystal_I2C.h

Дополнительные материалы на эту тему:

  1. Игра на Ардуино Повтори последовательность
  2. Пианино на Ардуино с кнопками и зуммером
  3. Тетрис на Ардуино с дисплеем OLED 128×64

Суть игры «Dino T-Rex» очень проста — на экране отображается уровень игры и динозаврик, который должен уворачиваться от препятствий. На экране в случайном порядке появляется препятствие, а динозавр должен перепрыгнуть через них. На каждом уровне скорость увеличивается. Также вы можете собрать еще один интересный мини проект, опубликованный у нас — Игра на реакцию с тремя тактовыми кнопками.

Схема игры Динозаврик Arduino с дисплеем LCD 1602

Схема игры на Arduino с дисплеем LCD 1602

LCD 1602 i2c Arduino Uno Arduino Nano Arduino Mega
GND GND GND GND
VCC 5V 5V 5V
SDA A4 A4 20
SCL A5 A5 21

Вместо подключения кнопки к Ардуино через подтягивающий резистор на макетной плате, можно использовать модуль с кнопкой. Пьезодинамик (зуммер) для звуковых эффектов игры подключается к микроконтроллеру по желанию, но можно обойтись и без него. Соберите схему, как показано на рисунке выше, и загрузите следующую программу в плату Arduino Uno. Скорость игры «Dino T-Rex» на дисплее можно изменить в коде.

Скетч для игры Динозаврик на Arduino с LCD дисплеем


#include "Wire.h"
#include "LiquidCrystal_I2C.h"
LiquidCrystal_I2C LCD(0x27, 20, 2);

#define BUZZER 10 // пин подключения зуммера
#define BUTTON 8  // пин подключения кнопки

// динозаврик
byte dino[8] = {
  0b01110, 0b11011, 0b11111, 0b11100, 0b11111, 0b01100, 0b10010, 0b11011
};
// дерево
byte tree[8] = {
  0b00000, 0b00000, 0b00000, 0b11011, 0b11011, 0b11011, 0b01100, 0b01100
};
// камень
byte stone[8] = {
  0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b01110, 0b11111
};
// птица
byte bird[8] = {
  0b00100, 0b00101, 0b01111, 0b11111, 0b10100, 0b00100, 0b00000, 0b00000
};

bool buttonWasUp = true;
bool buttonIsUp;
int level = 1;
int pause = 400;
byte p = 0;

void setup() {
  pinMode (BUZZER, OUTPUT);
  pinMode (BUTTON, INPUT_PULLUP);
  LCD.begin();
  LCD.backlight();

  LCD.createChar(0, dino);
  LCD.createChar(1, tree);
  LCD.createChar(2, stone);
  LCD.createChar(3, bird);

  LCD.setCursor(7, 0);
  LCD.print("GO!");
  delay(400);
  tone(BUZZER, 600);
  delay(100);
  noTone(BUZZER);
  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);

    buttonIsUp = digitalRead(BUTTON);
    if (buttonWasUp && !buttonIsUp) {
      delay(10);
      buttonIsUp = digitalRead(BUTTON);
      if (!buttonIsUp) { d = 0; }
      else { d = 1; }
    }
    buttonWasUp = buttonIsUp;
     
    if (p > 3) d = 1;

    LCD.setCursor(4, d);
    LCD.print(char(0));
    LCD.setCursor(x, y);
    tone(BUZZER, 50);
    LCD.print(char(i));
    noTone(10);

    if (x == 4 && y == d) {
      delay(400);
      tone(BUZZER, 50);
      delay(100);
      noTone(BUZZER);
      delay(100);
      tone(BUZZER, 20);
      delay(300);
      noTone(BUZZER);
      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(BUZZER, 600);
      delay(100);
      noTone(BUZZER);
      LCD.clear();

      level = 0;
      pause = 400;
      p = 0;
      y = 1;
      x = 0;
      break;
    }

    if (d == 0) {
      tone(BUZZER, 200);
      delay(100);
      noTone(BUZZER);
    }
    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; определяет начальную скорость движения препятствий (можно указать собственное значение). После прохождения каждого уровня скорость игры увеличивается за счет уменьшения переменной pause на 20 миллисекунд, используемой в команде delay() Arduino.

Комментарии 17

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

newzaym
➜