Ninja Dollar LCD-Spiel mit Arduino UNO bauen
Komponenten und Zubehör
| Komponente | Menge | Hinweise |
|---|---|---|
| Arduino UNO | 1 | |
| Adafruit Standard LCD 16×2 (Weiß auf Blau) | 1 | |
| Steckbrett (Breadboard) | 2 | Ich nutzte zwei für mehr Platz; eines reicht auch |
| Einstellpotentiometer 10 kΩ (Single Turn) | 1 | für LCD-Kontrast |
| LED (generisch) | 2 | |
| Widerstand 1 kΩ | 4 | |
| SparkFun Taster 12 mm | 2 | Springen & Schießen |
| RobotGeek Summer (Piezo) | 1 | |
| Jumper-Kabel (generisch) | 1 |
Benötigte Werkzeuge
- Lötkolben (generisch) – für LCD-Lötung
Über dieses Projekt
Dies ist ein einfaches LCD-Spiel. Meine Inspiration war das Google-Chrome-Dino-Spiel, aber ich fügte einige Änderungen hinzu. Der Dollar-Krieger bewegt sich ständig und kann springen, um Hindernissen auszuweichen und „Stern“-Punkte zu sammeln. Springt er über ein Hindernis, gibt es 1 Punkt; fängt er den Stern, 5 Punkte. Er kann auch schießen und Hindernisse vor sich entfernen. LEDs zeigen an, ob er springt oder schießt. Alle 10, 20, 30 Punkte wird er schneller. Bei 50 Punkten gewinnt man. Berührt man ein Hindernis, verliert man. Diese Grenzen lassen sich im Code leicht ändern. Ein passiver Summer ertönt beim Springen/Schießen und spielt eine spezielle Melodie bei Gewinn/Verlust. Dies ist mein erstes Projekt hier – ich hoffe, es gefällt Ihnen. Kommentare und Bewertungen sind willkommen!
Das Video
(Video eingebettet im Original)
Verkabelung
Das LCD-Modul hat einen 16-poligen Male-Header auf der Unterseite. Stecken Sie ihn wie im Bild gezeigt in das Steckbrett. Alle elektronischen Signale zur Stromversorgung und Steuerung laufen über diesen Header.
Pin-Belegung (von links nach rechts):
- GND – Masse
- VCC – +5 V
- V0 – Kontrasteinstellung
- RS – Register Select
- R/W – Read/Write Select
- E – Enable
- D0–D3 – Datenbits 0–3 (hier nicht genutzt)
- D4 – Datenbit 4 → Arduino Pin 5
- D5 – Datenbit 5 → Arduino Pin 4
- D6 – Datenbit 6 → Arduino Pin 3
- D7 – Datenbit 7 → Arduino Pin 2
- A – Backlight Anode (+)
- K – Backlight Kathode (−)
Verbinden Sie 5 V des Arduino mit der roten Plus-Schiene oben am Breadboard. Verbinden Sie GND mit der blauen Minus-Schiene.
- VSS → GND
- VDD → 5 V
- V0 → Potentiometer-Mittelabgriff
- RS → Arduino Pin 12
- RW → GND
- E → Arduino Pin 11
- D4 → Pin 5, D5 → Pin 4, D6 → Pin 3, D7 → Pin 2
- A → 5 V, K → GND
Die beiden äußeren Potentiometer-Pins an 5 V und GND anschließen.
Piezo-Summer: 3-polig: S → Pin 7, − → GND, mittlerer Pin → 5 V. 2-polig: ein Pin → GND, anderer → Pin 7.
Taster: Laut Schaltplan. Erster Taster (Springen) → Pin 1, Zweiter (Schießen) → Pin 6. LEDs werden nur von den Tastern gesteuert, nicht vom Arduino. Anode an Taster-Pin (der zum Arduino geht), Kathode an 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;
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) {
// Punkte anzeigen
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);
// Hindernisse zeichnen
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("#");
}
}
}
// Sterne (Punkte) zeichnen
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("*");
}
}
}
// Springen (Button 1)
if (buttonState1 == HIGH) {
lcd.setCursor(i, 0);
tone(buzzer, 131); delay(200); noTone(buzzer);
} else {
lcd.setCursor(i, 1);
}
lcd.print("$");
// Schießen (Button 2)
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();
// Stern eingesammelt?
for (int j = 0; j < randomNum1; ++j) {
if (i == randomNums1[j] && buttonState1 == HIGH) {
temp1 = 1;
tempI1[j] = i;
pts += 5;
}
}
// Kollision mit Hindernis?
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;
}
// Hindernis übersprungen → Punkt
else if (i == randomNums[j] && buttonState1 == HIGH) {
++pts;
}
}
}
}
Schaltpläne
game_aUIjA6VZxX.fzz
Herstellungsprozess
- Schach: Von antiken Ursprüngen zur modernen Fertigung – Ein Expertenüberblick
- Flipper: Geschichte, Design und Fertigung eines klassischen Arcade-Spiels
- Die Evolution und Handwerkskunst des American Football: Von antiken Spielen zu modernen NFL-Standards
- Echtzeit-Gyroskop-Spiel mit Arduino Nano & MPU-6050
- 37-LED-Roulette-Spiel mit Arduino Nano bauen – Europäisches Layout
- 3D RGB Arduclock – Bluetooth-LED-Uhr mit Echtzeituhr
- River Health Monitor: Arduino-basiertes Wasserqualitäts-Messsystem
- Interaktives Joystick-Spiel mit Arduino & LED-Feedback
- Find Me: Smarter Gegenstands-Finder mit Arduino und Bluetooth
- DIY-Oszilloskop mit Arduino Nano (10 Hz–50 kHz) und 128×64-LCD