SK6812 and Arduino uno with NeoPixel flickering strip

So I bought a BTF lighting SK6812 strip, I can get the strip to light up but as soon as I try to send commands to the strip it starts flickering. As I am new to this stuff I have no real clue whats going on here and wheter I am dealing with bad code or a bad LED strip.
I am not new to programming, I make video games for a living so the C/C++ code is not what I think is wrong, I included it here just so you can see.

// A basic everyday NeoPixel strip test program.

// NEOPIXEL BEST PRACTICES for most reliable operation:
// - Add 1000 uF CAPACITOR between NeoPixel strip's + and - connections.
// - MINIMIZE WIRING LENGTH between microcontroller board and first pixel.
// - NeoPixel strip's DATA-IN should pass through a 300-500 OHM RESISTOR.
// - AVOID connecting NeoPixels on a LIVE CIRCUIT. If you must, ALWAYS
//   connect GROUND (-) first, then +, then data.
// - When using a 3.3V microcontroller with a 5V-powered NeoPixel strip,
//   a LOGIC-LEVEL CONVERTER on the data line is STRONGLY RECOMMENDED.
// (Skipping these may work OK on your workbench but can fail in the field)

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1:
#define LED_PIN   6

// How many NeoPixels are attached to the Arduino?
#define LED_COUNT 119

// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRBW + NEO_KHZ800);
// Argument 1 = Number of pixels in NeoPixel strip
// Argument 2 = Arduino pin number (most are valid)
// Argument 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)


// setup() function -- runs once at startup --------------------------------

void setup() {
  // These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
  // Any other board, you can remove this part (but no harm leaving it):
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif
  // END of Trinket-specific code.
 
  strip.begin();           // INITIALIZE NeoPixel strip object (REQUIRED)
  strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
  noInterrupts();
  strip.show();            // Turn OFF all pixels ASAP
  interrupts();
  
  
}


// loop() function -- runs repeatedly as long as board is on ---------------
bool setRed = true;
void loop() {
  // Fill along the length of the strip in various colors...
  //strip.clear();
if (!setRed)
{
  strip.clear();
    for(int i=0; i<strip.numPixels(); i++) 
    {
      // For each pixel in strip...
      strip.setPixelColor(i, 255, 0, 0, 0);         //red pixels only
    }

    noInterrupts();
    strip.show();
    interrupts();

    delay(1000);
}
    

    
    setRed = false;
  //colorWipe(strip.Color(255,   0,   0, 0), 50); // Red
  //colorWipe(strip.Color(  0, 255,   0), 500); // Green
  //colorWipe(strip.Color(  0,   0, 255), 500); // Blue

  // Do a theater marquee effect in various colors...
  //theaterChase(strip.Color(127, 127, 127), 500); // White, half brightness
  //theaterChase(strip.Color(127,   0,   0), 500); // Red, half brightness
  //theaterChase(strip.Color(  0,   0, 127), 500); // Blue, half brightness

  //rainbow(10);             // Flowing rainbow cycle along the whole strip
  //delay(500);
  //theaterChaseRainbow(50); // Rainbow-enhanced theaterChase variant
}


// Some functions of our own for creating animated effects -----------------

// Fill strip pixels one after another with a color. Strip is NOT cleared
// first; anything there will be covered pixel by pixel. Pass in color
// (as a single 'packed' 32-bit value, which you can get by calling
// strip.Color(red, green, blue) as shown in the loop() function above),
// and a delay time (in milliseconds) between pixels.
void colorWipe(uint32_t color, int wait) {
  for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
    strip.setPixelColor(i, color);         //  Set pixel's color (in RAM)
    strip.show();                          //  Update strip to match
    delay(wait);                           //  Pause for a moment
  }
}

// Theater-marquee-style chasing lights. Pass in a color (32-bit value,
// a la strip.Color(r,g,b) as mentioned above), and a delay time (in ms)
// between frames.
void theaterChase(uint32_t color, int wait) {
  for(int a=0; a<10; a++) {  // Repeat 10 times...
    for(int b=0; b<3; b++) { //  'b' counts from 0 to 2...
      strip.clear();         //   Set all pixels in RAM to 0 (off)
      // 'c' counts up from 'b' to end of strip in steps of 3...
      for(int c=b; c<strip.numPixels(); c += 3) {
        strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
      }
      strip.show(); // Update strip with new contents
      delay(wait);  // Pause for a moment
    }
  }
}

// Rainbow cycle along whole strip. Pass delay time (in ms) between frames.
void rainbow(int wait) {
  // Hue of first pixel runs 5 complete loops through the color wheel.
  // Color wheel has a range of 65536 but it's OK if we roll over, so
  // just count from 0 to 5*65536. Adding 256 to firstPixelHue each time
  // means we'll make 5*65536/256 = 1280 passes through this loop:
  for(long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 256) {
    // strip.rainbow() can take a single argument (first pixel hue) or
    // optionally a few extras: number of rainbow repetitions (default 1),
    // saturation and value (brightness) (both 0-255, similar to the
    // ColorHSV() function, default 255), and a true/false flag for whether
    // to apply gamma correction to provide 'truer' colors (default true).
    strip.rainbow(firstPixelHue);
    // Above line is equivalent to:
    // strip.rainbow(firstPixelHue, 1, 255, 255, true);
    strip.show(); // Update strip with new contents
    delay(wait);  // Pause for a moment
  }
}

// Rainbow-enhanced theater marquee. Pass delay time (in ms) between frames.
void theaterChaseRainbow(int wait) {
  int firstPixelHue = 0;     // First pixel starts at red (hue 0)
  for(int a=0; a<30; a++) {  // Repeat 30 times...
    for(int b=0; b<3; b++) { //  'b' counts from 0 to 2...
      strip.clear();         //   Set all pixels in RAM to 0 (off)
      // 'c' counts up from 'b' to end of strip in increments of 3...
      for(int c=b; c<strip.numPixels(); c += 3) {
        // hue of pixel 'c' is offset by an amount to make one full
        // revolution of the color wheel (range 65536) along the length
        // of the strip (strip.numPixels() steps):
        int      hue   = firstPixelHue + c * 65536L / strip.numPixels();
        uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB
        strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
      }
      strip.show();                // Update strip with new contents
      delay(wait);                 // Pause for a moment
      firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames
    }
  }
}

As you can see this code is mostly based off the strand test that comes with the NeoPixel library.
I tried the test script but what you get is puke, it lights up all LEDs but its just random lights and colors.
So I tried modifying the code a bit and only make it light up in a single color. However the result I get is: Microsoft OneDrive - Access files anywhere. Create docs with free Office Online.

This feels like a timing issue to me so thats the reason I am trying to turn the interrupts off during writing to the strip itself.

I could use some help here because I have no idea whats going wrong here.

I have actually looked at the NeoPixel show() methode but since I have no clue which defines are active its really hard to know which asm code path is actually taken.

Thanks

Are you powering both the strip and the Arduino from an adequately rated 5 V regulated power supply? I can't quite see it or the data and ground connections in your video.

The arduino is powered form a USB connection and the LED strip from a 5V 12A power supply.

I think I figured it out when I added the ground between the arduino and the external power supply it lit up in the color I expected. Thanks

OK, now note that the ground and data signal must always travel as a pair from the Arduino to the strip.

Noting that you are using a UNO - a Nano is of course more practical for a complete project - when you are no longer connecting to the PC via USB, you power it with 5 V coming back from the start of the LED strip to the "5V" pin, again together as a bundle with the data and ground.

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