设计简介
本设计是直接在图灵哥ESP32S3最小系统核心板上完成的,板子上已经有了WS2812的驱动芯片和RGB灯珠了,因此我们就不用再外接任何设备了,非常方便。
WS2812驱动芯片简介
WS2812是一款集成了控制电路和RGB发光单元的智能外控LED光源,采用单总线通信方式,广泛应用于全彩LED灯带、灯条、模块等产品的生产。WS2812具有以下特点:
- 单线传输:只需一根信号线即可实现数据的接收与传输,简化了电路设计,降低了生产成本;
- 高集成度:WS2812内置了恒流驱动、温度补偿、颜色调光等功能,无需外接其他驱动电路;
- 高亮度:采用高性能的RGB发光单元,发光亮度高,色彩鲜艳;
- 可调光:通过软件设置,可实现256级亮度调节,满足不同场景的需求;
- 高刷新率:支持高达400Hz的刷新率,画面稳定,无闪烁;
- 宽电压范围:输入电压范围在4.5-5.5V,兼容性强,可适用于各类电子产品;
- 灵活性:WS2812灯珠可任意弯曲、裁剪,满足各种复杂场景的安装需求;
- 兼容性:WS2812可与WS2811、WS2813等型号的灯珠兼容,方便升级和维护;
- 节能环保:低功耗设计,符合节能减排的要求;
凭借以上优势,WS2812在全彩LED领域得到了广泛应用,如智能家居、舞台灯光、户外广告、景观照明等场景。随着技术的不断进步,WS2812将为人们的生活带来更多美好光影体验。
WS2812时序特性
WS2812的时序特性是其通信协议的核心,它通过特定的时序来编码数据,从而控制每个LED的颜色和亮度。以下是WS2812的时序特性:
1.数据传输格式
- WS2812使用单线串行通信协议;
- 数据以GRB(绿色、红色、蓝色)的顺序传输,每个颜色通道8位(即一个字节);
2.数据编码
- 数据传输采用NRZ(Non-Return-to-Zero)编码方式;
- 逻辑高(1)和逻辑低(0)通过不同的脉冲宽度来表示;
3.逻辑高(1):逻辑高由一个高电平脉冲组成,持续时间为0.85微秒(±150ns);
4.逻辑低(0):逻辑低由一个高电平脉冲组成,持续时间为0.4微秒(±150ns);
5.复位脉冲:在发送数据之前,需要提供一个低电平的复位脉冲,持续至少50微秒,以初始化LED链;
6.颜色数据传输:
- 每个颜色通道的数据从最高位(MSB)开始传输;
- 在每个颜色通道的数据传输完毕后,WS2812会自动将数据锁存并显示;
7.刷新率:WS2812支持高达400Hz的刷新率,这意味着每秒可以更新颜色数据400次;
8.数据传输率:数据传输速率大约为800kbps(千比特每秒);
9.数据传输顺序:数据从第一个WS2812开始,依次通过每个LED的DI(数据输入)引脚传输到下一个LED,直到链中的最后一个LED;
10.级联能力:WS2812具有级联能力,可以连接多个LED,但总长度受限于数据传输速率和信号完整性。
程序设计
实验目的:学习GPIO作为输出的使用,驱动芯片ws2812,点亮RGB灯,实现炫彩效果;
硬件资源及引脚分配:LED --> IO48;
实验现象:RGB灯将实现红色、绿色、蓝色、红色,循环显示的效果;
注意事项:编译代码之前先下载库文件<Adafruit_NeoPixel.h>,
1 点击工具---管理库;
2 在筛选搜索结果中 输入 Adafruit_NeoPixel ;
3 选择 Adafruit NeoPixel by Adafruit 库安装;
代码文件如下
led_rgb.ino
/**
******************************************************************************
* @file 01_led_rgb.ino
* @author Turringer software group
* @version V1.0
* @date 2024-09-20
* @brief RGB灯炫彩实验
******************************************************************************
*
* 实验平台:图灵哥 TRGESP32S3核心板
* 实验目的:学习GPIO作为输出的使用,驱动芯片ws2812,点亮RGB灯,实现炫彩效果
*
* 硬件资源及引脚分配:
* 1, LED --> ESP32S3 IO
* LED --> IO48
*
* 实验现象:
* 1, RGB灯将实现红色、绿色、蓝色、红色,循环显示的效果
*
* 注意事项:
* 编译代码之前先下载库文件<Adafruit_NeoPixel.h>
******************************************************************************
*/
#include "led_rgb.h"
/**
* @brief 当程序开始执行时,将调用setup()函数,通常用来初始化变量、函数等
* @param 无
* @retval 无
*/
void setup()
{
led_init();
}
/**
* @brief 循环函数,通常放程序的主体或者需要不断刷新的语句
* @param 无
* @retval 无
*/
void loop()
{
led_flash();
}
led_rgb.cpp
/**
****************************************************************************************************
* @file led_rgb.cpp
* @author charles
* @version V1.0
* @date 2024-09-20
* @brief RGB灯炫彩实验
******************************************************************************
*
* 实验平台:图灵哥 TRGESP32S3核心板
* 实验目的:学习GPIO作为输出的使用,驱动芯片ws2812,点亮RGB灯,实现炫彩效果
*
* 硬件资源及引脚分配:
* 1, LED --> ESP32S3 IO
* LED --> IO48
*
* 实验现象:
* 1, RGB灯将实现红色、绿色、蓝色、红色,循环显示的效果
*
* 注意事项:
* 编译代码之前先下载库文件<Adafruit_NeoPixel.h>
*
******************************************************************************
*/
#include "led_rgb.h"
/**
* @brief 初始化LED相关IO口
* @param 无
* @retval 无
*/
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
void led_init(void)
{
delay(500);
strip.begin(); // 初始化灯带
strip.show(); // 所有LED灯关闭
}
void led_flash()
{
int i;
for (i = 0; i < NUM_LEDS; i++)
{
strip.setPixelColor(i, 20, 0, 0); // 设置颜色为红色
strip.show(); // 展示颜色
delay(50); // 50毫秒的延迟
}
for (i = 0; i < NUM_LEDS; i++)
{
strip.setPixelColor(i, 0, 20, 0); // 设置颜色为绿色
strip.show(); // 展示颜色
delay(50); // 50毫秒的延迟
}
for (i = 0; i < NUM_LEDS; i++)
{
strip.setPixelColor(i, 0, 0, 20); // 设置颜色为蓝色
strip.show(); // 展示颜色
delay(50); // 50毫秒的延迟
}
}
rgb_led.h
#include <Adafruit_NeoPixel.h>
/**
****************************************************************************************************
* @file led_rgb.h
* @author charles
* @version V1.0
* @date 2024-09-20
* @brief RGB灯炫彩实验
******************************************************************************
* 实验平台:图灵哥 TRGESP32S3核心板
* 实验目的:学习GPIO作为输出的使用,驱动芯片ws2812,点亮RGB灯,实现炫彩效果
*
* 硬件资源及引脚分配:
* 1, LED --> ESP32S3 IO
* LED --> IO48
*
* 实验现象:
* 1, RGB灯将实现红色、绿色、蓝色、红色,循环显示的效果
*
* 注意事项:
* 编译代码之前先下载库文件<Adafruit_NeoPixel.h>
*
******************************************************************************
*/
#ifndef __LED_H
#define __LED_H
#include "Adafruit_NeoPixel.h"
#define PIN 48 // 控制灯带的引脚
#define NUM_LEDS 1 // 灯带上灯的数量
void led_init(void);
void led_flash(void);
#endif
实验效果如下
实验到此结束,感谢观看。