WS2812B falsche Farben

Einen schönen guten Morgen. Und Danke an jeden, der mir helfen kann :slight_smile:

Folgende Aufstellung:

Es wurde eine große Pressspan Platte genommen (1,20x3m). In diese Platte 6x10 Löcher gebohrt und in jedes Loch ein WS2812B gesteckt.

Die Verkabelung:

Es gibt sozusagen eine Hauptleitung, welche in Schlaufen an der Rückseite entlang läuft und an die jede einzelne LED mit 5V-in und dem GND-in verbunden ist. Somit ist die Stromversorgung nicht in Reihe sondern Parallel geschaltet.

angeschlossen ist das ganze an einem ausgebauten PC-Netzteil, an dem einige rote (5V) und schwarze (masse) -Kabel zusammen gelegt wurden.

Die Signalkabel gehen erst von einem Arduino Mega in die erste LED (D-in) und über D-out in das D-in der nächsten LED.

An jedem WS2812B sind somit nur 4 pins angeschlossen, D-in, D-out, 5V-in und GND-in.
Der letzte Pixel hat außerdem kein D-out also nur 3 angeschlossene pins.

Die LEDs sind beim ersten Versuch an gegangen. Es läuft ein ganz einfaches "Blink" in rot mit Hilfe der FastLed Bib:

#include "FastLED.h"

#define NUM_LEDS 60
#define DATA_PIN 6

CRGB leds[NUM_LEDS];

void setup() { 

      FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);

}

void loop() { 
  // Turn the LED on, then pause
  fill_solid(leds, NUM_LEDS, CRGB( 0 , 255 , 0));
  FastLED.show();
  delay(1000);
  // Now turn the LED off, then pause
  fill_solid(leds, NUM_LEDS, CRGB(0 , 0 , 0));
  FastLED.show();
  delay(1000);
}

Das Problem:

Die Ersten 4 LEDs machen dies auch, der Rest aber blinkt nicht und bleibt Weiß/Lila.
An der Stromversorung kann es daher ja nicht unbedingt liegen da alle LEDs leuchten, nur eben falsch.

Das Datenkabel aber ist zwischen den einzelnen LEDs ziemlich lang..ca.60cm. Kann es daran liegen?
Stimmt etwas nicht mit der Verkabelung, muss das letzte D-out an die Masse?

Ich bin für jeden Rat sehr dankbar :slight_smile:

Das Problem ist die Datenleitung. Die ist mit 60 cm zwischen den WS2812B zu lang.

Mir ist gerade auuch noch eingefallen, dass der Arduino über eine 5V Anbindung vom Netzteil betrieben wird. Das ist glaube ich zu wenig. Könnte es auch daran liegen?

Godel:
Mir ist gerade auuch noch eingefallen, dass der Arduino über eine 5V Anbindung vom Netzteil betrieben wird. Das ist glaube ich zu wenig. Könnte es auch daran liegen?

Nicht, wenn du die 5 Volt richtig angeschlossen hast.
Wir können aber nicht sehen, wie du es gemacht hast.

Hi

Wenn Du die 60cm nicht überbrückt bekommst, setze eine WS2812B verdeckt hinter die Platte - musst beim Programmieren nur aufpassen, daß für Diese auch ein Farbwert gesendet wird und eben bei den langen Verbindungen so Sprünge der LED-Nummern bekommen wirst.
Dürfte auch billiger sein (1x WS2b12B), als die Datenleitung anzuheben (kA, OpAmps, diverse ICs, whatever)

MfG

Hallo

Das Problem ist die Datenleitung. Die ist mit 60 cm zwischen den WS2812B zu lang.

Was wäre den ca. max Länge? Hat der Controller nicht sowas wie einen Repeater eingebaut der das weitergegebene Signal aufarbeitet? Ich habe auch ein Projekt mi diesen Led vor die Leitungslänge were
auch>10cm.Aus dem Datenb. habe ich darüber leider nichts rauslesen können.

Hi

Wenn Du noch Pixel über hast - Versuch macht Kluch (Versuch macht klug).
Allerdings kann der Aufbau auf dem Schreibtisch nicht mit Dem an einem elektrisch verseuchtem Standort gleichgesetzt werden.
Wenn die LEDs beim Bürstenfeuer des Hand-Mixer der Ehefrau plötzlich die Küche in eine Disco verwandeln, könnte der WAF leiden :wink:

MfG

Mach mal einige gute Fotos Vvn Deinem Aufbau, ansonsten raten wir uns zu tode.
Grüße Uwe

postmaster-ino:
Hi

Wenn Du die 60cm nicht überbrückt bekommst, setze eine WS2812B verdeckt hinter die Platte - musst beim Programmieren nur aufpassen, daß für Diese auch ein Farbwert gesendet wird und eben bei den langen Verbindungen so Sprünge der LED-Nummern bekommen wirst.
Dürfte auch billiger sein (1x WS2b12B), als die Datenleitung anzuheben (kA, OpAmps, diverse ICs, whatever)

MfG

Es gibt auch die WS2811, das ist der Controller ohne LED. Ich finde so einen sinnvoller als ein WS2812 mit LED.

Aber 60cm müßten kein Problem sein.
laut Datenblatt kann die Distanz zwishen 2 WS2812 mehr als 5m sein.

Grüße Uwe

Achtung häufig muss man bei CHINA WS2812 die Farbreihenfolge ändern von

FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);

nach

FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);

Damit solltest du auch deine Fehlfarben korrigiert bekommen
Das ist bei meinen Aliexpress Stripes und Einzel LEDs so.
Gruß
DerDani

Nur mal so als Zwischenfrage bzw. Denkanstoß für zukünftige Projekte!?

Warum verwendet ihr immer noch 2812Ber und nicht die "neuen" 2813er LEDs?

Vorteil der 2813er:

  • Fehlerpixel werden übergangen, es fallen nicht alle nachfolgenden aus. Nur wenn zwei direkt hintereinander def. sind fällt der Rest aus.
  • Verschiedene Helligkeiten ab Werk (A bis D, siehe Datenblatt)
  • Selben Befehle wie 2812B.

Nur mal so für die Zukunft bzw. die die ein neu ins Thema kommen.

Gruß

MiReu

Ich schicke später ein paar Fotos!

volvodani:
Achtung häufig muss man bei CHINA WS2812 die Farbreihenfolge ändern von

FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);

nach

FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);

Damit solltest du auch deine Fehlfarben korrigiert bekommen
Das ist bei meinen Aliexpress Stripes und Einzel LEDs so.
Gruß
DerDani

WS2812 in 5mm bzw 8mm LED Gehäuse sind eigentlich keine WS2812 sondern PL9823. Diese haben das gleiche Übertragungsprotokoll aber 2 Grundfarben in der Datenübertragung vertauscht.

Das scheint mir aber nicht das Problem dieses TO zu sein da ab der 4. LED keine Faren übertragen werden.

Könnte auf eine kaputte LED hinweisen. Man könnte versuchen die letzte funktionierende LED oder die erste nicht funktionierende LED auszutauschen wenns nicht ein Verdratungsfehler ist oder eine schlechte Lötstelle.

Grüße Uwe

Hi

Wenn's Einzel-Pixel sind und Diese zwei Typen gemischt, als Sackware, verkauft wurden?
Dann müssten aber LEDs ab 4 auch auf verschiedene Farben reagieren.

Habe hier auch auf einem Stripe eine defekte LED, da fehlt eine Farbe (aka Bond-Draht defekt), 'die Anderen' sind aber nicht betroffen.

MfG

Habe leider gerade nicht die Möglichkeit die Bilder Hochzuladen.

Der Fehler wurde aber gefunden, die letzte funktionierende LED wurde an die nächste direkt verlötet und schon hat alles funktioniert. Es werden die kleinen runden verwendet mit 6 kleinen lötstellen. Scheinbar ist der d-in oder d-out an die stromversorgung geraten.
Der Tipp mit der 13er version ist sehr gut, den hätten wir vor der Bestellung gebraucht :smiley:

Vielen Dank

Aber 60cm müßten kein Problem sein.
laut Datenblatt kann die Distanz zwishen 2 WS2812 mehr als 5m sein.

Jetzt hab ich es endlich auch gelesen.Brauche wohl eine neue Brille.
Mehr als 5m heißt in diesem Fall mindestens 8m ,mehr war gerade nicht zur Hand.

Leitungslänge were
auch>10cm.

Reicht dann auch für meine Zwecke sollte nämlich >100cm heißen

Einen schönen guten Morgen,

hier noch die versprochenen Bilder:

vorderer Aufbau

Die Kabelkennung ist wie gewohnt 5V-rot, Masse-schwarz, Data-gelb/weiß

Anschluss
Rückseite

Auf der Rückseite und im Bild Anschluss sieht man die Verkabelung der Stromversorgung, hier sind 5V-braun und Masse-blau

Das ganze Projekt wird aus 6 dieser Platten bestehen.

Hier noch die
verwendeten Pixel

In der Zwischenzeit wurde eine weitere Platte verlötet, nun bin ich etwas am verzweifeln, es funktionieren wieder nur die ersten 5 Pixel. Ist das jetzt ein dummer Zufall oder kann es an etwas anderem liegen?

Ich bin mir nicht sicher ob ich so etwas in diesem Forum fragen darf, aber kommt hier jemand mit etwas mehr Ahnung als ich aus Darmstadt und hätte an diesem sonnigen Sonntag Zeit sich das ganze in echt anzuschauen?

Vielen Dank!

Das sind keine WS2812 sondern SK6812 (anderrer Hersteller aber sehr ähnlich dem WS2812B).
Das steht in Datenblatt:
"plastic forward strengthening technology, the transmission distance between two points over 10M;"

Ich kann leider nicht vorbeikommen; es regnet gerade. :wink: :wink:
Wohne auch zuweit weg.

Zur Fehlfunktion der 2. Tafel: Kontrolliere die Lötstellen eund Verkabelung und ersetze eventuel mal das 5. und 6. LED

Grüße Uwe

Guten Abend zusammen,

da das Thema aktuell passt, führe ich es mal fort....

Ich habe mir vor kuzem solche LED Ringe gekauft. Hier habe ich aber das Problem, dass diese 2 Ringe verschieden sind. Der eine versteht RGB, der andere dagegen GRB..

Jetzt steh ich vor dem Problem und weiß nicht, wie ich das auf die einzelnen Pixel verweisen kann... Sowas wie: von LED... bis LED so..... und von..... bis.... so...

Erst dachte ich, der variable i eine Zahl zu geben, die dann i++ geht, bis die nächste Zahl erreicht ist.. Hat jemand eine kleine Hilfestellung für mich? Vielleicht kann man dies ja gruppieren?

Anbei mal der Code.. Aktuelll gekürzt.

#include "FastLED.h" // Bibliothek der LEDs laden.
#include <EEPROM.h> // EEPROM-Lib für die Speicherung des aktuellen Zustandes

#define NUM_LEDS 63 // Wie viele LEDs sind in dem Strang verkettet?
#define dataPin 7 // Welcher Pin gibt den Signalausgang?

CRGB leds[NUM_LEDS]; // Dies ist eine Reihe von LEDs. Ein Stück für jede LED in diesem Streifen.

int modus = 0; // Variable für den Ablauf
int LED = 0;
byte dim = 5; // Helligkeit zwischen 0 und 255
long lWaitMillis = 0; // Hilfsvariable zur Zeitmessung bei effekten
uint8_t gHue = 0; // rotatierende "base color" von sämtlichen effekten
byte maxModi = 6; // Anzahl der Modi (ist modi der plural von modus?!)

int buttonPin = 2; // Eingang des Tasters für die Programmauswahl
// Button um alle LEDs auszuschalten und wieder einzuschalten.
int buttonState = LOW; // variable um den Tasterstatus zu halten
int buttonread = 0;

void setup() { // Folgende Funktion schaltet die LEDs und übermittelt die Informationen an den Arduino

// sanity check delay - allows reprogramming if accidently blowing power w/leds
delay(2000);
FastLED.addLeds<WS2812, dataPin>(leds, NUM_LEDS);
pinMode(buttonPin, INPUT);
Serial.begin(9600);

}

void loop (){

getButtonStatus(); // handle button

if (modus==0) modus1();
if (modus==1) modus2();
if (modus==2) modus3();
if (modus==3) modus4();
if (modus==4) modus5();
if (modus==5) modus6();

}

void getButtonStatus() {
buttonread = digitalRead(buttonPin); // Lese PinStatus vom Taster

if (buttonread == LOW) {
if (buttonState == HIGH) {
buttonState = LOW;
modus++;
if (modus > maxModi) { modus = 0; }
delay(20);
Serial.println(modus);
}
}
else { if (buttonState == LOW) { buttonState = HIGH; }}
}

//+++++++++++++++ LEUCHTPROGRAMME +++++++++++++++++

void modus1()
{
if ((long)(millis() - lWaitMillis) >= 0)
{
static byte heat[NUM_LEDS];
for (int i = 0; i < NUM_LEDS; i++) heat = qsub8(heat, random8(0, ((55 * 10) / NUM_LEDS) + 2));
* for (int k = NUM_LEDS - 1; k >= 2; k--) heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2]) / 3;*

* if (random8() < 120) {*
* int y = random8(7);*
* heat[y] = qadd8(heat[y], random8(160, 255)); // FARBE*
* }*

* for (int j = 0; j < NUM_LEDS; j++)
_
{_
_
CRGB color = HeatColor(heat[j]);_
_
int pixelnummer;_
_
pixelnummer = j;_
_
leds[pixelnummer] = color;_
_
}_
_
lWaitMillis += 50; // GESCHWINDIGKEIT*_
* }*
* FastLED.show();*
}

void modus2()
{
* fill_solid( leds, NUM_LEDS, CRGB::DarkGreen);
_
FastLED.show();_
_
}*_

void modus3()
{
* fadeToBlackBy( leds, NUM_LEDS, 20);
int pos = beatsin16(40, 0, NUM_LEDS); // ERSTER WERT = GESCHWINDIGKEIT*

* static int prevpos = 0;*
* if ( pos < prevpos ) {*
* fill_solid( leds + pos, (prevpos - pos) + 1, CRGB(255, 255, 255));
_
} else {_
fill_solid( leds + prevpos, (pos - prevpos) + 1, CHSV( gHue, 220, 255));
_
}_
_
prevpos = pos;_
_
FastLED.show();_
_
}*_

void modus4()
{
* static uint8_t numdots = 4; // Number of dots in use.
static uint8_t faderate = 2; // How long should the trails be. Very low value = longer trails.
static uint8_t hueinc = 255 / numdots - 1; // Incremental change in hue between each dot.
static uint8_t thishue = 0; // Starting hue.
static uint8_t curhue = 0; // The current hue*

* static uint8_t thissat = 255; // Saturation of the colour.
static uint8_t thisbright = 255; // How bright should the LED/display be.
static uint8_t basebeat = 5; // Higher = faster movement.*

* static uint8_t lastSecond = 99; // Static variable, means it's only defined once. This is our 'debounce' variable.
uint8_t secondHand = (millis() / 1000) % 30; // IMPORTANT!!! Change '30' to a different value to change duration of the loop.*

* if (lastSecond != secondHand) { // Debounce to make sure we're not repeating an assignment.*
* lastSecond = secondHand;*
* switch (secondHand) {*
* case 0: numdots = 1; basebeat = 20; hueinc = 16; faderate = 2; thishue = 0; break; // You can change values here, one at a time , or altogether.*
* case 10: numdots = 4; basebeat = 10; hueinc = 16; faderate = 8; thishue = 128; break;*
* case 20: numdots = 8; basebeat = 3; hueinc = 0; faderate = 8; thishue = random8(); break; // Only gets called once, and not continuously for the next several seconds. Therefore, no rainbows.*
* case 30: break;*
* }*
* }*

* // Several colored dots, weaving in and out of sync with each other*
* curhue = thishue; // Reset the hue values.*
* fadeToBlackBy(leds, NUM_LEDS, faderate);
_
for ( int i = 0; i < numdots; i++) {_
leds[beatsin16(basebeat + i + numdots, 0, NUM_LEDS)] += CRGB(255,255,255);
_
curhue += hueinc;_
_
}_
_
FastLED.show();_
_
}*_

void modus5()
{
leds[0] = CRGB( 255, 0, 0);
leds[1] = CRGB( 0, 255, 0);
leds[2] = CRGB( 0, 0, 255);

* FastLED.show ();*
}
void modus6()
{

fill_solid( leds, NUM_LEDS, CRGB::Blue);
* FastLED.setBrightness(10);*

* FastLED.show ();*
}

Danke schon mal!
[/quote]

fusinoco:
Hier habe ich aber das Problem, dass diese 2 Ringe verschieden sind. Der eine versteht RGB, der andere dagegen GRB..

Zwei Ringe zwei Pins mit verschiedener COLOR_ORDER wäre mein Ansatz.