This arduino library can fade individual LEDs in the background without blocking your main program.
Instead of using a for loop and delay
to fade an LED from one PWM value to another -- which will block all other processes -- this will check the time each loop cycle to see if the value should be adjusted.
For example, to fade from 0 - 200 in 1 second, it would increment the PWM value by 1 every 50 milliseconds -- without stopping your program while it waits. There are also other optimizations to make the animations smooth and accurate without eating too many chip resources.
Move the arduino-LEDFader folder into the arduino library directory and rename it from arduino-LEDFader
to LEDFader
.
Then in your sketch you just need to add this to the top of your file:
#include <LEDFader.h>
Fade an LED on pin 3 up in 3 seconds.
#include <LEDFader.h>
// Create new LED Fader on pin 3
LEDFader led = LEDFader(3);
void setup() {
// Fade from 0 - 1023 in 3 seconds
led.fade(1023, 3000);
}
void loop() {
// Need to call update each loop cycle to adjust the PWM if needed
led.update();
}
Building on that example, we can alternate by fading up and down
#include <LEDFader.h>
// Create new LED Fader on pin 3
LEDFader led = LEDFader(3);
void setup() {
led.fade(1023, 3000);
}
void loop() {
led.update();
if (led.is_fading() == false) {
// Fade from 255 - 0
if (led.get_value() == 1023) {
led.fade(0, 3000);
}
// Fade from 0 - 255
else {
led.fade(1023, 3000);
}
}
}
This example will fade 6 LEDs, all to random PWM values and durations. You could, instead, replace 6 LEDs with 2 RGB LEDs.
#include <LEDFader.h>
#define LED_NUM 6
// 6 LEDs (perhaps 2 RGB LEDs)
LEDFader leds[LED_NUM] = {
LEDFader(3),
LEDFader(5),
LEDFader(6),
LEDFader(9),
LEDFader(10),
LEDFader(11)
};
void setup() {
}
void loop() {
// Update all LEDs and start new fades if any are done
for (byte i = 0; i < LED_NUM; i++) {
LEDFader *led = &leds[i];
led->update();
// Set new fade
if (led->is_fading() == false) {
int duration = random(1000, 3000); // between 1 - 3 seconds
// Up
if (led->get_value() == 0) {
byte color = random(100, 1023);
led.fade(color, duration);
}
// Down
else {
led.fade(0, duration);
}
}
}
}