FCOB LED Neopixel communication issue after 5m length

Hallo zusammen,

hoffe einer kann mir helfen bei meinem ca. 8,65m langem FCOB LED RGBW LED Streifen. IC WS2814, arbeitet mit 24V. Einspeisung am Anfang und am Ende des Streifens.
Was ich noch nicht ausprobiert habe ist die Einspeisung nach 5m. Macht das einen Unterschied?

Das Problem ist, dass abhängig der Helligkeit, also damit auch der Leistungsaufnahme, einzelne Segmente nicht den korrekten Wert annehmen sondern eher nach Zufall, wodurch das ganze dann flackert. Bei 5m Länge ist das kein Problem.

Ich dachte eigentlich dass das Signal von IC zu IC verstärkt wird, jedoch scheint hier was nicht zu passen. Hat einer eine Idee was das Problem sein könnte?
1000uF hängt zwischen +/-. Vorwiderstand -330Ohm- hängt vor dem DI. Kommunikationsleiter relativ kurz.

Anbei ein Foto und Video von dem Verhalten.

20240129_204943.zip (7.0 MB)


Der Code ist nichts besonderes.

#include <Adafruit_NeoPixel.h>

#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN 6

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
//   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(121, PIN, NEO_RGBW + NEO_KHZ800); //70 entspricht 5m FCOP RGBW

// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel.  Avoid connecting
// on a live circuit...if you must, connect GND first.

// Tasterdefinition
int ButtonOff=46; //Schaltet LED an oder aus
int ButtonSwitch=42; //Leuchtstufen durch

// Fortlaufende Variable
int LEDtoggle=0; //0:OFF; .... Definition siehe Code

void setup() {
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  // End of trinket special code

  strip.begin();
  strip.show(); // Initialize all pixels to 'off'

  Serial.begin(9600);

  pinMode(ButtonOff,INPUT);
  pinMode(ButtonSwitch,INPUT);
}

void loop() {
  
  if (digitalRead(ButtonOff) == HIGH){
    Serial.println("Button OFF pressed");
    colorWipe(strip.Color(0, 0, 0, 0), 15); // LEDs OFF
    LEDtoggle=0;
    delay(300);
    
  }
  if (digitalRead(ButtonSwitch) == HIGH && LEDtoggle == 0){
    Serial.println("Button Switch pressed = 0");
    colorWipe(strip.Color(20, 0, 0, 0), 15); //  Green light
    LEDtoggle = 1;
    delay(300);
  }
  else if (digitalRead(ButtonSwitch) == HIGH && LEDtoggle == 1){
    Serial.println("Button Switch pressed = 1");
    colorWipe(strip.Color(75, 0, 0, 0), 15); // Green
    LEDtoggle = 2;
    delay(300);
  }
    else if (digitalRead(ButtonSwitch) == HIGH && LEDtoggle == 2){
    Serial.println("Button Switch pressed = 2");
    colorWipe(strip.Color(127, 0, 0, 0), 15); // Green
    LEDtoggle = 3;
    delay(300);
  }
    else if (digitalRead(ButtonSwitch) == HIGH && LEDtoggle == 3){
    Serial.println("Button Switch pressed = 3");
    colorWipe(strip.Color(255, 0, 0, 0), 15); // Green
    LEDtoggle = 4;
    delay(300);
  }
  else if (digitalRead(ButtonSwitch) == HIGH && LEDtoggle == 4){
    Serial.println("Button Switch pressed = 4");
    colorWipe(strip.Color(0, 127, 0, 0), 15); // Red light
    LEDtoggle = 5;
    delay(300);  
  }
  else if (digitalRead(ButtonSwitch) == HIGH && LEDtoggle == 5){
    Serial.println("Button Switch pressed = 5");
    colorWipe(strip.Color(0, 255, 0, 0), 15); // Red  
    LEDtoggle = 6;
    delay(300);
  }
  else if (digitalRead(ButtonSwitch) == HIGH && LEDtoggle == 6){
    Serial.println("Button Switch pressed = 6");
    colorWipe(strip.Color(0, 0, 127, 0), 15); // Blue light  
    LEDtoggle = 7;
    delay(300);
  }
  else if (digitalRead(ButtonSwitch) == HIGH && LEDtoggle == 7){
    Serial.println("Button Switch pressed = 7");
    colorWipe(strip.Color(0, 0, 255, 0), 15); // Blue  
    LEDtoggle = 8;
    delay(300);
  }
  else if (digitalRead(ButtonSwitch) == HIGH && LEDtoggle == 8){
    Serial.println("Button Switch pressed = 8");
    colorWipe(strip.Color(0, 0, 0, 127), 15); // White light  
    LEDtoggle = 9;
    delay(300);
  }
  else if (digitalRead(ButtonSwitch) == HIGH && LEDtoggle == 9){
    Serial.println("Button Switch pressed = 9");
    colorWipe(strip.Color(0, 0, 0, 255), 15); // White 
    LEDtoggle = 10;
    delay(300);
  }
  else if (digitalRead(ButtonSwitch) == HIGH && LEDtoggle == 10){
    Serial.println("Button Switch pressed = 10");
    colorWipe(strip.Color(127, 127, 127, 0), 15); // White RGB light  
    LEDtoggle = 11;
    delay(300);
  }
  else if (digitalRead(ButtonSwitch) == HIGH && LEDtoggle == 11){
    Serial.println("Button Switch pressed = 11");
    colorWipe(strip.Color(255, 255, 255, 0), 15); // White RGB  
    LEDtoggle = 12;
    delay(300);
  }
  else if (digitalRead(ButtonSwitch) == HIGH && LEDtoggle == 12){
    Serial.println("Button Switch pressed = 12");
    colorWipe(strip.Color(255, 255, 255, 255), 15); // White Max  
    LEDtoggle = 13;
    delay(300);
  }
  else if (digitalRead(ButtonSwitch) == HIGH && LEDtoggle == 13){
    Serial.println("Button Switch pressed = 13");
    colorWipe(strip.Color(0, 255, 165, 0), 15); // Orange  
    LEDtoggle = 14;
    delay(300);
  }
  else if (digitalRead(ButtonSwitch) == HIGH && LEDtoggle == 14){
    Serial.println("Button Switch pressed = 14");
    colorWipe(strip.Color(0, 255, 215, 0), 25); // Gold  
    LEDtoggle = 0;
    delay(300);
  }    
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}

Das Problem ist die fehlende Zwischeneinspeisung. Über die dünnen Leiterbahnen auf den LED-Streifen fällt zu viel Betriebsspanung ab.

Gruß Tommy

Danke für den Hinweis. Ein wenig tricky war es trotzdem, da ich die Zwischeneinspeisung exakt nach 5m machen musste. Bei einer Zwischeneinspeisung in der Mitte hat es nicht funktioniert.

Würde alle 2m eine Einspeisung machen.
Grüße Uwe

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.