效果就是两边向中间过渡,值得当成一种效果.
/// @file RGBSetDemo.ino
/// @brief Demonstrates how to create an LED group with CRGBArray
/// @example RGBSetDemo.ino
#include <FastLED.h>
#define NUM_LEDS 100
CRGBArray<NUM_LEDS> leds;
void setup() { FastLED.addLeds<WS2812B, 2, RGB>(leds, NUM_LEDS); }
void loop(){
static uint8_t hue;
for(int i = 0; i < NUM_LEDS/2; i++) {
// fade everything out
leds.fadeToBlackBy(40);
// let's set an led value
leds[i] = CHSV(hue++,255,255);
// now, let's first 20 leds to the top 20 leds,
leds(NUM_LEDS/2,NUM_LEDS-1) = leds(NUM_LEDS/2 - 1 ,0);
FastLED.delay(33);
}
}
这个代码示例展示了如何使用FastLED库中的CRGBArray类来创建和操作一组LED。该代码的主要作用是在一个100个LED的阵列上创建一个动态的颜色变化效果,并使用CRGBArray类提供的功能来处理部分LED的操作。
代码解析
- 头文件与LED阵列定义
#include <FastLED.h>
#define NUM_LEDS 100
CRGBArray<NUM_LEDS> leds;
FastLED.h:引入FastLED库,用于控制LED灯带。
NUM_LEDS:定义LED的数量为100。
CRGBArray<NUM_LEDS> leds:创建一个CRGBArray类型的对象leds,这个对象包含100个CRGB类型的LED(每个LED都有红、绿、蓝三个颜色通道)。
2. setup函数
void setup() {
FastLED.addLeds<WS2812B, 2, RGB>(leds, NUM_LEDS);
}
FastLED.addLeds<WS2812B, 2, RGB>(leds, NUM_LEDS):配置FastLED库,使其使用WS2812B类型的LED灯带,数据引脚为2,颜色顺序为RGB,并初始化leds数组。
3. loop函数
void loop(){
static uint8_t hue;
for(int i = 0; i < NUM_LEDS/2; i++) {
// fade everything out
leds.fadeToBlackBy(40);
// let's set an led value
leds[i] = CHSV(hue++,255,255);
// now, let's first 20 leds to the top 20 leds,
leds(NUM_LEDS/2,NUM_LEDS-1) = leds(NUM_LEDS/2 - 1 ,0);
FastLED.delay(33);
}
}
3.1 状态变量与循环
static uint8_t hue:定义一个静态变量hue,用于生成不同的颜色。由于是static类型,所以它的值在每次调用loop函数时不会重置。
for循环:这个循环控制了效果的产生过程,循环次数为NUM_LEDS / 2,即50次,代表每次操作前50个LED。
3.2 逐步执行的操作
淡化当前颜色
leds.fadeToBlackBy(40);
这行代码会将LED数组中的所有LED颜色淡化,淡化程度由参数40决定。这个函数使颜色逐渐变暗,生成一种动态的颜色尾迹效果。
设置LED颜色
leds[i] = CHSV(hue++, 255, 255);
使用HSV颜色模型生成一个新的颜色值,并赋给第i个LED。hue++使得颜色在每次循环时变化,饱和度和亮度都设置为最大值255。
复制部分LED数组
leds(NUM_LEDS/2,NUM_LEDS-1) = leds(NUM_LEDS/2 - 1, 0);
这一行代码使用CRGBArray提供的operator()函数,将前50个LED的颜色值复制到后50个LED上,但顺序是倒序的。例如,第1个LED的颜色会复制到第100个LED上,第2个LED的颜色复制到第99个LED上,依此类推。
延迟控制
FastLED.delay(33);
每次循环延迟33毫秒,以控制动画的速度,使效果平滑。
代码的效果
这个代码实现了一个渐变色的动画效果。前50个LED的颜色会从一个初始值逐渐过渡到另一种颜色,并且在LED阵列的后50个LED上镜像显示。由于颜色的不断变化和淡化效果,整个LED阵列呈现出一种流动的色彩波浪效果。
总结
这个示例演示了如何利用FastLED库的CRGBArray类来简化LED阵列的操作,同时生成复杂的动画效果。代码中的颜色变化和数组部分复制操作,结合fadeToBlackBy函数,使得整个效果具有很强的视觉动感,非常适合用于LED装置的动态光效展示。