Hallo,
ich habe mir mal so ein WS2812 Quadrat bestellt.
Der Code läuft schon seit Jahren auf UNOs, MEGAs und auch leicht modifiziert auf ESPs.
#define FASTLED_ESP8266_RAW_PIN_ORDER
#include <FastLED.h>
#define NUM_LEDS 64 // Anzahl der LEDs im Strip
#define NUM_COLORS 7
struct CRGB leds[NUM_LEDS];
#ifdef ESP8266
#define LED D4 // Lolin Board onboard LED
#else
#define LED 13
#endif
CRGB Cols[NUM_COLORS] =
{
{0x00,0x00,0x10},
{0x00,0x10,0x00},
{0x10,0x00,0x00},
{0x10,0x10,0x00},
{0x10,0x00,0x10},
{0x00,0x10,0x10},
{0x10,0x10,0x10}
};
CRGB rgb;
void setup() {
#ifdef ESP8266
FastLED.addLeds<WS2812, D2, RGB>(leds, NUM_LEDS);
#else
FastLED.addLeds<WS2812, 8, RGB>(leds, NUM_LEDS);
#endif
int i;
int j;
int k;
int r,b,g;
for (j = 0;j < NUM_LEDS ; j++)
{
rgb.g = 0;
rgb.r = 0;
rgb.b = 0;
leds[j] = rgb;
}
// FastLED.showRGB((byte*)leds, NUM_LEDS);
FastLED.show();
delay(100);
for (j = 0;j < NUM_LEDS ; j++)
{
rgb.g = 0;
rgb.r = 0;
rgb.b = 0x10;
leds[j] = rgb;
}
// FastLED.showRGB((byte*)leds, NUM_LEDS);
FastLED.show();
delay(100);
randomSeed(millis());
delay(3000);
}
void loop() {
int wait=random(20,30);
int dim=random(6,10);
int max_cycles=20;
int cycles=random(1,max_cycles+1);
rainbowCycle(wait,cycles,dim);
}
void MakeFlux()
{
int i;
int j;
int k;
int z2;
int colIndex;
for (j = 150 ; j > 30 ; j = j - 4)
{
ClearAll();
z2 = NUM_LEDS - 1;
for (i = 0 ; i < 12 ; i++)
{
colIndex = random(0,NUM_COLORS);
Serial.println(colIndex);
rgb.g = Cols[colIndex].g;
rgb.r = Cols[colIndex].r;
rgb.b = Cols[colIndex].b;
leds[i] = rgb;
if (i > 6)
{
leds[z2] = rgb;
z2--;
}
FastLED.show();
delay(j);
}
}
for (j = 1 ; j < 30 ; j++)
{
ClearAll();
z2 = NUM_LEDS - 1;
for (i = 0 ; i < 12 ; i++)
{
colIndex = random(0,NUM_COLORS);
rgb.g = Cols[colIndex].g;
rgb.r = Cols[colIndex].r;
rgb.b = Cols[colIndex].b;
leds[i] = rgb;
if (i > 6)
{
leds[z2] = rgb;
z2--;
}
FastLED.show();
delay(25);
}
}
}
void ClearAll()
{
int j;
for (j = 0;j < NUM_LEDS ; j++)
{
rgb.g = 0;
rgb.r = 0;
rgb.b = 0;
leds[j] = rgb;
}
FastLED.show();
}
void rainbowCycle(uint8_t wait,byte cycle,byte dim) {
int cycles, j, k;
for(cycles=0;cycles<cycle;cycles++){
byte dir=random(0,2);
k=255;
for (j=0; j < 256; j++,k--) { // cycles of all 25 colors in the wheel
if(k<0)k=255;
for(int i=0; i<NUM_LEDS; i+=1) {
Wheel(((i * 256 / NUM_LEDS) + (dir==0?j:k)) % 256,dim);
leds[i]=rgb;
}
// FastLED.showRGB((byte*)leds, NUM_LEDS);
FastLED.show();
delay(wait);
}
}
}
void Wheel(byte WheelPos,byte dim){
if (WheelPos < 85) {
rgb.r=0;
rgb.g=WheelPos * 3/dim;
rgb.b=(255 - WheelPos * 3)/dim;;
return;
}
else if (WheelPos < 170) {
WheelPos -= 85;
rgb.r=WheelPos * 3/dim;
rgb.g=(255 - WheelPos * 3)/dim;
rgb.b=0;
return;
}
else {
WheelPos -= 170;
rgb.r=(255 - WheelPos * 3)/dim;
rgb.g=0;
rgb.b=WheelPos * 3/dim;
return;
}
}
Der ist schon mit diversen Längen von LEDs gelaufen. Mit extra Spannungsversorgung. Bei
weniger LEDs auch mit einfacher Spannungsversorgung. Irgendwie alle Varianten und Längen.
Nie Probleme.
Jetzt habe ich mal so eine Matrix angeschlossen und alles spinnt.
Erst mal werden nicht alle LEDs angesprochen und dann sind Farben und Timing völlig daneben.
(Wie gesagt immer der selbe CODE der an Stripes wunderbar läuft).
Ich habe dann gedacht OK das Teil ist einfach kaputt und mir ein Neues bestellt.
Zack : Wieder genau das Selbe.
Muss man bei diesen Matrizen irgendwelchen magischen Steine beschwören ??
Der Code oben ist irgendein Allerweltsbeispiel.
Achso, ja den Widerstand habe ich vor der ersten LED in der Datenleitung.
Ulli