Text über merhere Matrizen bewegen mit FastLED

Hallo ich bin noch an meinem Projekt, dazu gibt’s bereits einen anderen Beitrag…

ich habe mehrere (5) Matrizen (Adafruit 8x8 NeoPixel Matrix mit WS2812)

4 davon will ich jetzt einen text bzw die Uhrzeit als Lauftext anzeigen lassen… die 5. soll dabei etwas vollkommen anderes anzeigen (ein Uhren Symbol).

das ist nur einer von mehreren Modis in manchen sollen auch jede Matrix etwas vollkommen anderes anzeigen daher habe ich alle einzeln angesteuert d.h. jede der 5 Matrizen wird durch einen anderen Pin angesteuert.

Meine frage jetzt wie mach ich das ? ich hab schon keine Ahnung wie ich überhaupt mehrere Matrizen definieren kann sodass ich sie später im Sketch einzeln ansteuern also von einander unterscheiden kann.

Ich hab auch mal den Beispiel Sketch getestet … man erkennt da aufjedenfall Buchstaben das ganze läuft aber viel zu schnell durch und teilweise sieht man (wenn der text von unten nach oben oder von oben nach unten läuft) 2 reihen Buchstaben nebeneinander aber nur eine (die linke) wird ganz angezeigt, die andere ist nur zu ca. einem drittel zu sehen.

#include <FastLED.h>

#include <LEDMatrix.h>
#include <LEDText.h>
#include <FontMatrise.h>

#define LED_PIN        1
#define COLOR_ORDER    GRB
#define CHIPSET        WS2812

#define MATRIX_WIDTH   8
#define MATRIX_HEIGHT  8
#define MATRIX_TYPE    VERTICAL_MATRIX

cLEDMatrix<MATRIX_WIDTH, MATRIX_HEIGHT, MATRIX_TYPE> leds;

cLEDText ScrollingMsg;

const unsigned char TxtDemo[] = { EFFECT_SCROLL_LEFT "            LEFT SCROLL "
};

void setup()
{
  FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds[0], leds.Size());
  FastLED.setBrightness(64);
  FastLED.clear(true);

  ScrollingMsg.SetFont(MatriseFontData);
  ScrollingMsg.Init(&leds, leds.Width(), ScrollingMsg.FontHeight() + 1, 0, 0);
  ScrollingMsg.SetText((unsigned char *)TxtDemo, sizeof(TxtDemo) - 1);
  ScrollingMsg.SetTextColrOptions(COLR_RGB | COLR_SINGLE, 0xff, 0x00, 0xff);
}


void loop()
{
  if (ScrollingMsg.UpdateText() == -1)
    ScrollingMsg.SetText((unsigned char *)TxtDemo, sizeof(TxtDemo) - 1);
  else
    FastLED.show();
  delay(100);
}

das ist der Sketch so wie ich ich ihn getestet habe ( mit einem Teensy 3.2 und der Matrix)

Edit: ich hab den Sketch jetzt mal angepasst alles erstmal rausgeschmissen bis auf einen text … und die Matrix art geändert (der Code hier ist jetzt aktuell) ich hab jetzt das Problem das die Matrix um 90° gedreht ist kann man das einfach beheben ?
die Geschwindigkeit hab ich auch angepasst.

Gruß Flo

Das gehört nicht direkt zum Thema aber will deshalb nicht nochmal ein extra Beitrag erstellen .. ich habe einen alten Sketch, ursprünglich für einen streifen apa102 geschrieben.. erfüllt keinen zweck war nur just4fun.. ich hab jetzt versucht ihn für die Matrix zu benutzen aber es passiert gar nichts ?! die Matrix bleibt komplett Schwarz (aus) kann mir jemand sagen warum ?

#include <FastLED.h>
    #define NUM_LEDS          64
    #define DATA_PIN           1
    #define LED_TYPE           WS2812
    #define COLOR_ORDER   GRB
    #define x random (1,1000)
    #define y random(0,141)
    #define z 10
    CRGB leds[NUM_LEDS];

void setup() {
   FastLED.addLeds<LED_TYPE, COLOR_ORDER>(leds, NUM_LEDS);
}
void loop () {
  leds[y] = CRGB::Red;
  FastLED.show(z);
  delay(x);
  leds[y] = CRGB::OrangeRed;
  FastLED.show(z);
  delay(x);
  leds[y] = CRGB::DarkOrange;
  FastLED.show(z);
  delay(x);
  leds[y] = CRGB::Orange;
  FastLED.show(z);
  delay(x);
  leds[y] = CRGB::Yellow;
  FastLED.show(z);
  delay(x);
  leds[y] = CRGB::YellowGreen;
  FastLED.show(z);
  delay(x);
  leds[y] = CRGB::SpringGreen;
  FastLED.show(z);
  delay(x);
  leds[y] = CRGB::LimeGreen;
  FastLED.show(z);
  delay(x);
  leds[y] = CRGB::DarkCyan;
  FastLED.show(z);
  delay(x);
  leds[y] = CRGB::Aquamarine;
  FastLED.show(z);
  delay(x);
  leds[y] = CRGB::Aqua;
  FastLED.show(z);
  delay(x);
  leds[y] = CRGB::Blue;
  FastLED.show(z);
  delay(x);
  leds[y] = CRGB::DarkBlue;
  FastLED.show(z);
  delay(x);
  leds[y] = CRGB::BlueViolet;
  FastLED.show(z);
  delay(x);
  leds[y] = CRGB::DarkMagenta;
  FastLED.show(z);
  delay(x);
  leds[y] = CRGB::DarkOrchid;
  FastLED.show(z);
  delay(x);
  leds[y] = CRGB::Fuchsia;
  FastLED.show(z);
  delay(x);
  leds[y] = CRGB::DeepPink;
  FastLED.show(z);
  delay(x);
  leds[y] = CRGB::FireBrick;
  FastLED.show(z);
  delay(x);
}
#define DATA_PIN           1

Die Pins 0 und 1 werden beim UNO für USB benutzt.

Versuche mal

FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);

WS2812B braucht einen Pin, da nicht SPI wie bei APA102C möglich/sinnvoll.

Der Sketch erscheint mir sinnfrei, bei mir wird da nichts richtig angezeigt. Das

#define x random (1,1000)
#define y random(0,141)

macht wohl nicht, was Du möchtest.

Wenn Du APAs verwendest, dem Controller aber

#define LED_TYPE           WS2812

sagst, kann das nichts werden.

90 Grad Drehung: Einfach x und y vertauschen.

Mapping: Du steuerst das als eine LED Kette an und schreibst ein Mapping, welches Deine logischen x/y Koordinaten den tatsächlichen physischen LEDs zuordnet.

Also zuerst rausfinden, auf welcher Matrix der logische Pixel liegt und dann den Index innerhalb der betreffenden Matrix finden.

Hier das klassische x/y Mapping, welches je nach Layout (zigzag oder reihenweise) den Index innerhalb einer Matrix bestimmt:

uint16_t XY( uint8_t x, uint8_t y)
{
  uint16_t i;

  if( kMatrixSerpentineLayout == false) {
    i = (y * kMatrixWidth) + x;
  }

  if( kMatrixSerpentineLayout == true) {
    if( y & 0x01) {
      // Odd rows run backwards
      uint8_t reverseX = (kMatrixWidth - 1) - x;
      i = (y * kMatrixWidth) + reverseX;
    } else {
      // Even rows run forwards
      i = (y * kMatrixWidth) + x;
    }
  }

  return i;
}

Gruß, H.

agmue:

#define DATA_PIN           1

Die Pins 0 und 1 werden beim UNO für USB benutzt.

ich habe einen Teensy 3.2 verwendet.

agmue:
Der Sketch erscheint mir sinnfrei, bei mir wird da nichts richtig angezeigt. Das

#define x random (1,1000)

#define y random(0,141)



macht wohl nicht, was Du möchtest.

wie schon gesagt: "erfüllt keinen zweck war nur just4fun" der Sketch tut genau was er soll.. das sind 2 random befehle für die posotion und die zeit .. auf dem apa streifen hat das funktioniert ..

@Helmuth der Sketch war ursprünglich für einen apa streifen geschrieben wollte ihn aber jetzt auf der WS2812 Matrix testen .. das stimmt also.

Das mit dem Mapping .. danke dafür theoretisch hab ich das verstanden den Code wird ich mir mal genauer anschauen und ein bisschen rumspielen wird mich dazu bestimmt nochmal melden.
(das ganze bezieht sich im übrigen auf dieses >>Projekt<< )

ist es aber möglich über FastLED mehrere Matrizen in einem Sketch unabhänging von einander anzusteuern ?.. ich steh etwas unter zeit druck und muss mein Projekt (muss nicht fertig sein soll nur etwas zu sehen sein) Präsentieren können es reicht theoretisch wenn ich 1-2 schöne Effekte zeigen kann .. ich hab die Matrizen momentan alle einzeln angeschlossen und das mit dem Mapping werde ich nicht so schnell hinbekommen deshalb muss ich jetzt für die 1. Präsentation improvisieren ..

Noch eine allgemeine frage zum Schluss hat jemand einen tipp wo man gut und schnell so etwas lernen kann ich tu mir mit vielem immer noch zu schwer .. das hier im Forum hilft schon oft weiter .. aber wenn die Grundlagen fehlen reicht das oft nicht außerdem läuft mir langsam die zeit weg und ich brauche noch einiges an Hilfe ..

Gruß Flo

ist es aber möglich über FastLED mehrere Matrizen in einem Sketch unabhänging von einander anzusteuern ?

Ja, bis Dir die Pins ausgehen…

Einfach mehrfach

FastLED.addLeds<NEOPIXEL, Data_Pin>(leds, NUM_LEDS);

schreiben, natürlich jeweils mit passendem Data Pin. Zeigt dann alles das Gleiche an.

Alternativ mehrere CRGB - Arrays, für individuelle Inhalte z.B.

CRGB leds1[256];
CRGB leds2[256];
CRGB leds3[256];

(...)

FastLED.addLeds<NEOPIXEL, 13>(leds1, 256);
FastLED.addLeds<NEOPIXEL, 14>(leds2, 256);
FastLED.addLeds<NEOPIXEL, 15>(leds3, 256);

Noch eine allgemeine frage zum Schluss hat jemand einen tipp wo man gut und schnell so etwas lernen kann

Natürlich, aber die Antwort wird Dir nicht gefallen: Indem man sich intensiv damit beschäftigt.

Ungeduld und der Wunsch nach schnellen Ergebnissen sind da eher hinderlich… Und ohne Grundlagenstudium ist es unmöglich.
Einen Schritt nach dem anderen. Zuerst laufen lernen und DANACH Weitsprung probieren. Du fragst momentan nach Details zum dreifachen Rittberger. :wink:

Wenn Du ein simples x/y Mapping nicht hinbekommst, brauchen wir über “1-2 schöne Effekte” echt nicht reden.

Bei konkreten Detailfragen helfen wir hier gern weiter, fertigen Code schreibe ich Dir keinen.

Grüße, Helmuth

Helmuth:
Ja, bis Dir die Pins ausgehen...
(...)
Alternativ mehrere CRGB - Arrays, für individuelle Inhalte z.B.

CRGB leds1[256];

CRGB leds2[256];
CRGB leds3[256];

(...)

FastLED.addLeds<NEOPIXEL, 13>(leds1, 256);
FastLED.addLeds<NEOPIXEL, 14>(leds2, 256);
FastLED.addLeds<NEOPIXEL, 15>(leds3, 256);

Danke dafür, das hab ich schonmal hinbekommen.

Helmuth:
Natürlich, aber die Antwort wird Dir nicht gefallen: Indem man sich intensiv damit beschäftigt.

Ungeduld und der Wunsch nach schnellen Ergebnissen sind da eher hinderlich... Und ohne Grundlagenstudium ist es unmöglich.
Einen Schritt nach dem anderen. Zuerst laufen lernen und DANACH Weitsprung probieren. Du fragst momentan nach Details zum dreifachen Rittberger. :wink:

Naja von nicht gefallen kann nicht die rede sein das ist mir prinzipiell schon klar, mir macht das ja auch spaß da rum zu versuchen und auszuprobieren aber das Projekt ist ein Schulprojekt und damit habe ich mich ja scheinbar ziemlich übernommen .. jetzt stehe ich unter extremem Zeitdruck und muss bis nächste Woche Mittwoch irgendwie etwas vorzeigbares hinbekommen das ist gerade mein Problem.

einen Kompletten Programmcode erwarte ich von keinem, "konkreten Detailfragen" kann ich aber kaum stellen wenn ich keine Ahnung habe wie ich die Sache überhaupt angehen soll.

Trotzdem danke und bis bald, die nächste frage wird kommen wahrscheinlich schneller als gedacht :stuck_out_tongue:

Gruß Flo

CRGB leds1[256];
CRGB leds2[256];
CRGB leds3[256];

(...)

FastLED.addLeds<NEOPIXEL, 13>(leds1, 256);
FastLED.addLeds<NEOPIXEL, 14>(leds2, 256);
FastLED.addLeds<NEOPIXEL, 15>(leds3, 256);

funktioniert wohl doch nicht so wie ich das will ..

#include <FastLED.h>
#include <LEDMatrix.h>
#include <LEDText.h>

#define MATRIX_OBEN           21
#define MATRIX_VORNE          7
#define MATRIX_RECHTS         20
#define MATRIX_HINTEN         6
#define MATRIX_LINKS          8

#define FARB_REIHENFOLGE      GRB
#define LEDTYP                WS2812

#define MATRIX_WIDTH          8
#define MATRIX_HEIGHT         8
#define MATRIX_TYPE           VERTICAL_MATRIX

cLEDMatrix<MATRIX_WIDTH, MATRIX_HEIGHT, MATRIX_TYPE> leds;

CRGB ledso[NUM_LEDS];
CRGB ledsv[NUM_LEDS];
CRGB ledsr[NUM_LEDS];
CRGB ledsh[NUM_LEDS];
CRGB ledsl[NUM_LEDS];

void setup() {
  FastLED.addLeds<LEDTYP, MATRIX_OBEN, FARB_REIHENFOLGE>(ledso[0], leds.Size());
  FastLED.addLeds<LEDTYP, MATRIX_VORNE, FARB_REIHENFOLGE>(ledsv[0], leds.Size());
  FastLED.addLeds<LEDTYP, MATRIX_RECHTS, FARB_REIHENFOLGE>(ledsr[0], leds.Size());
  FastLED.addLeds<LEDTYP, MATRIX_HINTEN, FARB_REIHENFOLGE>(ledsh[0], leds.Size());
  FastLED.addLeds<LEDTYP, MATRIX_LINKS, FARB_REIHENFOLGE>(ledsl[0], leds.Size());
  FastLED.setBrightness(20);
  FastLED.clear(true);
}

void loop(){
ledso[0] = CRGB::Red;
FastLED.show();
delay(100);
}

das ist mein Sketch .. in den Loop kommt natürlich noch einiges dazu aber er streicht mir jetzt schon
leds[0] = CRGB::Red; an und schreibt :

exit status 1
'ledso' was not declared in this scope

aber warum ?
ist das nicht hier declared :
CRGB ledso[NUM_LEDS]; ?

ich hab vor ein paar eigene Symbole zu erstellen deshalb werde ich jede einzelne Led die ich brauche ansteuern.

FastLED.addLeds<LEDTYP, MATRIX_OBEN, FARB_REIHENFOLGE>(ledso[0], leds.Size());

ersetzen durch

FastLED.addLeds<LEDTYP, MATRIX_OBEN, FARB_REIHENFOLGE>(ledso, anzahl_leds_von_ledso);

Außerdem:

leds[0] = CRGB::Red;

kann nicht funktionieren, da es bei Dir kein CRGB Array mit dem Namen "leds" gibt.

Basierend auf Deinem Code Schnipsel müsste es heißen

ledso[0] = CRGB::Red;

Das ganze Thema "Multiple Controller" ist hier umfassend dokumentiert.

Beste Grüße,

Helmuth

Weiterer Fehler:

CRGB ledso[NUM_LEDS];

macht keinen Sinn, wenn NUM_LEDS nicht vorher definiert ist.

Desweitern steht NUM_LEDS für die Anzahl ALLER Leds in einem Setup. Du willst aber nur die Anzahl der LEDs auf Matrix "o"

ich hab jetzt mal nein Sketch(villeicht unübersichtlich, wollte platz sparen dauert so schon lang genug bis man nach unten gescrollt hat :stuck_out_tongue: ) geschrieben ist wahrscheinlich extrem umständlich und evtl. auch viel dabei was man gar nicht braucht aber egal er funktioniert wie er soll und es sieht auch ganz gut aus. am Mittwoch wird das als anschauungs Objekt "ausgestellt" und danach wird ich mir noch ein paar aufwendigere Sachen ausdenken.

danke nochmal an alle die geholfen haben :slight_smile:

Gruß Flo

in_Arbeit.ino (52.2 KB)