01 ESP-S3开发RGBLED(WS2812B)

ESP32-S3——基于FastLED库对RGBLED学习

RGB-LED手册(WS2812B)

(本文章主要讲述的是使用VScode+PlatformIO工具对ESP32-S3进行开发学习的过程。)文章主要讲述了ESP32S3调用FastLED库控制RGB-LED灯。实现对RGB-LED灯颜色、亮度的控制和对FastLED库中相关的API函数讲解。(有什么问题欢迎各位指点!!!!)

参考资料:

fastLED库函数介绍-CSDN博客                                                                              FastLED库

ESP8266开发(2)——fastled库安装与常用方法-CSDN博客                               FastLED库

https://atta.szlcsc.com/upload/public/pdf/source/20240218/0A543D5B6E29349CD5645F8D0B5E6915.pdf                                                                                                                                WS2812B手册

        RGB-LED灯和普通的LED灯的区别是:1、普通的LED灯两端只要存在超过死区的压差就可以使它点亮,比如正极接3.3V负极接GND那么LED就可以被点亮。但是RGB-LED不行,RGB-LED如果直接给控制引脚高电平的话,是看不见任何效果。原因就在于灯珠内部采用单线级联横流IC。如果想要点亮RGB-LED灯是需要遵守它的规则。2、普通的LED灯一个只能有一个颜色,而RGB-LED一个可以有256级灰度调节,也就是说可以实现256种颜色。

        打开WS2812B手册,可以看见RGB-LED灯是单线数据传输,可以无限级联的。也就是说市面上常用的RGB灯带是可以用这个来完成的。往下翻可以找到芯片级联方法可以看下硬件是怎么连接的,至于如何控制许多灯珠, FastLED库已经帮我们集成好了。只需要调用合适的API函数即可。

        接下来看数据结构,可以看见要实现对RGB-LED灯的控制是需要在一个周期内发送24bit数据。如图所示:

其中8bit表示绿色,8bit表示红色,8bit表示蓝色(三原色)。可以通过控制三原色的比例从而实现显示256种颜色。

    在这里1bit不是常用的‘0’或者‘1’,而是0码、1码和RST码。手册中可以看到对这三个码的定义如图所示:

其中0码的高电平就是单码周期内0.28us高电平,0码的低电平就是单码周期内1.72us高电平。1码的高电平就是单码周期内0.9us高电平,1码的低电平就是单码周期内1.10us高电平。单码的周期T是大于2.0us一个。每次控制需要发送24个码也就是每个周期为24*2us=48us。截至目前,WS2812B手册上的内容就需要注意这些,接下开始使用软件。

FastLED库添加

打开VScode中的PlatformIO创建一个文件(默认各位安装好VScode和PlatformIO)。因为本文中使用到了FastLED库,所以在PlatformIO中需要我们手动添加这个库,操作如下图所示:

点击添加后需要等一段时间(具体时间没测试过,反正等就完事了,喝点水上个厕所回来就好了)。添加完成后咋们就可以在如图所示的地方看见FastLED库。

到这一步就证明库已经添加完成了,至于库是否能使用,下一步就是写代码然后实际测试看是否能够正确的控制RGB-LED灯。

控制程序编写

参考电路图如图所示:

参考代码如下:

到目前为止,已经基本实现了对RGB-LED灯的控制(颜色和亮度的控制)。

FastLED库中API

参考文章链接:

https://blog.csdn.net/acktomas/article/details/114634985

1、FastLED.addLeds<WS2812,LED_PIN,GRB>(leds , NUM_LEDS)

 初始化LED控制光带

        WS2812:控制灯珠的类型

        LED_PIN:控制板上使用的IO端

        GRB:色彩类型

        leds:光带

        NUM_LEDS:灯珠的总数量

        GRB色彩类型有6类。分别是  (选择RGB给的颜色顺序就是RGB)

        RGB=0012,          //红绿蓝

        RBG=0021,           //红蓝绿

        GRB=0102,          //绿红蓝

        GBR=0120,           //绿蓝红

        BRG=0201,           //蓝红绿

        BGR=0210            //蓝绿红 

2、FastLED.show();   刷新灯的色彩显示

3、FastLED.clear(); 将所有灯熄灭

4、FastLED.setBrightness(30); 设置灯带亮度,最大为255,范围为0~255

5、fill_solid(leds, 30, CRGB::Red); 将leds灯带的从头数前30个灯珠设置为红色。

        Leds:光带

        30:从起始位置开始算的数量

        CRGB::Red 设置的颜色

6、fill_rainbow(leds, 30, beginHue, deltaHue); 将leds光带从头数30个灯珠设置为渐变彩虹色。

Leds:光带

   30:从起始位置开始算的数量

   beginHue:彩虹色的其实色调值,最大为255

    deltaHue:相邻灯珠的色调差,最大为255

PS:

fill_rainbow(leds+5, 30, beginHue, deltaHue)

设置leds光带从头数第6个光珠到后面的30个光珠颜色的彩虹色。

7、fill_gradient_RGB(leds, 0, CRGB::Red, 29, CRGB::Blue)

将leds光带的从头数30个灯珠设置为渐变色,由红色开始渐变最后以蓝色结束。

   Leds:光带

    0   :开始的灯珠编号。

    CRGB::Red:开始的颜色。

    29  :最后一个灯珠的编号。

   CRGB::Blue:结束的颜色。

PS:

fill_gradient_RGB(leds,0,CHSV(50,255,255),29,CHSV(150,255,255),SHORTEST_HUES)

    leds灯带从0开始数30个灯珠设置为渐变色,颜色由CHSV(50,255,255)开始到CHSV(150,255,255)结束,灯带颜色过度采用短色调过渡方式。

fill_gradient(leds, 0, CHSV(50, 255,255) , 29, CHSV(150,255,255), LONGEST_HUES)

    leds灯带从0开始数30个灯珠设置为渐变色,颜色由CHSV(50, 255,255)开始到CHSV(150,255,255)颜色结束,灯带颜色过度采用长色调过度方式。

PS:

    SHORTEST_HUES:采用短色过渡方式,两个颜色值之间最短的颜色过渡。

    LONGEST_HUES:采用长色过渡方式,两个颜色值之间最长的颜色过渡。

    采用SHORTEST_HUES和LONGEST_HUES的时候必须采用CHVS方式填色。

8、fill_palee(leds,30,0,8,OceanColors_p,255, LINEARBLEND)

Leds光带从头开始数30个灯珠设置为渐变色。渐变色的色彩全部来自于FastLED预设色板OceanColors_p

Leds:灯带

   30:从起始位置开始算的数量

    0 :灯带头部第一个灯珠的色板色彩序号

    8 :相邻两个灯珠见色色彩需要相差8个

    OceanColors_p:预设色板

    255:亮度最高255

    LINEARBLEND:线性过渡效果

PS:

预设色板有:CloudColors_p、LavaColors_p、OceanColors_p、ForestColors_p、RainbowColors_p、RainbowStripeColors_p、PartyColors_p、HeatColors_p

9、ColorFromPalette( RainbowColors_p, 0, 128, LINEARBLEND)

ColorFromPalette函数返回指定色板中的颜色,可以将ColorFromPalette的返回值设置LED色彩。

RainbowColors_p:色彩板

0 :颜色序号

128:亮度

LINEARBLEND:线性渐变

有返回值,返回值直接给leds[i],给leds光带中某个灯设置颜色

   leds[0] = ColorFromPalette( RainbowColors_p, 0, 128, LINEARBLEND);

leds光带第一个灯珠设置为RainbowColors_p色板中序号为0的颜色(红色),亮度为128,色彩过度为线性效果。

10、fadeToBlackBy(leds, NUM_LEDS, 128)

   fadeToBlackBy函数将逐渐熄灭LED光带。

   fadeToBlackBy(leds, NUM_LEDS, 128); // 128/255 = 50%

   光带leds的NUM_LEDS多个灯珠亮度设置为128。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值