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。