Go Down

Topic: WS2812B falsche Farben (Read 1 time) previous topic - next topic

Thorsten4171

Quote
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.
Quote
Leitungslänge were
auch>10cm.
Reicht dann auch für meine Zwecke sollte nämlich >100cm heißen

Godel

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!

uwefed

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;"
https://www.pololu.com/file/0J1233/sk6812_datasheet.pdf

Ich kann leider nicht vorbeikommen; es regnet gerade.  ;)  ;)
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

fusinoco

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.

Quote
#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!

agmue

#19
Jun 11, 2020, 12:39 am Last Edit: Jun 11, 2020, 09:58 am by agmue
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.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

MiReu

Ich würde einen dritten Ring kaufen, der zu einem der anderen passt, und zwei Projekte daraus machen ;-)

Gruß

MiReu
Wer nix macht, macht nix falsch, lernt aber auch nix.

fusinoco

Zwei Ringe zwei Pins wäre mein Ansatz.

Danke, dass ist auch keine schlechte Idee.

Also ein Daten Pin für den kleinen Ring, und einen für den großen..

Nur, ist es dann nicht so, dass ich dem Programm dennoch sagen soll, welche Anzahl Pixel er hier mit welcher Datenleitung betreut? Oder wie funktioniert das... wenn die Animation läuft, muss das ja nen "weichen" Übergang haben..

agmue

#22
Jun 11, 2020, 10:00 am Last Edit: Jun 11, 2020, 10:01 am by agmue
Ich hatte meinen Beitrag in dieser Sekunde editiert um den Parameter COLOR_ORDER.

Code: [Select]
FastLED.addLeds<LED_TYPE,DATA_PIN,COLOR_ORDER>(leds, NUM_LEDS)

Das Beispiel MultipleStripsInOneArray.ino könnte für Dich interessant sein.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

postmaster-ino

Hi

Wenn man für jede LED die Color-Order anpassen kann, wird Das der beste Weg sein.
Sonst wäre mein Weg, Der Farbweitergabe eine Funktion vorzuschalten, Die die Farb-Information für die 'Ausreißer' umbaut und dann die angepasste Farbinformation an den Stripe geschickt wird.

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

Go Up