The diode test on my multimeter provides sufficient voltage to light up the any of the diodes in an ordinary RGB LED, but it only recognises the red one as a diode (due to lower forward-voltage for the red). Of course you'd have to try each way around as you can't be sure if it would be common-cathode or common-anode. But, from the sound of it, it is probably not an ordinary RGB LED - that was always going to be a long shot.
Unfortunately I don't think you have eliminated all the possibilities. For similar LEDs where the makers do provide full information, they often give the minimum logic level "1" voltage as 0.7 times the LED supply voltage, and 0.7 times 5 is 3.5V so straight away there you would be out of spec. You might get away with that, but maybe you won't. To be sure you'd have to do level conversion on the data line. You could try running the LED on 4.5V instead of 5V (so that the threshold to read the data as "1" is reduced), and see if that makes any difference. Going below 4.5V would be taking the supply voltage "out of spec" for the PL9823 and again you might get away with that, and you might not).
Did you add a decoupling capacitor on the LED supply as recommended?
If Fastled is known to work, maybe there is a problem with the timing too. I looked at Fastled, and for PL9823 they have used the exact values as specified in that datasheet that I found.
That is:
zero bit = 350ns high, followed by 1360ns low, and
one bit = 1360ns high, followed by 350ns low.
I tested Fastled on a 16MHz Arduino Nano, and they get pretty close to those values (376/1376 and 1376/350 respectively). Of course, I don't have one of those LEDs to see if it really works.
To properly add a new LED type to the Adafruit library would be quite a chore, but for a test you could just change the timing for say the existing 800kHz LEDs (and only for STM32, you don't have to do it for all the other processors/boards that they support). If you want to try that, look for this in Adafruit_NeoPixel.cpp:
Code: Select all
#elif defined(ARDUINO_ARCH_STM32) || defined(ARDUINO_ARCH_ARDUINO_CORE_STM32)
uint8_t *p = pixels, *end = p + numBytes, pix = *p++, mask = 0x80;
uint32_t cyc;
uint32_t saveLoad = SysTick->LOAD, saveVal = SysTick->VAL;
#if defined(NEO_KHZ400) // 800 KHz check needed only if 400 KHz support enabled
if (is800KHz) {
#endif
uint32_t top = (F_CPU / 800000); // 1.25µs
uint32_t t0 = top - (F_CPU / 2500000); // 0.4µs
uint32_t t1 = top - (F_CPU / 1250000); // 0.8µs
...
It is the last three lines there that need to change. The timing there is what they aim for obviously, the actual times they achieve can be a bit different, but hopefully are close enough for a start (I've done some tests on a few different STM32 processors).
What STM32 processor are you using?