深入解析:【普中ESP32S3开发攻略--基于Arduino】-- 第 15 章 RGB彩灯实验

(1)实验平台:

普中ESP32S3开发板https://item.taobao.com/item.htm?id=803002165011(2)资料下载:普中科技-各型号产品资料下载链接


        本章来学习使用 Arduino 控制 WS2812B RGB 彩灯,实现任意颜色显示。本章分为如下几部分内容:

15.1 实验介绍

15.1.1 实验简介

15.1.2 实验目的

15.1.3 Arduino 函数使用

15.1.3.1 clear()函数

15.1.3.2 Color()函数

15.1.3.3 setPixelColor()函数

15.1.3.4 fill()函数

15.1.3.5 begin()函数

15.1.3.6 show()函数

15.1.3.7 ColorHSV()函数

15.2 硬件设计

15.3 软件设计

15.4 实验现象


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 彩灯循环变换各种颜色。

posted @ 2025-08-23 21:52  yjbjingcha  阅读(11)  评论(0)    收藏  举报