LED-Matrix - Joystick-Spiel

Lese­zeit: 8 Minu­ten
Navi­ga­ti­on

Auf einer LED-Matrix wird eine wähl­ba­re Anzahl von leuch­ten­den LEDs zufäl­lig auf der LED-Matrix ver­teilt.
Ein Joy­stick bewegt eine leuch­ten­de LED über das "Spiel­feld", und "löscht" alle LEDs, die sich auf der jewei­li­gen Posi­ti­on befinden.

So sieht es aus (um den Film kurz zu hal­ten, wur­den nur fünf LEDs für den Par­cours verwendet):

Der Joy­stick besteht aus zwei Poten­tio­me­tern, jeweils einer für die X-Achse und einer für die Y-Achse. Bei­de lesen bei den Bewe­gun­gen die Span­nung und lie­fern dem Ardui­no jeweils einen ana­lo­gen Wert, der zwi­schen 0 und 1023 liegt.Der Joy­stick besteht aus zwei Poten­tio­me­tern, jeweils einer für die X-Achse und einer für die Y-Achse. Bei­de lesen bei den Bewe­gun­gen die Span­nung und lie­fern dem Ardui­no jeweils einen ana­lo­gen Wert, der zwi­schen 0 und 1023 liegt.

Die Wer­te kön­nen je nach Joy­stick leicht nach oben oder unten abwei­chen.
Die Beschrif­tung und die Rei­hen­fol­ge der Pins kön­nen sich je nach Joy­stick unterscheiden.

Ach­seBezeich­nungAnschluss
X-AchseVRx/VERA0
Y-AchseVRy/HORA1
But­tonSW/SEL7

Die ein­zel­nen LEDs der LED-Matrix wer­den in Rei­hen und Spal­ten ange­spro­chen.
Die Schreib­wei­se für jede Rei­he kann binär ange­ge­ben wer­den: 0 = aus, 1 = an. Den Wer­ten wird ein "B" vor­an­ge­stellt.
Die LED-Matrix wur­de in das Steck­brett ein­ge­setzt, daher ver­lau­fen die Rei­hen ver­ti­kal und die Spal­ten horizontal.

Bei­spiel:

void PfeilUnten()
{
  // Array für die 8 Reihen 
  byte Zeichen[8] = 
  {
    B00010000,  // 1. Reihe
    B00110000,  // 2. Reihe
    B01111111,  // 3. Reihe
    B11111111,  // 4. Reihe
    B01111111,  // 5. Reihe
    B00110000,  // 6. Reihe
    B00010000,  // 7. Reihe
    B00000000   // 8. Reihe
  };

  // Matrix anzeigen
  for (int i = 0; i < 8; i ++)   
  { 
    LEDMatrix.setRow(0, i, Zeichen[i]);   
  }
} 

Array

Schlie­ße die LED-Matrix an.

Pin­be­le­gung LED-Matrix

Benö­tig­te Bauteile:

  • LED-Matrix
  • Joy­stick
  • Lei­tungs­dräh­te

Baue die Schal­tung auf.
(Fah­re mit der Maus über das Bild, um die Bezeich­nun­gen der Bau­tei­le zu sehen)

Als Ers­tes musst du Biblio­the­ken installieren:

Sketch → Biblio­thek ein­bin­den → Biblio­the­ken verwalten

Jedem Befehl muss der Name der Matrix mit abschlie­ßen­dem . vor­an­ge­stellt werden.

Metho­den der Biblio­thek LEDControl

Metho­de Funktion/Beispiele
Led­Con­trol Name_der_Matrix(Data-In, CLK, CS, AnzahlMatrix)LED-Matrix initia­li­sie­ren:
Led­Con­trol LED­Ma­trix = LedControl(12, 11, 10, 1); 
shutDown(NummerMatrix, true/false)Matrix auf­we­cken:
shutDown(0, false);
setIntensity(NummerMatrix, Hel­lig­keit)Hel­lig­keit set­zen (0−20)
setIntensity(0, 8);
clearDisplay(NummerMatrix)clearDisplay(0);
setLed(NummerMatrix, Zei­le, Spal­te, true/false);ein­zel­ne LED schalten
setLed(0, 0, 0, true);
setRow(NummerMatrix, Zei­le, Byte)zei­len­wei­se ein Byte schreiben:
setRow(0, Zei­le, B10000000);
setRow kann Wer­te zwi­schen 0 und 7 haben

Wenn die LED-Matrix in das Steck­brett gesetzt wird, ver­lau­fen die Rei­hen vertikal.
setColumn(NummerMatrix, Spal­te, Byte)spal­ten­wei­se ein Byte schreiben:
setColumn(0, Spal­te, B10000000);
set­Co­lumn kann Wer­te zwi­schen 0 und 7 haben

Wenn die LED-Matrix in das Steck­brett gesetzt wird, ver­lau­fen die Spal­ten horizontal.

Im Kopf des Pro­gramms musst du die benö­tig­te Biblio­the­ken ein­bin­den und die Pin­be­le­gung der LED-Matrix festlegen.

# 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 12 -> DATA IN-pin
   Pin 11 -> CLK-pin
   Pin 10 -> CS-pin
*/
LedControl LEDMatrix = LedControl(12, 11, 10, 1);

Im setup-Teil wird die LED-Matrix gestar­tet und der pin­Mo­de des Tas­ter und des Laut­spre­chers festgelegt.

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();
}

Erstel­le Metho­den für den „Bau“ des Par­cours und für die Dar­stel­lung des Pfeils:

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] = 
  {
     B00010000, // 1. Reihe
     B00110000, // 2. Reihe
     B01111111, // 3. Reihe
     B11111111, // 4. Reihe
     B01111111, // 5. Reihe
     B00110000, // 6. Reihe
     B00010000, // 7. Reihe
     B00000000  // 8. Reihe
  };
  // Matrix anzeigen
  for (int i = 0; i < 8; i ++)   
  { 
    LEDMatrix.setRow(0, i, Zeichen[i]);   
  }
}

Der loop-Teil. Beach­te die Kommentare.

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);
  }
}


Ver­wand­te Aufgaben:


Letzte Aktualisierung: 23. Dez 2020 @ 23:03