深入解析:【普中ESP32S3开发攻略--基于Arduino】-- 第 15 章 RGB彩灯实验
(1)实验平台:
普中ESP32S3开发板
https://item.taobao.com/item.htm?id=803002165011(2)资料下载:普中科技-各型号产品资料下载链接
本章来学习使用 Arduino 控制 WS2812B RGB 彩灯,实现任意颜色显示。本章分为如下几部分内容:
15.1 实验介绍
15.1.1 实验简介
WS2812B 是一款智能控制 LED 光源,控制电路和 RGB 芯片集成在一个5050组件的封装中。内部包括智能数字端口数据锁存器和信号整形放大驱动电路。其管脚图如下:

可将多个 RGB 灯珠级联,市面上的 RGB 彩灯带也是这样级联的,如下所示:

这样 ESP32 只需要通过 1 个 GPIO 口就可以控制数十上百的灯珠。注意:级联的灯珠越多,所需电流就越大,如果数量很多的情况,建议外接5V 电源,然后与开发板共 GND 即可。
我们知道颜色是由最基本的三种颜色的不同亮度混合出新颜色。这3 个最基本的颜色顺序分别是红,绿,蓝(RGB)。这里每个颜色的亮度级别从0-255,0表示没有,255 表示最亮。如(255,0,0)则表示红色最亮。GPIO 口就是将这些数据逐一发送给 WS2812B RGB 彩灯。
15.1.2 实验目的
使用 ESP32 控制 RGB 彩灯循环变化颜色。
15.1.3 Arduino 函数使用
WS2812B 是一种常用的 RGB 灯,在 Arduino IDE 平台,可在库管理器中搜索其对应的驱动包,可通过搜索“Adafruit_NeoPixel”安装。如下:

也可以通过我们下载好的.ZIP 固件包离线安装,具体方法如下:
在软件中选择"项目"-->"导入库"-->"添加.ZIP 库...",将工程路径下"Adafruit_NeoPixel-1.11.0.zip"安装即可。有关驱动包常见的几种安装方式,前面我们也介绍过。
在使 Adafruit NeoPixel Library 用配置 WS2812 的时候首先需要实例化一个 Adafruit_NeoPixel 类,例如:
/*
参数 1 WS2812 的数量
参数 2 Arduino 引脚号(WS2812 DI 口与 Arduino 相连的引脚号)
参数 3 像素类型标志,根据需要一起添加:
NEO_KHZ800 800 KHz 比特流 (大部分的 NeoPixel 产品,如w/WS2812 LEDs)
NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)NEO_GRB GRB顺序的像素流方式(大部分 NeoPixel 产品)
NEO_RGB RGB 顺序的像素流方式 (v1 FLORA pixels, not v2)
NEO_RGBW RGBW 顺序的像素流方式 (NeoPixel RGBW products)
*/
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
实例化完成后需要通过 Adafruit_NeoPixel 类中的begin()方法完成类的初始化操作。例如:pixels.begin();。
下面简单介绍一下 Adafruit_NeoPixel 类中常用的一些方法。
15.1.3.1 clear()函数
用 0 填充整个像素条,即关闭所有 WS2812 灯珠。函数原型:
void clear(void)
15.1.3.2 Color()函数
设置 RGB 的值,从 0,0,0 到 255,255,255。返回的是32 位压缩RGB 值,然后可以将其分配给 a 变量,供以后使用或传递给 setPixelColor()函数。函数原型:
uint32_t Color(uint8_t r, uint8_t g, uint8_t b)
15.1.3.3 setPixelColor()函数
使用 32 位“打包”RGB 或 RGBW 值设置像素的颜色。n 为像素索引,从0开始。c 为 32 位的颜色值。函数原型:
void setPixelColor(uint16_t n, uint32_t c)
15.1.3.4 fill()函数
使用一种颜色填充新像素条的全部或部分。c 为 32 位的颜色值。first 为要填充的第一个像素的第一个索引,从 0 开始,如果未指定,则默认从0 索引开始。count 为要填充的像素数,为正值。当是 0 或未指定将填充到条形图的末尾。函数原型:
void fill(uint32_t c, uint16_t first, uint16_t count)
15.1.3.5 begin()函数
配置 WS1280 输入引脚(即对应单片机的引脚)。函数原型:
void begin(void)
15.1.3.6 show()函数
将 RAM 中的像素数据传输到新像素。(注:在大多数体系结构中,中断是暂时禁用的以便实现正确的新像素信号定时。这意味着 Arduino millis()和micros()函数,它们需要中断时,会丢失一小段时间间隔函数被调用(大约每30微秒一 RGB 像素,每 40 微秒一 RGBW 像素)。)函数原型:
void show(void)
15.1.3.7 ColorHSV()函数
将色调、饱和度和亮度转换为压缩的 32 位 RGB 颜色,可将该函数返回值传递给 setPixelColor()或其他与 rgb 作为输入的函数。hue,色调,为一个无符号的 16 位值,从 0 到 65535,表示一个完整色轮的回路;sat 为饱和度,8 位值,范围为 0 到 255,默认值为 255;val,亮度,8 位值,0 到255(最大或全亮度)。如果未指定,默认值为 255。函数原型:
uint32_t ColorHSV(uint16_t hue, uint8_t sat, uint8_t val)
15.2 硬件设计
本实验使用到硬件资源如下:
(1)RGB 彩灯
(2)ESP32 GPIO
RGB 彩灯电路如下:

由图可知,J5 端子的 WS_DQ 脚为 RGB 彩灯控制口,可将该引脚与ESP32的GPIO 连接。
15.3 软件设计
下面我们打开“\4--实验程序\1--Arduino 实验\1--基础实验\13-RGB 彩灯实验”程序,控制代码在 main.ino 中,代码如下:
/* 深圳市普中科技有限公司(PRECHIN 普中)
* 在线视频:https://space.bilibili.com/2146492485/video
技术支持:www.prechin.net
*
* 实验名称:RGB彩灯实验
*
* 接线说明:RGB彩灯模块-->ESP32 IO
* WS-->(16)
*
* 实验现象:程序下载成功后,RGB彩灯循环变化颜色
*
* 注意事项:需要在软件中选择"项目"-->"导入库"-->"添加.ZIP库...",将工程路径下"Adafruit_NeoPixel-1.11.0.zip"安装即可。
*
*/
#include "public.h"
#include
// 设置灯珠数量
#define NUMPIXELS 1
// 设置输出数据引脚
#define PIN_NEOPIXEL 16
// 初始化灯珠控制实例
Adafruit_NeoPixel pixels(NUMPIXELS, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800);
// 启动设置
void setup() {
// 调试串口速率设置
Serial.begin(115200);
// 灯珠控制开始
pixels.begin();
// 设置亮度为255
pixels.setBrightness(255);
//将RGB设置为0
pixels.clear();
}
u8 r_value=0;
u8 g_value=0;
u8 b_value=0;
u8 dir=0;
// 循环主体程序
void loop() {
if(dir==0)
{
r_value++;
if(r_value>=255)
{
r_value=0;
dir=1;
}
}
else if(dir==1)
{
g_value++;
if(g_value>=255)
{
g_value=0;
dir=2;
}
}
else if(dir==2)
{
b_value++;
if(b_value>=255)
{
b_value=0;
dir=0;
}
}
//设置颜色
pixels.setPixelColor(0, pixels.Color(r_value,g_value,b_value));
/*=======================================
全部点亮用该函数
pixels.fill(pixels.Color(c1,c2,c3));
=======================================*/
delay(10);//延时,改变速度
// 显示
pixels.show();
}
15.4 实验现象
下载程序前,按照如下接线:

将程序下载到开发板内(可参考“2.2.3 程序下载运行”章节),实验现象:RGB 彩灯循环变换各种颜色。
浙公网安备 33010602011771号