46959浏览
查看: 46959|回复: 0

[ESP8266/ESP32] 【Beetle ESP32-C3试用】使用Arduino编程控制WS2812B炫彩LED

[复制链接]
在网上有很多关于WS2812B的资料,介绍了各种控制WS2812B的方法。
而在DFRobot Beetle ESP32-C3的Arduino编程中,得益于Arduino IDE强大的扩展功能,我们可以用第三方的扩展库,来很方便的控制WS2812B。
在这个分享中,使用的是Adafruit_NeoPixel,关于其详细资料,可以查看官方页面:Adafruit NeoPixel Library

WS2812B炫彩LED可以很灵活的组成各种实际所需要的形状,如条带状、环形、点阵,单颗也可以使用。
我这次所使用的,是一块8*8点阵的WS2812B炫彩LED点阵板:
【Beetle ESP32-C3试用】使用Arduino编程控制WS2812B炫彩LED图1


背面结构如下:
【Beetle ESP32-C3试用】使用Arduino编程控制WS2812B炫彩LED图2


WS2812B炫彩LED很神奇,不管是1颗LED的控制,还是上千颗LED的控制,都只需要1根数据线即可,也就是上面板子背面的DIN。
多块这样的单体,还能够连接起来,前者的DOUT,连接到后者的DIN。实际上,相邻的两颗之间,也是这么连接的。


这款8*8的点阵板,每一颗灯珠都是可以单独控制的,所以有先后顺序,按照下面的顺序进行控制。
【Beetle ESP32-C3试用】使用Arduino编程控制WS2812B炫彩LED图3


通过1根线,发送控制数据给WS2812B,需要较高的数据发送速度,所以通常使用SPI接口发送。
查看DFRobot Beetle ESP32-C3的官方资料,了解引脚的具体定义情况:
【Beetle ESP32-C3试用】使用Arduino编程控制WS2812B炫彩LED图4


通过上图,可以了解到,D6可复用为SPI的MOSI,用于发送数据,因此,可以将该引脚与WS2812B点阵板的DIN连接。

另外,WS2812B的工作电压为5V,而每个红色、绿色和蓝色LED需要大约20mA,或者在全亮度下每个LED总共60mA,如果8*8共64颗灯珠都点到最亮,那将需要60*64=3840A的电流,这样严重超过DFRobot Beetle ESP32-C3的输出电流,产生不可预料的结果。因为 DFRobot Beetle ESP32-C3 的最大输出电流为500 mA。
所以,使用WS2812B的时候,如果是单颗的,使用开发板自身供电,没有问题。如果使用多颗,则一定要使用专门的外接电源。
在我的这个实例中,我使用了一个USB2TTL的电源引脚,来为WS2812B点阵供电。

最终,具体的连线如下:
【Beetle ESP32-C3试用】使用Arduino编程控制WS2812B炫彩LED图5


做好以上连线后,就可以使用Arduino IDE进行编程了。
在具体编程之前,需要现在Arduino IDE中安装Adafruit NeoPixel。
在Arduino IDE的库管理界面中,搜索Adafruit NeoPixel并安装如图所示的扩展库即可:
【Beetle ESP32-C3试用】使用Arduino编程控制WS2812B炫彩LED图6


在了解了 Adafruit NeoPixel 的具体使用后,编写如下的程序:
代码文件:下载附件ESP32_NeoPixel_WS2812B.zip

代码展示:
【Beetle ESP32-C3试用】使用Arduino编程控制WS2812B炫彩LED图7


编写好代码,按照以下参数设置,编译下载,就能看到效果:
【Beetle ESP32-C3试用】使用Arduino编程控制WS2812B炫彩LED图8


在上述代码中,包含了如下三个部分的内容:
串口调试信息输出:使用较为简单,不详细说明,可以自己查看Arduino资料了解
控制板载LED:端口为D10,根据idx奇偶点亮或者熄灭
Adafruit NeoPixel 控制WS2812B

Adafruit NeoPixel 部分的重点如下:
1. 初始化控制实例:
  1. Adafruit_NeoPixel pixels(NUMPIXELS, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800)
复制代码
传入的参数为LED灯珠数,控制引脚,以及信息传输的频率(不用修改)。
8*8的点阵,灯珠数为64各。
根据前面了解DFRobot Beetle ESP32-C3的资料和连线,控制引脚为D6

2. 开始控制:
  1. pixels.begin();
复制代码

3. 设置亮度:
  1. pixels.setBrightness(20);
复制代码
最大值为255,也就是0xff,表示最亮。

4. 设置全部灯珠的颜色:
  1. pixels.fill(0x000000);
复制代码
直接使用6位16进制数,每两位控制一个颜色,分别为RGB。
当使用0x000000时,表示没有颜色,也就是熄灭;
当使用0xFF0000是,表示红色R最亮。
此处的fill,表示控制所有的灯珠,而不是控制单个。

5. 清除当前灯珠颜色设置:
  1. pixels.clear();
复制代码


6. 设置单颗灯珠的颜色:
  1. pixels.setPixelColor(idx, pixels.Color(0, 0, 0));
复制代码
idx表示第几颗灯珠,从0开始;因为是8*8的点阵,所以最大值为63
而pixels.Color,分别则设置RGB三种颜色,最大为255,也就是0xff。

7. 让灯珠真正显示生效:
  1. pixels.show();
复制代码


代码的整体逻辑结构,也相对比较简单,就是每次循环,先熄灭上一颗灯珠,然后点亮当前指向的灯珠,颜色使用了一定的随机。
显示完成后,指向下一颗灯珠;如果达到了最大值,则从0重新开始。

下载完成后,打开串口,也可以看到输出的调试信息:
【Beetle ESP32-C3试用】使用Arduino编程控制WS2812B炫彩LED图9


具体的呈现效果,如视频所示:点击查看

如果你还会一些数学函数的话,那么可以用数学函数,生成心形图案的坐标,对照到8*8点阵上,那么就能在情人节,给你最心爱的Ta,表达心意了。当然,如果不会没关系,可以提前用纸对着8*8点阵,描绘心形图案,记录下对应的LED灯珠的位置,在点亮对应的灯珠也是可以的。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail