RO EN

Dinosaur Game

18.01.2026

Mai țineți minte jocul cu dinozaurul? Și nostalgia pe care o avea? Ei bine, astăzi voi construi unul chiar cu arduino. Vom folosi librăriile Wire și LiquidCrystal_I2C. Pentru a seta contrastul ca să vedeți imaginea aveți un potențiometru la spate. Rotiți-l cu o șurubelniță ușor până ce se vede imaginea:

Componente necesare:

  • Arduino Uno (sau alt microcontroller compatibil)

  • Ecran LCD 16x2 cu modul I2C

  • Buton (push-button)

  • Fire de legătură (jumper wires)

  • Breadboard (opțional, recomandat pentru organizare)

Conexiuni:

LCD cu I2C

  • GND → GND Arduino

  • VCC → 5V Arduino

  • SDA → A4 Arduino Uno

  • SCL → A5 Arduino Uno

Buton

  • Un pin → D2 (digital input)

  • Celălalt pin → GND (folosește INPUT_PULLUP în cod)

LED (opțional)

  • Anod (+) → pin digital (de exemplu D8)

  • Catod (−) → rezistor 220 Ω → GND

Cod:

#include <Wire.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

const int jumpButton = 2;

int dinoPos = 0; // 0 = ground, 1 = jumping

int cactusPos = 15; // Cactus position

int score = 0;

boolean gameRunning = true;

unsigned long jumpStartTime = 0;

const int JUMP_DURATION = 600; // Jump time in milliseconds

byte dino[8] = {

B00000,

B00000,

B00111,

B00101,

B10111,

B10100,

B01110,

B00000

};

byte cactus[8] = {

B00100,

B10100,

B10100,

B10100,

B10100,

B10111,

B01100,

B00100

};

void setup() {

lcd.init();

lcd.backlight();

lcd.createChar(0, dino);

lcd.createChar(1, cactus);

pinMode(jumpButton, INPUT_PULLUP);

lcd.setCursor(0, 1);

lcd.write(byte(0));

}

void loop() {

if (gameRunning) {

// Handle jumping

if (digitalRead(jumpButton) == LOW && dinoPos == 0) {

dinoPos = 1;

jumpStartTime = millis();

lcd.setCursor(0, 1);

lcd.print(" ");

lcd.setCursor(0, 0);

lcd.write(byte(0));

}

// Check if jump should end

if (dinoPos == 1 && millis() - jumpStartTime >= JUMP_DURATION) {

dinoPos = 0;

lcd.setCursor(0, 0);

lcd.print(" ");

lcd.setCursor(0, 1);

lcd.write(byte(0));

}

// Move cactus

static unsigned long lastMove = 0;

if (millis() - lastMove >= 200) { // Control cactus speed

lcd.setCursor(cactusPos, 1);

lcd.print(" ");

cactusPos--;

if (cactusPos < 0) {

cactusPos = 15;

score++;

}

lcd.setCursor(cactusPos, 1);

lcd.write(byte(1));

lastMove = millis();

}

// Improved collision detection

if (cactusPos == 0 && dinoPos == 0) {

gameRunning = false;

gameOver();

}

// Update score

lcd.setCursor(12, 0);

lcd.print("S:");

if (score < 10) lcd.print(" "); // Padding for single digits

lcd.print(score);

}

}

void gameOver() {

lcd.clear();

lcd.setCursor(0, 0);

lcd.print("Game Over!");

lcd.setCursor(0, 1);

lcd.print("Score: ");

lcd.print(score);

while (digitalRead(jumpButton) == HIGH) {

delay(100);

}

// Reset game

score = 0;

cactusPos = 15;

dinoPos = 0;

lcd.clear();

lcd.setCursor(0, 1);

lcd.write(byte(0));

gameRunning = true;

}