Addressable RGB-LED with more than 8-bit color depth

Hi, I recently bought a bunch of NeoPixels and noticed the color depth is limited to 8-bit (r:255,g:255,b:255). Is this the physically limit of the control circuit or just a software (Arduino-lib) limit?
Sure, 8-bit is not bad, but I'm looking for at least 10-bit if not 16-bit or 24-bit. Searching the web, I haven't found much about RGB-LED color depth, most stick to the NeoPixels (aside from DIY-24-bit solutions).
Happy about suggestions and thanks in advance!

aha, why?

With NeoPixels it's a hardware limitation. I don't know of any addressable LEDs with more bit-depth but that doesn't mean they don't exist. I've seen some with less.

Isn't 24-bit color actually 8 bits each for R/G/B, which is what the addressable LEDs have?

1 Like

Read the datasheet :slight_smile: For the WS2812B: https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf

Really? I highly doubt you found nothing on HTML, CSS, Panatone color. It's everywhere, even the source of this web page has color in the header... all 8-bits.

  --category-1-color: #0088CC;
  --category-6-color: #0088CC;
  --category-184-color: #0088CC;
  --category-18-color: #0088CC;
  --category-80-color: #0088CC;
  --category-81-color: #0088CC;
  --category-19-color: #0088CC;
  --category-20-color: #0088CC;
  --category-21-color: #0088CC;
  --category-59-color: #0088CC;
  --category-22-color: #0088CC;
  --category-23-color: #0088CC;
  --category-24-color: #0088CC;
  --category-25-color: #0088CC;
  --category-26-color: #0088CC;
  --category-27-color: #0088CC;
  --category-58-color: #0088CC;
  --category-28-color: #0088CC;
  --category-7-color: #0088CC;
  --category-88-color: #0088CC;
  --category-90-color: #0088CC;
  --category-29-color: #0088CC;
  --category-31-color: #0088CC;
  --category-30-color: #0088CC;
  --category-32-color: #0088CC;
  --category-33-color: #0088CC;
  --category-34-color: #0088CC;
  --category-35-color: #0088CC;
  --category-36-color: #0088CC;
  --category-12-color: #0088CC;
  --category-91-color: #0088CC;
  --category-183-color: #0088CC;
  --category-168-color: #0088CC;
  --category-172-color: #0088CC;
  --category-173-color: #0088CC;
  --category-174-color: #0088CC;
  --category-193-color: #0088CC;
  --category-175-color: #0088CC;
  --category-176-color: #0088CC;
  --category-177-color: #0088CC;
  --category-178-color: #0088CC;
  --category-87-color: #0088CC;
  --category-166-color: #0088CC;
  --category-157-color: #0088CC;
  --category-190-color: #0088CC;
  --category-158-color: #0088CC;
  --category-195-color: #0088CC;
  --category-159-color: #0088CC;
  --category-160-color: #0088CC;
  --category-165-color: #0088CC;
  --category-79-color: #0088CC;
  --category-150-color: #0088CC;
  --category-137-color: #0088CC;
  --category-147-color: #0088CC;
  --category-140-color: #0088CC;
  --category-142-color: #0088CC;
  --category-145-color: #0088CC;
  --category-156-color: #0088CC;
  --category-146-color: #0088CC;
  --category-161-color: #0088CC;
  --category-162-color: #0088CC;
  --category-69-color: #0088CC;
  --category-139-color: #0088CC;
  --category-84-color: #0088CC;
  --category-83-color: #0088CC;
  --category-148-color: #0088CC;
  --category-149-color: #0088CC;
  --category-151-color: #0088CC;
  --category-153-color: #0088CC;
  --category-154-color: #0088CC;
  --category-63-color: #0088CC;
  --category-77-color: #0088CC;
  --category-74-color: #0088CC;
  --category-64-color: #0088CC;
  --category-65-color: #0088CC;
  --category-66-color: #0088CC;
  --category-76-color: #0088CC;
  --category-70-color: #0088CC;
  --category-167-color: #0088CC;
  --category-169-color: #0088CC;
  --category-170-color: #0088CC;
  --category-171-color: #0088CC;
  --category-180-color: #0088CC;
  --category-179-color: #0088CC;
  --category-182-color: #0088CC;
  --category-191-color: #0088CC;
  --category-185-color: #0088CC;
  --category-188-color: #0088CC;
  --category-189-color: #0088CC;
  --category-194-color: #0088CC;
  --category-164-color: #0088CC;
  --category-93-color: #0088CC;
  --category-134-color: #0088CC;
  --category-152-color: #0088CC;
  --category-141-color: #0088CC;
  --category-144-color: #0088CC;
  --category-89-color: #0088CC;
  --category-86-color: #0088CC;
  --category-187-color: #0088CC;
  --category-9-color: #0088CC;
  --category-17-color: #0088CC;
  --category-40-color: #0088CC;
  --category-41-color: #0088CC;
  --category-42-color: #0088CC;
  --category-43-color: #0088CC;
  --category-44-color: #0088CC;
  --category-45-color: #0088CC;
  --category-46-color: #0088CC;
  --category-138-color: #0088CC;
  --category-8-color: #0088CC;
  --category-37-color: #0088CC;
  --category-38-color: #0088CC;
  --category-39-color: #0088CC;
  --category-10-color: #0088CC;
  --category-75-color: #0088CC;
  --category-47-color: #0088CC;
  --category-48-color: #0088CC;
  --category-126-color: #0088CC;
  --category-127-color: #0088CC;
  --category-163-color: #0088CC;
  --category-129-color: #0088CC;
  --category-121-color: #0088CC;
  --category-122-color: #0088CC;
  --category-128-color: #0088CC;
  --category-49-color: #0088CC;
  --category-123-color: #0088CC;
  --category-124-color: #0088CC;
  --category-125-color: #0088CC;
  --category-62-color: #0088CC;
  --category-50-color: #0088CC;
  --category-133-color: #0088CC;
  --category-130-color: #0088CC;
  --category-132-color: #0088CC;
  --category-131-color: #0088CC;
  --category-61-color: #0088CC;
  --category-51-color: #0088CC;
  --category-82-color: #0088CC;
  --category-52-color: #0088CC;
  --category-11-color: #0088CC;
  --category-53-color: #0088CC;
  --category-94-color: #0088CC;
  --category-95-color: #0088CC;
  --category-96-color: #0088CC;
  --category-97-color: #0088CC;
  --category-98-color: #0088CC;
  --category-99-color: #0088CC;
  --category-54-color: #0088CC;
  --category-100-color: #0088CC;
  --category-101-color: #0088CC;
  --category-102-color: #0088CC;
  --category-103-color: #0088CC;
  --category-55-color: #0088CC;
  --category-110-color: #0088CC;
  --category-111-color: #0088CC;
  --category-112-color: #0088CC;
  --category-113-color: #0088CC;
  --category-114-color: #0088CC;
  --category-56-color: #0088CC;
  --category-104-color: #0088CC;
  --category-105-color: #0088CC;
  --category-106-color: #0088CC;
  --category-107-color: #0088CC;
  --category-108-color: #0088CC;
  --category-109-color: #0088CC;
  --category-57-color: #0088CC;
  --category-115-color: #0088CC;
  --category-116-color: #0088CC;
  --category-117-color: #0088CC;

You can't tell one-bit difference in an 8-bit color, much less 10, 16, or 24.

No. A decision. But the more bits, the more space taken in the limited MPUs. You do understand these have "K"s of memory, not "G"s.

You actually can. I played around with a non-addresable LED strip and the difference between a PWM value of 0 and PWM value of 1 can clearly be observed, the difference between 254 and 255 can't be seen.

No, you can not. Off (0) to on (1) is not a color change but a state change. A value of (1) to (2) is a change in color. I would bet a random intensity change of (1) of a random color (r or g or b) at a random interval could neither be seen nor guessed once in 100 tests, by a human or even an Arduino widget.

I once had a (tested, registered) beyond-normal hearing range (above and below standard range) and I could hear every motion detector, light fixture and circuit board as I slowly went deaf to those frequencies - hastened by full afterburners... so I understand sensitivity.

Test your color sensing. This sketch will "change color" 100 times and stop. You should write the seconds-interval you see the single-bit color change. Compare your results with the serial monitor.

byte pin[] = {3, 5, 6};
int r, g, b, q;

void setup() {
  Serial.begin(115200);
  randomSeed(analogRead(A0));
  r = random(63, 191), g = random(63, 191), b = random(63, 191);

  for (byte i = 0; i < 3; i++) {
    pinMode(pin[i], OUTPUT);
  }
}

void loop() {
  int t = random(5000, 15000) / 1000, c = random(3), s = random(2);
  q++;

  switch (s) { // sign
    case (0): s = -1; break;
    case (1): s = 1; break;
  }

  switch (c) { // color to be changed
    case (0): r += s; break;
    case (1): g += s; break;
    case (2): b += s; break;
  }

  Serial.print("#");
  zeropad(q);
  Serial.print(q);
  Serial.print(" (");

  digitalWrite(6, r);
  digitalWrite(5, g);
  digitalWrite(3, b);

  zeropad(r);
  Serial.print(r);
  Serial.print(".");

  zeropad(g);
  Serial.print(g);
  Serial.print(".");

  zeropad(b);
  Serial.print(b);
  Serial.print(") ");

  zeropad(t);
  Serial.print(t);
  Serial.println("s");
  delay(t * 1000);

  if (q == 100) while (1);
}

void zeropad(int value) {
  if (value < 100) Serial.print("0");
  if (value < 10) Serial.print("0");
}

APA102 LEDs have 9~10 bits per channel:

They have the same 8 bits per channel for r,g,b but have an additional 5-bit overall brightness level channel. This should help them to maintain a wider colour gamut at lower brightness levels, compared to ws2812.

8 bit is fantastic ! since actually that is 24 bit color, which is what you find on your computer screen.

The people at FastLED have come up a with a way to create even more accuracy, but this does go at the expense of processing power. You can use

FastLED.delay()

during which time show() is called repeatedly and if the calculation of the color value / brightness ends up being between 2 values, that will result in the show() producing those to values alternatingly with the duty cycle of them being producing the brightness desired (sorry for the explanation quality, look it up on their page under dithering) Of course it is a blocking function and in a bit-banged method it results in interrupts being turned off all the time (rather unpractical for people that want to use IR to control their leds which meant they would come to the forum for help, here you so some more irrelevant info)

Brightness differences per step can be seen in the lower regions in a dark environment, and more smooth transitions can be achieved with PWM, particularly when you can increase the resolution to something like 14-bit which can easily be done on an ESP, but also on an ATtiny. Still that is a lot of work for something which is already fantastic, 24-bit color !

But not all observers are human.
Some people use LEDs for different purposes than making fancy colors for interior lighting etc. And some of those applications really do require more than 8 bit resolution.

That is really interesting; I never knew about these!

I meant to say per channel, not per pixel! Fixed post above. I suppose it would be more accurate to say they have 29 bits per pixel/LED.

Googling a bit turns up SK9822 which seems to be more readily available and also offers an overall brightness channel.

The only/main drawback of this is that there's a dependency between the channels.

In conclusion, the SK9822 is not an exact clone of the APA102. It adds some interesting features. For example the programmable current source to control global brightness and a non-staggered update. But there are also some drawbacks like the protocol incompatibility and the lower PWM frequency. The incompatibility in the protocol can be worked around by using the unified protocol proposed above.

Very interesting, @PaulRB . So far SK9822 looks like an improved clone of APA102.
Makes you wonder why the WS2812 became so popular, given that technically superior alternatives have been around for quite some time.

A little more rooting around turns up SK9818, which appears to be a 16 bit per channel RGB LED (so 48 bit color depth) that also (on top of that) offers variable current gain setting. But...it appears to be unobtainium...

Well ease of connection (Vcc, data, GND vs Vcc, Clock, data & GND) as well as a significant difference in price.

even a voltage drop can cause a color change more noticeable than the color change caused by changing the color byte by 1

SK9818 also has a single data channel (DI and DO; if you want to count that as two...OK). Price is likely a function of volume for the most part; I don't expect there to be a fundamental difference in manufacturing complexity between these devices.

I suspect it's mostly due to WorldSemi (maker of WS28xx) being better networked than Shenzhen Normand and having more effective marketing & sales. Network externalities do the rest.

Is that an expectation or based on measurement data? I would have expected the CCS in such devices to be fairly stable over the stated operating voltage range. IDK really; just wondering.

OK

Try PWM values 1 and 2 on an 8-bit AVR.

The 8 Bits is not 255 colors but only the intensity level of the specific led color.
Mixing different levels of RGB will result in many colors.

FastLed Library color example.

 /// Cool white (bluer) flourescent light bulbs
    CoolWhiteFluorescent=0xD4EBFF /* 0 K, 212, 235, 255 */,