Heißer-Draht-Spiel – Arduino UNO R3

PlatformIO-Projekt zur Auswertung eines "Heißer Draht"-Spiels mit 32x8-LED-Matrix (MAX7219, 4 Module).

Verdrahtung

Funktion Arduino-Pin Hinweis
MAX7219 DIN D11 (MOSI) Hardware-SPI
MAX7219 CLK D13 (SCK) Hardware-SPI
MAX7219 CS/LOAD D10
MAX7219 VCC/GND 5V / GND bei 8 Modulen ausreichend dimensionierte 5V-Versorgung vorsehen
Heißer-Draht-Kontakt D2 gegen GND, INPUT_PULLUP
Buzzer (passiv) D3 anderes Bein an GND
Reset-Button D4 gegen GND, INPUT_PULLUP
Startkontakt D5 gegen GND, INPUT_PULLUP
Endkontakt D6 gegen GND, INPUT_PULLUP

Der heiße Draht wird per Software entprellt: Nach einem gezählten Fehler muss der Kontakt mindestens WIRE_RELEASE_MILLISECONDS Sekunden durchgehend frei sein, bevor eine neue Berührung gezählt wird. Der Wert ist in include/Config.h konfigurierbar und steht standardmäßig auf 300 Millisekunden.

Build & Upload (PlatformIO)

pio run
pio run -t upload

Spielablauf

  1. Reset-Button drücken und loslassen → Spiel ist "scharf" (Timer=0, Fehler=0).
  2. Wer zuerst berührt wird – Start- oder Endkontakt – bestimmt automatisch die Laufrichtung; die Gegenseite wird zum Ziel. Der Timer startet.
  3. Berührt der Spieler den Draht, zählt das einen Fehler (auch bei Dauerkontakt nur 1x). Eine neue Berührung wird erst gezählt, wenn der Draht mindestens WIRE_RELEASE_SECONDS Sekunden durchgehend frei war. Es ertönt ein kurzer Piepton (150 ms) und eine konfigurierbare Strafzeit (PENALTY_SECONDS_PER_ERROR in include/Config.h, Standard 5s) wird zur Anzeige addiert.
  4. Erreichen des Zielkontakts stoppt den Timer, Endzeit und Fehleranzahl bleiben stehen.
  5. Reset drücken und loslassen setzt das Spiel zurück auf Schritt 1.

Anzeige

  • Spalten 0-7: eine LED je Fehler, von oben nach unten, danach beginnt eine neue Spalte.
  • Spalten 8-11: leer.
  • Spalten 12-28: Spielzeit im Format MM:SS.
  • Spalte 29: leer.
  • Spalten 30-31: Heartbeat oben; blinkende Anzeige für ein aktives Spiel unten.

Testcheckliste

  • Reset loslassen → Anzeige zeigt 00:00, keine Fehler-LEDs
  • Start- oder Endkontakt zuerst berühren → Timer läuft, Richtung korrekt erkannt (jeweils andere Seite beendet das Spiel)
  • Draht kurz berühren → genau 1 Fehler-LED an, 1 Piepton, Zeit springt um Strafsekunde(n)
  • Draht dauerhaft halten → weiterhin nur 1 Fehler, kein Dauerton
  • Draht kurz loslassen und vor Ablauf von 1 Sekunde erneut berühren → weiterhin nur 1 Fehler
  • Draht mindestens 1 Sekunde loslassen und erneut berühren → zweiter Fehler wird gezählt
  • Zielkontakt berühren → Timer stoppt, Endstand bleibt stehen
  • Reset drücken und loslassen → alles zurückgesetzt
  • Seriellen Monitor mit 9600 Baud öffnen → Reset, Start, Fehler und Zielkontakt erscheinen als Statusereignisse inklusive Fehlercounter

Bekannte Anpassungspunkte

  • MATRIX_HARDWARE_TYPE in include/Config.h: je nach MAX7219-Modulcharge kann die Anzeige gedreht/gespiegelt sein – dann FC16_HW/GENERIC_HW/PAROLA_HW durchprobieren.
  • Buzzer wird als passiv angenommen (tone()). Bei einem aktiven Buzzer müsste die Ansteuerung in main.cpp durch ein einfaches digitalWrite mit eigenem Timing ersetzt werden.
S
Description
Repository für die heiße Draht Wolke
Readme
36 KiB
Languages
C++ 100%