
Ziel des Projekts
Auf einer LED-Matrix wird eine wählbare Anzahl von leuchtenden LEDs zufällig auf der LED-Matrix verteilt.
Ein Joystick bewegt eine leuchtende LED über das “Spielfeld”, und “löscht” alle LEDs, die sich auf der jeweiligen Position befinden.
So sieht es aus (um den Film kurz zu halten, wurden nur fünf LEDs für den Parcours verwendet):
Benötigte Bauteile
- ⇒LED-Matrix
- Joystick
- Leitungsdrähte

Der Joystick besteht aus zwei Potentiometern, jeweils einer für die X-Achse und einer für die Y-Achse. Beide lesen bei den Bewegungen die Spannung und liefern dem Arduino jeweils einen analogen Wert, der zwischen 0 und 1023 liegt.Der Joystick besteht aus zwei Potentiometern, jeweils einer für die X-Achse und einer für die Y-Achse. Beide lesen bei den Bewegungen die Spannung und liefern dem Arduino jeweils einen analogen Wert, der zwischen 0 und 1023 liegt.
Die Beschriftung und die Reihenfolge der Pins können sich je nach Joystick unterscheiden.
| Achse | Bezeichnung | Anschluss |
|---|---|---|
| X-Achse | VRx/VER | A0 |
| Y-Achse | VRy/HOR | A1 |
| Button | SW/SEL | 7 |
Das Programm
Die einzelnen LEDs der LED-Matrix werden in Reihen und Spalten angesprochen.
Die Schreibweise für jede Reihe kann binär angegeben werden: 0 = aus, 1 = an. Den Werten wird ein “B” vorangestellt.
Die LED-Matrix wurde in das Steckbrett eingesetzt, daher verlaufen die Reihen vertikal und die Spalten horizontal.

Beispiel:

|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
void PfeilUnten() { // Array für die 8 Reihen byte Zeichen[8] = { 0b00010000, // 1. Reihe 0b00110000, // 2. Reihe 0b01111111, // 3. Reihe 0b11111111, // 4. Reihe 0b01111111, // 5. Reihe 0b00110000, // 6. Reihe 0b00010000, // 7. Reihe 0b00000000 // 8. Reihe }; // Matrix anzeigen for (int i = 0; i < 8; i++) { LEDMatrix.setRow(0, i, Zeichen[i]); } } |
Der Schaltplan
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Benötigte Bibliotheken
![]() | ![]() |
Funktionen der Bibliothek LEDControl
| Schlüsselwort | Aktion |
|---|---|
| LedControl Name_der_Matrix(Data-In, CLK, CS, AnzahlMatrix) | LED-Matrix initialisieren: LedControl LEDMatrix = LedControl(12, 11, 10, 1); |
| shutDown(NummerMatrix, true/false) | Matrix aufwecken: shutDown(0, false); |
| setIntensity(NummerMatrix, Helligkeit) | Helligkeit setzen (0-20) setIntensity(0, 8); |
| clearDisplay(NummerMatrix) | clearDisplay(0); |
| setLed(NummerMatrix, Zeile, Spalte, true/false); | einzelne LED schalten setLed(0, 0, 0, true); |
| setRow(NummerMatrix, Zeile, Byte) | zeilenweise ein Byte schreiben: setRow(0, Zeile, 0b10000000); setRow kann Werte zwischen 0 und 7 haben ![]() Wenn die LED-Matrix in das Steckbrett gesetzt wird, verlaufen die Reihen vertikal. |
| setColumn(NummerMatrix, Spalte, Byte) | spaltenweise ein Byte schreiben: setColumn(0, Spalte, 0b10000000); setColumn kann Werte zwischen 0 und 7 haben ![]() Wenn die LED-Matrix in das Steckbrett gesetzt wird, verlaufen die Spalten horizontal. |
Das Programm
Im Kopf des Programms musst du die benötigte Bibliotheken einbinden und die Pinbelegung der LED-Matrix festlegen.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#include "LedControl.h" #include "Bounce2.h" // Joystick-Button zuordnen Bounce ZeitStoppen = Bounce(); // Joystick analoge Pins int XAchse = A0; int YAchse = A1; // Joystick Knopf int JoystickButton = 7; // Variablen für die Auswertung der Bewegung des Joysticks int PositionX; int PositionY; // Startposition der LED int Reihe = 4; int Spalte = 4; // Anzahl zufälliger LEDs int AnzahlLED = 5; // Variablen der Zeit float StartZeit; float VerstricheneZeit; float Sekunden; // Variable für den Neustart bool Start = false; /* VCC -> 5V GND Pin 11 -> DIN (COPI) Pin 13 -> CLK-pin Pin 10 -> CS-pin */ // Pins Arduino DIN, CLK, CS, Anzahl Displays LedControl LEDMatrix = LedControl(11, 13, 10, 1); |
Im setup-Teil wird die LED-Matrix gestartet und der pinMode des Taster und des Lautsprechers festgelegt.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
void setup() { Serial.begin(9600); ZeitStoppen.attach(JoystickButton); // Zufallsgenerator starten randomSeed(analogRead(5)); // Matrix "aufwecken" LEDMatrix.shutdown(0, false); // mittlere Helligkeit setzen LEDMatrix.setIntensity(0, 2); PfeilUnten(); pinMode(JoystickButton, INPUT_PULLUP); // Start-LED setzen LEDMatrix.setLed(0, Reihe, Spalte, true); // Zeit starten StartZeit = millis(); } |
Erstelle Funktionen für den „Bau“ des Parcours und für die Darstellung des Pfeils:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
void ParcoursBauen() { LEDMatrix.clearDisplay(0); int Minimum = 0; int Maximum = 7; for (int i = 0; i < AnzahlLED; i++) { int Spalte = random(Minimum, Maximum); int Zeile = random(Minimum, Maximum); LEDMatrix.setLed(0, Spalte, Zeile, true); } } void PfeilUnten() { byte Zeichen[8] = { 0b00010000, // 1. Reihe 0b00110000, // 2. Reihe 0b01111111, // 3. Reihe 0b11111111, // 4. Reihe 0b01111111, // 5. Reihe 0b00110000, // 6. Reihe 0b00010000, // 7. Reihe 0b00000000 // 8. Reihe }; // Matrix anzeigen for (int i = 0; i < 8; i++) { LEDMatrix.setRow(0, i, Zeichen[i]); } } |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
void loop() { // Start if (Start) { ParcoursBauen(); Start = false; StartZeit = millis(); int Reihe = 4; int Spalte = 4; LEDMatrix.setLed(0, Reihe, Spalte, true); } // Joystick-Button lesen if (ZeitStoppen.update()) { if (ZeitStoppen.read() == LOW) { Start = true; // Zeit berechnen float Sekunden; VerstricheneZeit = millis() - StartZeit; Sekunden = VerstricheneZeit / 1000; String GesamtSekunden = String(Sekunden); // . durch , ersetzen GesamtSekunden.replace(".", ","); // Ausgabe im Seriellen Monitor Serial.println("Sekunden insgesamt: " + GesamtSekunden + " Sekunden"); // Minuten berechnen int Minute = int(Sekunden) / 60; // nur Ausgabe der Minuten wenn Minute > 0 if (Minute > 0) { // Ausgabe verschönern, wenn Minute > 1 -> Ausgabe "Minuten" // "Minute" if (Minute > 1) { Serial.print(String(Minute) + " Minuten "); } else { Serial.print(String(Minute) + " Minute "); } } // von Sekunden Anzahl der Minuten abziehen Sekunden = Sekunden - Minute * 60; // Sekunden in String umwandeln damit . durch , ersetzt werden kann String AnzahlSekunden = String(Sekunden); // . durch , ersetzen AnzahlSekunden.replace(".", ","); Serial.println(AnzahlSekunden + " Sekunden"); } } // Bewegung der X-Achse lesen PositionX = analogRead(XAchse); // Bewegung X-Achse nach oben if (PositionX > 600) { // zu schnelles "Springen" verhindern delay(200); LEDMatrix.setLed(0, Reihe, Spalte, false); if (Spalte > 0) Spalte--; LEDMatrix.setLed(0, Reihe, Spalte, true); } // Bewegung X-Achse nach unten if (PositionX < 300) { delay(200); LEDMatrix.setLed(0, Reihe, Spalte, false); if (Spalte < 7) Spalte++; LEDMatrix.setLed(0, Reihe, Spalte, true); } // Bewegung der Y-Achse lesen PositionY = analogRead(YAchse); // Bewegung Y-Achse nach rechts if (PositionY > 600) { delay(200); LEDMatrix.setLed(0, Reihe, Spalte, false); if (Reihe > 0) Reihe--; LEDMatrix.setLed(0, Reihe, Spalte, true); } // Bewegung Y-Achse nach links if (PositionY < 300) { delay(200); LEDMatrix.setLed(0, Reihe, Spalte, false); if (Reihe < 7) Reihe++; LEDMatrix.setLed(0, Reihe, Spalte, true); } } |
Ähnliche Projekte
- Analoge Uhr mit BME280 auf ESP32 mit 3,5 Zoll/4 Zoll TFT
- Analoge Uhr mit TFT 240×240 Pixeln und RTC-Modul
- Analoge Uhr mit TFT-Shield und BME280
- Grafische Temperaturanzeige mit der Bibliothek TFT_eSPI
- BME280 – Messdaten anzeigen
- Countdown mit einer einstelligen 7-Segment-Anzeige
- Countdown mit einem OLED-Display
- Datum und Zeit mit ESP und time.h anzeigen
- Datum und Zeit mit dem NTP-Protokoll und einem Arduino WiFi anzeigen
- DHT11/DHT22 – Durchschnittstemperatur berechnen und auf einem OLED-Display anzeigen
Letzte Aktualisierung:




