ws2812b效果研究之九 RGBSetDemo

效果就是两边向中间过渡,值得当成一种效果.

/// @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的操作。

代码解析

  1. 头文件与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装置的动态光效展示。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值