LED-Whack-a-Mole-Spiel mit Arduino Uno – Interaktives Joystick-Projekt
Komponenten und Materialien
| Komponente | Anzahl |
|---|---|
| Arduino UNO | 1 |
| LEDs (verschiedene Farben) | 7 |
| Widerstand 220 Ω | 7 |
| Analoger Joystick (5-polig: GND, VCC, VRx, VRy, SW) | 1 |
| Jumper-Kabel (m/m) | 8 |
| Jumper-Kabel (m/w) | 4 |
Projektbeschreibung
Dies war mein erstes Arduino-Projekt – ein „Whack-a-Mole“-Spiel (Mole-Schlagen) mit 7 LEDs und einem analogen Joystick. Vier LEDs (Position 2–5 von links) stellen die „Mulls“ dar. Eine zufällige LED leuchtet auf, und der Spieler muss innerhalb einer vorgegebenen Zeit die entsprechende Joystick-Richtung drücken.
LED-Belegung (von links nach rechts)
- Rot – Falsche Eingabe (Fehler-Anzeige)
- Mole 1 – Links (Joystick Links)
- Mole 2 – Oben (Joystick Oben)
- Mole 3 – Unten (Joystick Unten)
- Mole 4 – Rechts (Joystick Rechts)
- Grün – Richtige Eingabe (Erfolgs-Anzeige)
- Gelb – Highscore-Anzeige (blinkt zählend)
Joystick-Auswertung
Der analoge Joystick liefert Werte 0–1023 (bzw. 1024) pro Achse. Die Auswertung erfolgt über switch-Statements auf die Maximalwerte:
- X-Achse: 0 = Links (Code 1), 1023 = Rechts (Code 2)
- Y-Achse: 0 = Oben (Code 3), 1023 = Unten (Code 4)
Hinweis: Falls Ihr Joystick andere Endwerte liefert, messen Sie diese über den Serial Monitor und passen Sie die case-Werte an.
Schwierigkeitsgrade
Die Reaktionszeit wird über Konstanten definiert (in Millisekunden):
easy= 1000 msmedium= 500 mshard= 325 msstupid= 250 ms (im Code aktiv)
Ändern Sie die Konstante im Code, um die Schwierigkeit anzupassen.
Schaltplan & Verdrahtung
Der Joystick hat 5 Pins (oben nach unten: GND, +5V, VRx, VRy, SW). Verwendet werden GND, +5V, VRx (→ A0), VRy (→ A1). Die 7 LEDs werden über 220 Ω Vorwiderstände an die Pins 2–8 angeschlossen (Pin-Reihenfolge im Code: {5,2,4,3,6,7,8}).
Vollständiger Programmcode
// Whack-a-LED – Joystick Whack-a-Mole Spiel
// Joystick-Pins
int sX = A0; // X-Achse
int sY = A1; // Y-Achse
int sSX, sSY; // Rohwerte
int sS; // Konvertierter Status (1=Links, 2=Rechts, 3=Oben, 4=Unten)
// Spielvariablen
int rNum; // Zufällige Mole-Position (0-3)
int wins = 0; // Aktuelle Serie
int highScore = 0; // Highscore
// Schwierigkeit (Reaktionszeit in ms)
const int easy = 1000;
const int medium = 500;
const int hard = 325;
const int stupid = 250;
// LED-Pins (Index 0-6 entspricht LED 1-7)
int ledPins[] = {5, 2, 4, 3, 6, 7, 8};
int pinCount = 7;
void setup() {
Serial.begin(9600);
pinMode(sX, INPUT);
pinMode(sY, INPUT);
for (int i = 0; i < pinCount; i++) {
pinMode(ledPins[i], OUTPUT);
}
randomSeed(analogRead(A2)); // Bessere Zufälligkeit
}
void loop() {
rNum = random(4); // 0-3 für die 4 Moles
delay(1000); // Kurze Pause vor neuer Runde
digitalWrite(ledPins[rNum + 1], HIGH); // Mole-LED an (Index 1-4)
delay(stupid); // Reaktionszeit (Schwierigkeit)
// Joystick einlesen
sSX = analogRead(sX);
delay(100); // Kurze Entprell-Pause
sSY = analogRead(sY);
// Umwandlung in Richtungscode
sS = 0;
switch (sSX) {
case 0: sS = 1; break; // Links
case 1023: sS = 2; break; // Rechts
}
switch (sSY) {
case 0: sS = 3; break; // Oben
case 1023: sS = 4; break; // Unten
}
digitalWrite(ledPins[rNum + 1], LOW); // Mole-LED aus
// Auswertung
if (sS - 1 == rNum) { // Korrekt? (sS 1-4 vs rNum 0-3)
wins++;
// Grün 4× blinken
for (int k = 0; k <= 3; k++) {
digitalWrite(ledPins[5], HIGH); // Index 5 = Grün
delay(50);
digitalWrite(ledPins[5], LOW);
delay(50);
}
} else {
// Falsch – Highscore prüfen
if (wins > highScore) {
highScore = wins;
}
wins = 0;
// Rot 4× blinken
for (int i = 0; i <= 3; i++) {
digitalWrite(ledPins[4], HIGH); // Index 4 = Rot
delay(50);
digitalWrite(ledPins[4], LOW);
delay(50);
}
// Highscore auf Gelb anzeigen (anzahl Blinks = Highscore)
for (int w = 0; w < highScore; w++) {
digitalWrite(ledPins[6], HIGH); // Index 6 = Gelb
delay(200);
digitalWrite(ledPins[6], LOW);
delay(200);
}
}
}
Verbesserungsideen
- Schwierigkeitsauswahl beim Start per Joystick/Taster
- Piezo-Summer für akustisches Feedback
- Bessere Entprellung der Joystick-Eingaben
- EEPROM-Speicherung des Highscores
- Mehrere Spielmodi (Zeitlimit, Rundenanzahl)
Fazit
Ein einfaches, aber lehrreiches Einsteigerprojekt, das Zufallszahlen, analoge Eingaben, Timing und State-Management vermittelt. Der Code ist bewusst einfach gehalten und leicht erweiterbar.
Herstellungsprozess
- Gaslaternen: Entwicklung, Design und moderne Fertigung
- Laserpointer: Design, Fertigung und Sicherheitsübersicht
- Taschenlampe: Von der Erfindung zur modernen Innovation
- Das Kaleidoskop: Von Brewsters Wissenschaft zum modernen Design
- Halbleiterlaser: Präzise Lichtgenerierung für moderne Technologie
- Die Kunst und Wissenschaft fotografischer Prozesse: Von Daguerreotypien zum modernen Film
- Verkehrsampeln: Technik, Geschichte und zukünftige Innovationen
- Leuchtdioden (LED): Von der Entdeckung zur 100-Jahre-Lebensdauer
- LED-Streifen-Zubehör meistern: Verbinden, Steuern und Anpassen Ihrer Beleuchtung
- Armaturenbrett-Symbole verstehen: Warnleuchten, Farben & Bedeutung