zur Navigation springen


ESP Projekt: LED-Matrix (Code Grundlagen)

ESP8266

erstellt 06.2020

Programmierung (Grundlagen)


Bei der Ansteuerung ca. 300 TT-Bälle ist es nötig sich ein passendes Concept zu erarbeiten.
Ich werde mich zunächst mit dem Teststück mit 61 TT-Bälle beschäftigen.

Schauen wir uns erstmal die Ansteuerungsnummern der einzelnen LED's an, die sich aus der Verdrahtung ergeben.
Schaubild: die verschidenen Farben sind die Streifen, die Nummern sind zur Ansteuerungsnummern
ansteuerungsnr_k.jpg

Für das Testen der LED's wurden die LED's nach einander nach den Nummern aufsteigend angesteuert, das hilft uns aber nicht recht weiter bei der gezielten Programmierung, wie Farbwechsel von der Seite (links nach rechts) oder Zentrisch nach Innen verlaufend.
Laufschriften, oder einfache Zeichen auf die größere Matrix auszugeben.

Schauen wir uns die kleineren Probleme an.


Farbverlauf

Schauen wir uns den Farbverlauf von rechts nach links mal an. Wenn wir die LED-Nummern anschauen die von links nach rechts laufen, erkenne ich kein eindeutiges Muster, welches leicht berechnet werden kann. Also bedienen wir uns einer Matrix die von links nach rechts eingetragen werden kann.
Spalte 0 = LED 1
Spalte 1 = LED 0, 2
Spalte 2 = LED 4, 6, 8

Jetzt können wir mit zwei Schleifen einen Farbverlauf erstellen
Schleife Spalte {
  Schleife LED’s {
    LED Farben berechnen und setzen
  }
  LED’s anzeigen
  Warten
}

Das schaut dann so aus.
short LEDMatrixL [17] [5] = {     // LED-Matrix von links
  { 1,-1,-1,-1,-1},
  { 0, 2,-1,-1,-1},
  { 4, 6, 8,-1,-1},
  { 3, 5, 7, 9,-1},
  {10,12,14,16,18},
  {11,13,15,17,-1},
  {19,21,23,25,27},
  {20,22,24,26,-1},
  {28,30,32,34,36},
  {29,31,33,35,-1},
  {37,39,41,43,45},
  {38,40,42,44,-1},
  {46,48,50,52,54},
  {47,49,51,53,-1},
  {55,57,59,-1,-1},
  {56,58,-1,-1,-1},
  {60,-1,-1,-1,-1}
}; 
Was sind die -1?
würde ich keinen Eintrag, währe es 0 (also die LED 0)
ich könnte auch eine LED eintragen die schon in der Spalte steht.

  for(int i = 0; i < 17; i++){    // Spalte
    for(int j = 0; j < 5; j++){   // LED's
      LEDs[LEDMatrixL[i][j]] =  CRGB(34-(i*2),0,i*2);  // Rot, Grün, Blau
    }
    FastLED.show();
    delay(200);
  }	
Die anderen Farbverläufe sind genauso.


Farbverlauf verschieben

Schauen wir uns ans mal die Verschiebung nach links an, mit dem Hintergrund. Ziel sollte es sein das wenn das letzte LED die volle Farbe erreicht hat, wieder ein neue Farbkombination langsam aufsteigend bekommt und den gezeichneten Hintergrund nach links verschiebt.
Dabei bietet sich das erlernte an und verwenden eine Matrix.
Nachteil: Unflexibel und rein statisch zu verwenden.
Berechnen wir dieses Vorhaben und schauen uns erst mal die vereinfachte Matrix an.
verschiebung-HG.jpg
Hast Du die Tabelle schon verinnerlicht (oder nur verstanden, worum es geht).
Beim Start bei Verschiebung „0“ beginnt der Wert 5 und zählt immer mit ein 1 Schritten auf 0.
Bei der Verschiebung „1“ beginnt das Ganze mit 4 bis auf 0 und steigt wieder auf 1.
Der Umschlag ist bei 0 oder anders gesagt der Endwert.
Jetzt schauen wir uns den zweiten Wert an der Beginnt bei 0 Endet bei 5. Der Startwert ist kleiner als der Endwert.
Es gibt auch einen Umschlag beim Endwert.

#include 
#include 

#define DATA_PIN 1                // Datenpin an dem der Strip hängt
#define NUM_LEDS 61               // Anzahl der LED's
CRGB LEDs[NUM_LEDS];              // Das LED-Array
short LEDMatrixL [17] [5] = {     // LED-Matrix von links
  { 1,-1,-1,-1,-1},
  { 0, 2,-1,-1,-1},
  { 4, 6, 8,-1,-1},
  { 3, 5, 7, 9,-1},
  {10,12,14,16,18},
  {11,13,15,17,-1},
  {19,21,23,25,27},
  {20,22,24,26,-1},
  {28,30,32,34,36},
  {29,31,33,35,-1},
  {37,39,41,43,45},
  {38,40,42,44,-1},
  {46,48,50,52,54},
  {47,49,51,53,-1},
  {55,57,59,-1,-1},
  {56,58,-1,-1,-1},
  {60,-1,-1,-1,-1}
};
#define Spalten 17                // Spalten Anzahl

void setup() {
  Serial.begin(115200);
  Serial.println("Start");
  FastLED. addLeds  (LEDs, NUM_LEDS);   // FastLED die Definitionen mitteilen
}

// Hintergrund Farbe setzen und anzeigen
void HG_Farbe ( short R, short G, short B ) {
  for(int i = 0; i < NUM_LEDS; i++) {
    LEDs[i] = CRGB(R,G,B);
  }
  FastLED.show();
}

// Hintergrund von links nach rechts einmal ausgeben
void HG_LR (short Rstart, short Rende, short Gstart, short Gende, short Bstart, short Bende ) {
  short Rot = Rstart;
  short Gruen = Gstart;
  short Blau = Bstart;
  boolean Rb = false;
  boolean Gb = false;
  boolean Bb = false;
  
  if (Rstart > Rende) Rb = true;                       // Startwert hoch oder runter zählen
  if (Gstart > Gende) Gb = true;                       // Startwert hoch oder runter zählen
  if (Bstart > Bende) Bb = true;                       // Startwert hoch oder runter zählen

  for(int V = 0; V < 50; V++){                         // Verschiebungen
    for(int i = 0; i < Spalten; i++){                  // Spalte
                                        // Farbberechnung
        if (Rstart != Rende ) {                        // Rot verändern ?
          if (Rb) {
            Rot -= 2;
            if (Rot == Rende or Rot == Rstart) {
              Rb = false;
            }
          } else {
            Rot += 2;
            if (Rot == Rende or Rot == Rstart) {
              Rb = true;
            }
          }
        } 
        if (Gstart != Gende ) {                        // Grün verändern ?
          if (Gb) {
            Gruen -= 2;
            if (Gruen == Gende or Gruen == Gstart) {
              Gb = false;
            }
          } else {
            Gruen += 2;
            if (Gruen == Gende or Gruen == Gstart) {
              Gb = true;
            }
          }
        } 
        if (Bstart != Bende ) {                        // Blau verändern ?
          if (Bb) {
            Blau -= 2;
            if (Blau == Bende or Blau == Bstart) {
              Bb = false;
            }
          } else {
            Blau += 2;
            if (Blau == Bende or Blau == Bstart) {
              Bb = true;
            }
          }
        } 
      for(int j = 0; j < 5; j++){                       // LED's
        LEDs[LEDMatrixL[i][j]] = CRGB(Rot,Gruen,Blau);  // einzelne LED setzen
      }
    }
    FastLED.show();
    delay(1000);
  }
}

// Hauptschleife
void loop() { 
  HG_Farbe (0, 20, 0);
  delay(2000);
  HG_LR (0,18,0,0,18,0);
}

(Nicht optimiert zur Erhöhung der Lesbarkeit)
Schaut schon mal ganz gut, hat aber seine Nachteile, die schon bei der Planung vorhanden waren.

Hintergrund von Links nach Rechts und ins Zentrum (Video)


Seitenanfang