LEDMatrix / LEDText / FastLED in Kombination

Hallo zusammen,

ich würde gerne abwechselnd einen Text und danach ein Bild auf einer 10x11 grossen WS2812b-Matrix anzeigen lassen..

Bisher habe ich folgendes:

#include <FastLED.h>
#include <LEDMatrix.h>
#include <LEDText.h>
#include <FontMatrise.h>
#define LED_PIN        D4
#define COLOR_ORDER    GRB
#define CHIPSET        WS2812B
#define MATRIX_WIDTH   11
#define MATRIX_HEIGHT  -10
#define MATRIX_TYPE    HORIZONTAL_ZIGZAG_MATRIX

cLEDMatrix<MATRIX_WIDTH, MATRIX_HEIGHT, MATRIX_TYPE> leds;
cLEDText ScrollingMsg;
const unsigned char TxtDemo[] = { EFFECT_HSV "\xa0\xff\xff" " Hier könnte Ihre Werbung stehen... " };

CRGB leds2[NUM_LEDS];

void setup()
{
  FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds[0], leds.Size());
  FastLED.setBrightness(200);
  FastLED.clear(true);
  delay(500);
  
  ScrollingMsg.SetFont(MatriseFontData);
  ScrollingMsg.Init(&leds, leds.Width(), ScrollingMsg.FontHeight() + 3, 0, 0);
  ScrollingMsg.SetText((unsigned char *)TxtDemo, sizeof(TxtDemo) - 1);
  ScrollingMsg.SetTextColrOptions(COLR_RGB | COLR_GRAD, 0xff, 0x00, 0xff);
}

void loop()
{
  scroll();
  delay(1000);
  bild();
  delay(1000);
}

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

void bild(){
  leds2[1].setRGB(255,0,0);
  // ... 
  FastLED.show();
}

Text funktioniert super, jedoch initialisiere ich in Zeile 20 fastLED mit:

FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds[0], leds.Size());

weshalb ich mit leds2 CRGB leds2[NUM_LEDS]; nichts mehr machen kann. Wo liegt der Trick beide varianten gleichzeitig zu verwenden?

Vorab bedanke ich mich für die Hilfe!

Hi

Ich verstehe Deine Frage nicht.
Du erstellst eine Variable 'leds2[]' vom Typ CRGB, die Größe des Array entspricht der Anzahl der LED.
Weshalb kannst Du damit 'Nichts machen'?
Die ganzen leds2[...] sind ab jetzt Farbwerte - denke 24Bit (RGB zu je 8 Bit) - Diese kannst Du jeder LED Deines Stripes zuweisen.
Allerdings hat leds2[17] so was von Nichts mit der 17.ten LED zu tun - Das ist einfach nur eine Variable mit einem Farbwert - eben die 18.te (erstes Element bei 0).

Wo ist Dein Problem bzw. Was willst Du damit erreichen??

MfG

Hallo Postmaster-ino,

erstmal Dankeschön für die Antwort.

Die Frage ist folgende:
Ich übergebe ja FastLED 'leds' (cRGBMatrix), möchte aber im Verlauf meines Programmes auch mit einem CRGB-Array Leds ansprechen.

Ich kann zwar ein CRGB-Array erstellen, aber wenn ich damit eine led ansprechen möchte, reagiert diese nicht da fastLED dieses Array nicht kennt.

cLEDMatrix hat aber kein .setRGB(x,y,z)...

Hi

Der x,y,z Wert ist eigentlich nur eine 24-bit HEX-Zahl, Deren drei 8-Bit Werte 'zusammengeklebt' sind.
0x0000FF Blau
0x00FF00 Grün
0xFF0000 Rot
(oder andere Reihenfolge)
Du kannst also eine Funktion basteln, Die Dir die Einzelwerte für Rot, Grün und Blau in eine 24-Bit-Zahl umrechnen.
R<<16||G<<8||B
R um 16 Bit nach Links verschoben, verodert mit Grün um 8 Bit nach links verschoben, verodert mit Blau.

Wenn Du den Puffer von FastLED mit Deinem eigenen Puffer überschreiben willst - mach Das doch einfach.
Du kannst jeder LED einzeln einen Farbwert zuordnen - in einer Schleife kannst Du Das für jede der LEDs machen - und schon hast Du den FastLED-Puffer überschrieben.
Ein .show() später und die LEDs leuchten in neuen Farben.

Oder habe ich Dein Problem immer noch nicht verstanden?

MfG

Hallo Postmaster-ino,

ich habe bereits mehrere Animationen mit der FastLED-Lib erstellt. Diese funktionieren meist mit "leds[x].setRGB(r,g,b);".
Nun wollte ich zusätlich eine Laufschrift integrieren, weswegen ich die LEDMatrix.h und LEDText.h reingeholt habe.

Normalerweise sah mein Code bisher so aus:

//(...)
CRGB leds[NUM_LEDS];

void setup() {
FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip ); // leds = CRGB
//(...)
}

Nun bei der Laufschrift ist es nicht mehr ein CRGB-Array welches ich zuweise, sondern ein cLEDMatrix-Array, welches kein .setRGB beinhaltet:

//(...)
cLEDMatrix<MATRIX_WIDTH, MATRIX_HEIGHT, MATRIX_TYPE> leds;

void Setup() {
 FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds[0], leds.Size());  // leds = cRGBMatrix
};

Da ich nun die FastLED-Lib mit einem cRGBMatrix-Array initialisiert habe, fehlt die Möglichkeit hier auf einzelne leds mit .setRGB() zuzugreifen.

Wie schaffe ich es jetzt meine Animationen entsprechend in den Buffer von FastLED zu bekommen?

ihmSelbst:
Da ich nun die FastLED-Lib mit einem cRGBMatrix-Array initialisiert habe, fehlt die Möglichkeit hier auf einzelne leds mit .setRGB() zuzugreifen.

Das sehe ich nicht so, nur ist ein Zeiger "dazwischen". Mit APA102 und Pins an SPI habe ich es so probiert:

#include <FastLED.h>
FASTLED_USING_NAMESPACE
#include <LEDMatrix.h>
#include <LEDText.h>
#include <FontMatrise.h>
#define LED_TYPE    APA102
#define COLOR_ORDER BGR
#define MATRIX_WIDTH   11
#define MATRIX_HEIGHT  -10
#define MATRIX_TYPE    HORIZONTAL_ZIGZAG_MATRIX
#define NUM_LEDS 110

cLEDMatrix<MATRIX_WIDTH, MATRIX_HEIGHT, MATRIX_TYPE> leds;
cLEDText ScrollingMsg;
const unsigned char TxtDemo[] = { EFFECT_HSV "\xa0\xff\xff" " Hier könnte Ihre Werbung stehen... " };

void setup()
{
  FastLED.addLeds<LED_TYPE, COLOR_ORDER>(leds[0], NUM_LEDS);
  //FastLED.addLeds<CHIPSET, LED_PIN, COLOR_ORDER>(leds[0], leds.Size());
  FastLED.setBrightness(200);
  FastLED.clear(true);
  delay(500);

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

void loop()
{
  scroll();
  delay(1000);
  bild();
  delay(1000);
}

void scroll() {
  if (ScrollingMsg.UpdateText() == -1) {

    ScrollingMsg.SetText((unsigned char *)TxtDemo, sizeof(TxtDemo) - 1);
  }
  else
    FastLED.show();
  delay(50);
}

void bild() {
  for (byte j = 0; j < NUM_LEDS; j++) {
    leds[j]->setRGB(255, 0, 0);
  }
  FastLED.show();
}

Ein paar Warnungen des Compilers habe ich mal ignoriert.

agmue:
Das sehe ich nicht so, nur ist ein Zeiger "dazwischen". Mit APA102 und Pins an SPI habe ich es so probiert:

    leds[j]->setRGB(255, 0, 0);

Herzlichen Dank, funktioniert!