 FastLED (WS2812B) - Fading in a sequence, one LED at a time

Hi all. I'm trying to get a WS2812B LED strip to fade in a sequence of LEDs, but fade in just one at a time and overlapping timing, if possible. I can get the LEDs to turn on in sequence and I can get them all to fade in and out at the same time, but I can't figure out how to combine the two.

Here's the current code I'm working with. The problem is that they fade in incrementally in sequence. What I mean is that they'll all sequentially get set to x brightness, then they'll all get set to x+1, then all to x+2, etc. I don't mind that on the fade out, but it's the fade in that's problematic. What am I doing wrong? Thanks in advance.

#include <FastLED.h>
#define LED_PIN     3
#define NUM_LEDS    7
CRGB leds[NUM_LEDS];

int brightness = 0;

void setup() {
}

void loop() {

// reverse the direction of the fading at the ends of the fade:
if(brightness == 0 || brightness == 255)
{
}

for(int i=0;i<1;i++){
leds[i] = CRGB(0x006400);
FastLED.show();
delay(100);
}

for(int i=1;i<2;i++){
leds[i] = CRGB(0x006400);
FastLED.show();
delay(100);
}

for(int i=2;i<3;i++){
leds[i] = CRGB(0x006400);
FastLED.show();
delay(100);
}

for(int i=3;i<4;i++){
leds[i] = CRGB(0x006400);
FastLED.show();
delay(100);
}

for(int i=4;i<5;i++){
leds[i] = CRGB(0xFF0000);
FastLED.show();
delay(100);
}

for(int i=5;i<6;i++){
leds[i] = CRGB(0xFF0000);
FastLED.show();
delay(100);
}

for(int i=6;i<7;i++){
leds[i] = CRGB(0xFFD700);
FastLED.show();
delay(100);
}

}

what are the for loops for? you have only 1 valid index in there...

it's the same as if you were doing

void loop() {

// reverse the direction of the fading at the ends of the fade:
if (brightness == 0 || brightness == 255)  fadeAmount = -fadeAmount ;

for(int i=0;i<7;i++){
leds[i] = CRGB(0x006400);
FastLED.show();
delay(100);
}
}

You could use an HSV representation of your color and fade in or out by changing the V.

PS/
(you code works because 255 can be divided by 15, instead of testing for equality you should test for > or < and of course not go beyond 255 or negative)

Hi @majhi

RV mineirin

#include <FastLED.h>
#define LED_PIN     3
#define NUM_LEDS    7
CRGB leds[NUM_LEDS];
int Steps = 16;
int fadeAmount = -(256 / Steps); // 256 / Steps
int brightness = 0;
byte factor = 0;
int myTime  = 70;
int myTime2  = 50;
//----------------------------------------------------------------------------------
void LEDcontrol(int i) {
for (int j = 0; j < Steps; j++)
{
if (i == 0 or i == 1 or i == 2 or i == 3) leds[i] = CRGB(0x006400);
if (i == 4 or i == 5) leds[i] = CRGB(0xFF0000);
if (i == 6)  leds[i] = CRGB(0xFFD700);
if (i > 6)   leds[i] = CRGB(0xFFD700);
FastLED.show();
delay(myTime);
}
}
//----------------------------------------------------------------------------------
void setup() {
}
//----------------------------------------------------------------------------------
void loop() {

for (int i = 0; i < NUM_LEDS; i++)
{
brightness = factor;
LEDcontrol(i);
delay(myTime2);
}
factor = factor ^ 0xFF ;
}
1 Like

@ruilviana That works perfectly, thank you!! I have a couple questions regarding your code so I can learn from this. What does "byte factor" do? Also I see that brightness (int) will be equal to factor (byte) in loop. What sets an int and byte apart in storing a value?

Hi
The factor variable resets the brightness value to 0 or 255,