Hallo zusammen,
ich stehe vor einem neuen Kunstprojekt, bei dem ich verschiedene Röhren im Inneren mit LED-Stripes ausstatte und so eine interaktive Licht-Installation kreiere.
Nun möchte ich nicht nur Animationen "coden", sondern auch schon existierende Videos abspielen.
Dazu war meine Idee, das Video als BMP-Sequenz abzuspielen. Diese liegt auf einer SD-Karte in genau der Auflösung meines LED-Stripes (60x1) und in einer Formatierung mit der ich umgehen kann. Soll heißen, ein einzelnes Bild kann ich anzeigen. Mein Problem liegt beim Abspielen mehrerer Bilder hintereinander.
Ich nutze folgende Libs: FastLED und SDfat. Hier ein Beispielcode:
//LED-STRIPE
#include "FastLED.h"
FASTLED_USING_NAMESPACE
CRGB stripe[60] = {0};
//SD-KARTE---------------------------------------------------------------------
#include "SdFat.h"
const uint8_t SD_CS_PIN = 46;
// Try max SPI clock for an SD. Reduce SPI_CLOCK if errors occur.
#define SPI_CLOCK SD_SCK_MHZ(50)
// Try to select the best SD card configuration.
#if HAS_SDIO_CLASS
#define SD_CONFIG SdioConfig(FIFO_SDIO)
#elif ENABLE_DEDICATED_SPI
#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK)
#else // HAS_SDIO_CLASS
#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK)
#endif // HAS_SDIO_CLASS
SdFat32 sd;
File32 dir;
File32 file;
//------------------------------------------------------------------------------
// Store error strings in flash to save RAM.
#define error(s) sd.errorHalt(&Serial, F(s))
//------------------------------------------------------------------------------
void setup() {
delay(3000);
Serial.begin(9600);
FastLED.addLeds < WS2812B, 2, GRB > (stripe, 60).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(200);
if (!sd.begin(SD_CONFIG)) {
sd.initErrorHalt(&Serial);
}
if (!dir.open("/TestVideo")) {
error("dir.open failed");
}
}
void loop() {
if(!file.openNext(&dir, O_RDONLY)){
error("file.open failed");
} else {
Serial.println("file opened");
showBMP(file);
file.close();
}
FastLED.show();
delay(1000/30) ;
}
void showBMP(File32 &file) {
file.seek(54);
for (int i = 0; i < 40; i++) {
byte b = file.read();
byte g = file.read();
byte r = file.read();
file.read();
stripe[i] = CRGB(r, g, b);
}
}
Bei diesem Code kommt folgender Output:
file opened
error: file.open failed
SdError: 0XC,0XFF
Das erste Bild wird auch auf dem Stripe angezeigt.
Ich habe bisher rausgefunden, dass wohl die Zeile mit "FastLED.show();" das Problem ist. Wenn ich sie auskommentiere, öffnet das Programm alle Dateien im Ordner TestVideo.
Aber ohne "FastLED.show();" zeigt mir der Stripe nix an.
Gibt es eine Alternative, um die LEDs zum Show zu bringen?
Eine andere Lib würde ich ungern nutzen, da ich später Funktionen wie Overlay o.ä. nutzen möchte.
Ich bin nun mit meinem Latein am Ende.
Habt Ihr eine Idee, wie man das Problem lösen kann?
Viele Grüße und schonmal danke für Eure Antworten,
Nougat