Créez un jeu LCD « Ninja Dollar » avec Arduino UNO
Composants et fournitures
| Arduino UNO | 1 |
| Écran LCD 16×2 (blanc sur bleu, ex. Adafruit) | 1 |
| Plaque d'essai (breadboard) | 2 (ou 1 grande) |
| Potentiomètre 10 kΩ (réglage contraste) | 1 |
| LED (générique) | 2 |
| Résistance 1 kΩ | 4 |
| Bouton poussoir 12 mm | 2 |
| Buzzer piézo (passif) | 1 |
| Fils de connexion | 1 jeu |
Outils nécessaires
- Fer à souder (pour souder les broches du LCD)
À propos de ce projet
Ce jeu LCD simple s'inspire du jeu du dinosaure de Google Chrome, avec des ajouts : le guerrier « $ » avance en permanence, peut sauter par-dessus les obstacles (#), attraper des étoiles (*) pour 5 points, et tirer (~) pour détruire les obstacles. Des LED indiquent l'action (saut/tir). Un buzzer émet des sons pour chaque action et des mélodies pour victoire/défaite. La vitesse augmente tous les 10 points. À 50 points, vous gagnez. Toucher un obstacle = game over. Tous les paramètres sont modifiables dans le code.
Connexions
Le module LCD a un connecteur mâle 16 broches. Insérez-le sur la breadboard. Broches (de gauche à droite) :
- GND – masse
- VCC – alimentation +5V
- V0 – réglage contraste (vers potentiomètre)
- RS – sélection registre (pin Arduino 12)
- R/W – lecture/écriture (vers GND)
- E – enable (pin Arduino 11)
- D0-D3 – non utilisés (mode 4 bits)
- D4 – pin Arduino 5
- D5 – pin Arduino 4
- D6 – pin Arduino 3
- D7 – pin Arduino 2
- A – rétroéclairage + (vers 5V)
- K – rétroéclairage – (vers GND)
Reliez 5V et GND de l'Arduino aux rails d'alimentation de la breadboard. Connectez le potentiomètre : broche centrale sur V0 du LCD, les deux autres sur 5V et GND.
Buzzer : Si 3 broches : S sur pin 7, – sur GND, l'autre sur 5V. Si 2 broches : une sur GND, l'autre sur pin 7.
Boutons : Bouton saut (pin 1), bouton tir (pin 6). Les LED sont commandées directement par les boutons (anode sur broche bouton-Arduino, cathode sur GND).
Code
dollar_warrior (Arduino)
#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
const int buttonPin1 = 1; // saut
const int buttonPin2 = 6; // tir
const int buzzer = 7;
unsigned long pts = 0;
bool buttonState1 = 0, buttonState2 = 0;
int randomNums[6], randomNum = 0;
int randomNums1[3], 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 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) {
// Affichage score & vitesse
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) { lcd.setCursor(14, 0); myDelay = 200; }
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);
// Obstacles
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("#");
}
}
}
// Étoiles (points bonus)
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("*");
}
}
}
// Saut
if (buttonState1 == HIGH) {
lcd.setCursor(i, 0);
tone(buzzer, 131); delay(200); noTone(buzzer);
} else {
lcd.setCursor(i, 1);
}
lcd.print("$");
// Tir
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();
// Capture étoile
for (int j = 0; j < randomNum1; ++j) {
if (i == randomNums1[j] && buttonState1 == HIGH) {
temp1 = 1; tempI1[j] = i; pts += 5;
}
}
// Collision obstacle
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; // obstacle franchi
}
}
}
Schémas
Schéma Fritzing disponible dans le projet original (fichier game_aUIjA6VZxX.fzz).
Processus de fabrication
- Les Échecs : Des Origines Anciennes à la Fabrication Moderne — Vue d'Expert
- Flipper : histoire, conception et fabrication d'un jeu d'arcade classique
- L'Évolution et l'Artisanat du Football Américain : Des Jeux Anciens aux Standards Modernes de la NFL
- Construire un jeu gyroscopique temps réel avec Arduino Nano et capteur MPU-6050
- Créer votre propre jeu de roulette à 37 LED avec Arduino Nano
- Horloge 3D RGB Arduclock – Montre LED Bluetooth avec horloge temps réel
- Surveillance de la Qualité de l'Eau : Système Arduino MKR1000 pour Rivières et Lacs
- Jeu interactif joystick + LEDs avec Arduino
- Find Me : Localisateur d'objets intelligent avec Arduino et Bluetooth