# Help with PWM, ATTINY85, WS2812 NeoPixels

Hi everyone,
I am trying to minimize power requirements for about 1 meter (30 leds/m) length of Led strip (WS2812). I am planning to use 3 AAA batteries to power ATTiny85 and the strip (5v).

I came across this article (https://learn.adafruit.com/sipping-power-with-neopixels/insights#strategy-tone-down-the-brightness-2378053-9)that advises on toning down the brightness through PWM. Now I am totally lost with this, tried to look around but could only find some turorials/help for single LEDs or RGB leds (not addressable ones).
Then there is this demo code where the comments say 50% duty cycle, but I am pulling my hair now trying to understand how was that 50% cycle achieved?

Can someone please explain how in the code below, in the function mode_white_half_duty() , 50% duty cycle was achieved just by passing a color value which is different than mode_white_max(), and then the mode_white_half_perceptual() function claims to be even less than 50% of duty cycle, but how?

I guess what I really want to know is, how to calculate those color values for a specific color that will result in different duty cycles? For example, if I have and RGB color value, how can I convert that into a 50% duty cycle value, if it makes any sense?

``````// All NeoPixels on at max: white (R+G+B) at 100% duty cycle
void mode_white_max() {
for(uint8_t i=0; i<10; i++) {
CircuitPlayground.strip.setPixelColor(i, 0xFFFFFF);
}
}

// All NeoPixels on at 50% duty cycle white.  Numerically speaking,
// this is half power, but perceptually it appears brighter than 50%.
void mode_white_half_duty() {
for(uint8_t i=0; i<10; i++) {
CircuitPlayground.strip.setPixelColor(i, 0x7F7F7F);
}
}

// All NeoPixels on at 50% perceptial brightness, using gamma table lookup.
// Though it visually appears to be about half brightness, numerically the
// duty cycle is much less, a bit under 20% -- meaning "half brightness"
// can actually be using 1/5 the power!
void mode_white_half_perceptual() {
uint32_t c = pgm_read_byte(&gammaTable[127]) * 0x010101;
for(uint8_t i=0; i<10; i++) {
CircuitPlayground.strip.setPixelColor(i, c);
}
}
``````

I understand the gamma correction and the function used to do this, but I fail to understand is that if just doing that will result in different duty cycle? can I control the percentage? Any help will be appreciated. Thanks.

As you can see, they set the PWM duty cycle to 50%… 0x7F (127 dec)…
No magic or sorcery, just wind back the brightness.

Thank you but I am still confused. So does that mean this concept only applies to white color? What if I have this color: #eb3434? how would I go about calculating the ‘half’ duty cycle for this? Would I just divide the each RGB color value by 2? Sorry my understanding of colors is probably as poor as my understanding of pwm and electornics

Yes. Or you could use .setBrightness(127).

Thanks for clarifying this for me. Much appreciated.

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