Last updated on August 31, 2024
I might be dating myself, but I loved the way old Mac’s in my high school’s computer lab would pulse the LED when the unit was in standby mode. While I love how easy ESPHome makes it possible to make a wild variety of custom applications, smoothly pulsing an LED isn’t one of them.
I did some searching and found a good write up by SparkFun that walked you through a way of achieving it. Basically, you can leverage the sin function’s smooth output and appropriately scale/offset that output to drive your LED output.
Making it happen
The code below is running on my dining room switch as a lighting effect on a single pixel of WS2812. I’ve included some comments to help understand some of the pieces and how you can tailor it for your application.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
light: - platform: fastled_clockless chipset: WS2812B pin: GPIO2 num_leds: 1 rgb_order: GRB name: "${friendly_name} LED" id: status_led effects: - lambda: name: Pulse RED // SPEED update_interval: .05s lambda: |- static float in = 0; static float out = 0; // Scale sin output from -1/1 to 0/1 out = sin(in) * 0.5 + 0.5; auto call = id(status_led).turn_on(); call.set_transition_length(100); // COLOR + BRIGHTNESS call.set_rgb(1.0, 0.0, 0.0); call.set_brightness(out); // Do not publish state to eliminate flooding of logs call.set_publish(false); call.set_save(false); call.perform(); // RESOLUTION in += 0.314; if (in > 6.283) in = 0; |
- Speed
- Change the update_interval to .15s to slow down the pulsing loop
- Color & Brightness
- Change the 1.0, 0.0, 0.0 to R, G, B color values (0-1.0) to set color and brightness
- Resolution
- Change the step size of the pulse loop
The pulsing glory
Here’s what it looks like in action:

Be First to Comment