Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

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)

  1. Rot – Falsche Eingabe (Fehler-Anzeige)
  2. Mole 1 – Links (Joystick Links)
  3. Mole 2 – Oben (Joystick Oben)
  4. Mole 3 – Unten (Joystick Unten)
  5. Mole 4 – Rechts (Joystick Rechts)
  6. Grün – Richtige Eingabe (Erfolgs-Anzeige)
  7. 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:

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 ms
  • medium = 500 ms
  • hard = 325 ms
  • stupid = 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

  1. Gaslaternen: Entwicklung, Design und moderne Fertigung
  2. Laserpointer: Design, Fertigung und Sicherheitsübersicht
  3. Taschenlampe: Von der Erfindung zur modernen Innovation
  4. Das Kaleidoskop: Von Brewsters Wissenschaft zum modernen Design
  5. Halbleiterlaser: Präzise Lichtgenerierung für moderne Technologie
  6. Die Kunst und Wissenschaft fotografischer Prozesse: Von Daguerreotypien zum modernen Film
  7. Verkehrsampeln: Technik, Geschichte und zukünftige Innovationen
  8. Leuchtdioden (LED): Von der Entdeckung zur 100-Jahre-Lebensdauer
  9. LED-Streifen-Zubehör meistern: Verbinden, Steuern und Anpassen Ihrer Beleuchtung
  10. Armaturenbrett-Symbole verstehen: Warnleuchten, Farben & Bedeutung