
Originally Posted by
PaulStoffregen
Yes, I would definitely like to get some of those problematic LEDs for testing!
I have some extra reels (240 LEDs per reel) of the ones we just used, which work well. They were purchased from an Aliexpress merchant. How about we swap 240 LEDs?
I still have the original 1920 board. It's been reconfigured as 8 strips of 240. They're the oldest WS2812's (with 6 pins, not the "B" version). They also work great.
I have some "older" WS2812B strips from Adafruit that works just fine, but my "newer" ones flicker. The chips themselves are almost identical, but they do have slight differences in the LED die bonding, at least, so they're definitely different manufacturing runs:
Works fine:

Flickers:

(note the difference in the bottom right pad)
I'll mail you a completely wired up test including 59 LEDs, Teensy, and OctoWS2811 adapter, just to make sure this is super easy for you to reproduce. It's currently running the code below, and you can just power it via USB to see the problem (PC not necessary; you can just use a charger). The brightness is kept low enough that the USB current limit should not be a problem. The flicker is very pronounced because there's a loop that purposely does a lot of CPU stuff while the LEDs are updating.
If you undefine "USE_OCTOWS2811", then StableWS2811 is used instead, and there is no flicker at all.
It might be interesting to hook up your 240 LEDs to this same test code, to see if you get any flicker there.
Code:
#include <OctoWS2811.h>
#include <StableWS2811.h>
/* Define this to 1 to use OctoWS2811 instead of StableWS2811 */
#define USE_OCTOWS2811 1
const int stripLen = 59;
const int config = WS2811_GRB | WS2811_800kHz;
#if defined(USE_OCTOWS2811) && USE_OCTOWS2811 != 0
/* OctoWS2811 */
static DMAMEM int displayBuffer[stripLen * 6];
static int drawBuffer[stripLen * 6];
const int ledStart = stripLen * 2; /* 3rd output */
OctoWS2811 leds(stripLen, displayBuffer, drawBuffer, config);
#else
/* StableWS2811 */
static DMAMEM uint32_t spiBuf[stripLen * 6];
static uint8_t pixelBuf[stripLen * 3];
const int ledStart = 0;
StableWS2811 leds(stripLen, spiBuf, pixelBuf, config);
#endif
void setup() {
leds.begin();
leds.show();
}
elapsedMillis moveElapsed;
int moveLoc = 0;
void loop()
{
if (moveElapsed > 50) {
moveElapsed -= 50;
moveLoc++;
if (moveLoc >= stripLen)
moveLoc = 0;
}
for (int i = 0; i < stripLen; i++)
leds.setPixel(ledStart + i, 0x010101);
/* Red pixel in front, green in middle, blue trailing. These
are kept at a low brightness to keep power usage down, so
that any flickering is more likely to be caused by software
problems. */
leds.setPixel(ledStart + ((moveLoc + 10) % stripLen), 0x110000);
leds.setPixel(ledStart + ((moveLoc + 5) % stripLen), 0x001100);
leds.setPixel(ledStart + ((moveLoc + 0) % stripLen), 0x000011);
leds.show();
/* This loop makes the flicker really bad and super obvious on
OctoWS2811, although it's also present without it; you just
need to look very carefully at the last few LEDs */
static float foo = 1234.45;
while (leds.busy()) {
float m = cos(sin(millis())) + 10;
foo *= m;
foo /= m;
}
}