Construa um Jogo LCD "Ninja Dollar" com Arduino UNO
Componentes e Materiais
| Componente | Quantidade | Observações |
|---|---|---|
| Arduino UNO | 1 | |
| LCD Padrão Adafruit 16x2 Branco no Azul | 1 | |
| Protoboard (genérica) | 2 | Usei duas por espaço; uma basta |
| Potenciômetro Mono 10k ohms | 1 | |
| LED (genérico) | 2 | |
| Resistor 1k ohm | 4 | |
| Chave Pushbutton 12mm SparkFun | 2 | |
| Buzzer Passivo RobotGeek | 1 | |
| Jumpers (genéricos) | 1 |
Ferramentas Necessárias
- Ferro de Solda (para soldar LCD)
Sobre o Projeto
Jogo simples em LCD. Inspiração: jogo do Dinossauro do Chrome, com adições. O guerreiro "$" move-se constantemente, pula obstáculos ("#") e coleta estrelas ("*"). Pular obstáculo = 1 ponto; pegar estrela = 5 pontos. Pode atirar ("~") para remover obstáculos. LEDs indicam pulo/tiro. A cada 10, 20, 30 pontos, velocidade aumenta. 50 pontos = vitória. Colisão = game over. Limites ajustáveis no código. Buzzer toca sons de pulo/tiro e melodias de vitória/derrota. Meu primeiro projeto aqui – comentem!
Vídeo
(Vídeo demonstrativo no projeto original)
Conexões
O módulo LCD tem header macho 16 pinos na parte inferior. Encaixe na protoboard conforme imagem. Pinos (da esquerda para direita):
- GND – terra
- VCC – alimentação +5V
- V0 – ajuste de contraste
- RS – seleção de registrador
- R/W – seleção leitura/escrita
- E – enable
- D0-D3 – não usados (modo 4 bits)
- D4 – pino Arduino 5
- D5 – pino Arduino 4
- D6 – pino Arduino 3
- D7 – pino Arduino 2
- A – backlight LED +
- K – backlight LED -
Conecte 5V do Arduino à trilha vermelha da protoboard; GND à trilha azul.
- VSS → GND
- VDD → 5V
- V0 → pino central do potenciômetro
- RS → pino 12
- RW → GND
- E → pino 11
- D4 → pino 5
- D5 → pino 4
- D6 → pino 3
- D7 → pino 2
- A → 5V
- K → GND
Outros pinos do potenciômetro → 5V e GND.
Buzzer piezo: se 3 pinos, S → pino 7, - → GND, outro → 5V. Se 2 pinos, um → GND, outro → pino 7.
Botões: primeiro (pulo) → pino 1; segundo (tiro) → pino 6. LEDs controlados apenas pelos botões (ânodo no pino do botão ligado ao Arduino, cátodo no GND).
Código
dollar_warrior (Arduino)
#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
const int buttonPin1 = 1;
const int buttonPin2 = 6;
const int buzzer = 7;
unsigned long pts = 0;
bool buttonState1 = 0;
bool buttonState2 = 0;
int randomNums[6];
int randomNum = 0;
int randomNums1[3];
int randomNum1 = 0;
unsigned int myDelay = 500;
bool temp = 0;
int tempI[16];
bool temp1 = 0;
int tempI1[3];
int button2IsPressed = 0;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
lcd.begin(16, 2);
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(buzzer, OUTPUT);
lcd.setCursor(4, 0);
lcd.print("THE GAME");
lcd.setCursor(2, 1);
lcd.print("STARTS IN ");
lcd.print("5");
delay(1000);
lcd.setCursor(12, 1);
lcd.print("4");
delay(1000);
lcd.setCursor(12, 1);
lcd.print("3");
delay(1000);
lcd.setCursor(12, 1);
lcd.print("2");
delay(1000);
lcd.setCursor(12, 1);
lcd.print("1");
delay(1000);
lcd.clear();
}
void loop() {
here:
randomNum = random(5);
for (int i = 0; i < randomNum; ++i) randomNums[i] = random(16);
randomNum1 = random(3);
for (int i = 0; i < randomNum1; ++i) randomNums1[i] = random(16);
temp = 0;
for (int j = 0; j < 3; ++j) tempI1[j] = 0;
button2IsPressed = 0;
for (int i = 0; i < 16; ++i) {
if (pts > 9 && pts < 20) { lcd.setCursor(14, 0); myDelay = 400; }
else if (pts > 19 && pts < 30) { lcd.setCursor(14, 0); myDelay = 300; }
else if (pts > 29 && pts < 50) { myDelay = 200; lcd.setCursor(14, 0); }
else if (pts >= 50) {
pts = 0; myDelay = 500; lcd.clear();
lcd.setCursor(5, 0); lcd.print("VICTORY");
tone(buzzer, 262); delay(200);
tone(buzzer, 330); delay(200);
tone(buzzer, 392); delay(100);
tone(buzzer, 330); delay(100);
tone(buzzer, 392); delay(100);
tone(buzzer, 523); delay(200);
noTone(buzzer); delay(3000); lcd.clear(); goto here;
}
else lcd.setCursor(15, 0);
lcd.print(pts);
buttonState1 = digitalRead(buttonPin1);
buttonState2 = digitalRead(buttonPin2);
// Obstáculos
if (!temp) {
for (int j = 0; j < randomNum; ++j) {
lcd.setCursor(randomNums[j], 1); lcd.print("#");
}
} else {
for (int j = 0; j < randomNum; ++j) {
if (tempI[0] > randomNums[j]) {
lcd.setCursor(randomNums[j], 1); lcd.print("#");
}
}
}
// Estrelas
if (!temp1) {
for (int j = 0; j < randomNum1; ++j) {
lcd.setCursor(randomNums1[j], 0); lcd.print("*");
}
} else {
for (int j = 0; j < randomNum1; ++j) {
if (randomNums1[j] != tempI1[j]) {
lcd.setCursor(randomNums1[j], 0); lcd.print("*");
}
}
}
// Pulo
if (buttonState1 == HIGH) {
lcd.setCursor(i, 0);
tone(buzzer, 131); delay(200); noTone(buzzer);
} else lcd.setCursor(i, 1);
lcd.print("$");
// Tiro
if (buttonState2 == HIGH) {
tone(buzzer, 175); delay(100); noTone(buzzer);
temp = 1;
if (buttonState1 == LOW) tempI[button2IsPressed] = i;
++button2IsPressed;
for (int k = i + 1; k < 16; ++k) {
if (buttonState1 == LOW) lcd.setCursor(k, 1);
else lcd.setCursor(k, 0);
lcd.print("~"); delay(5);
if (buttonState1 == LOW) lcd.setCursor(k - 1, 1);
else lcd.setCursor(k - 1, 0);
lcd.print(" "); delay(5);
}
}
delay(myDelay);
lcd.clear();
// Coleta estrelas
for (int j = 0; j < randomNum1; ++j) {
if (i == randomNums1[j] && buttonState1 == HIGH) {
temp1 = 1; tempI1[j] = i; pts += 5;
}
}
// Colisão obstáculos
for (int j = 0; j < randomNum; ++j) {
if (i == randomNums[j] && buttonState1 == LOW && temp == 0) {
pts = 0; myDelay = 500; lcd.clear();
lcd.setCursor(6, 0); lcd.print("GAME");
lcd.setCursor(6, 1); lcd.print("OVER");
tone(buzzer, 349); delay(200);
tone(buzzer, 277); delay(200);
tone(buzzer, 220); delay(100);
tone(buzzer, 277); delay(100);
tone(buzzer, 220); delay(200);
noTone(buzzer); delay(3000); lcd.clear(); goto here;
}
else if (i == randomNums[j] && buttonState1 == HIGH) ++pts;
}
}
}
Esquemáticos
Arquivo Fritzing: game_aUIjA6VZxX.fzz
Processo de manufatura
- Xadrez: Das Origens Antigas à Fabricação Moderna — Visão de Especialista
- Pinball: História, Design e Fabricação de um Clássico dos Fliperamas
- A Evolução e Artesanato do Futebol Americano: De Jogos Antigos aos Padrões Modernos da NFL
- Construa um Jogo em Tempo Real com Giroscópio: Arduino Nano + Sensor MPU-6050
- Construa Seu Próprio Jogo de Roleta com 37 LEDs e Arduino Nano
- Relógio 3D RGB Arduclock – Bluetooth, LEDs Endereçáveis e RTC
- Monitor de Saúde de Rios: Sistema de Qualidade da Água Baseado em Arduino
- Jogo Interativo com Joystick e Arduino – Feedback com LEDs
- Find Me: Localizador Inteligente de Objetos com Arduino e Bluetooth
- Osciloscópio DIY com Arduino Nano (10 Hz–50 kHz) e LCD 128×64