基于ESP32平台驱动WS2812 RGB灯珠
基于ESP32平台驱动WS2812 RGB灯珠
WS2812
WS2812简介
本文由WS2812B-5050展开
WS2812B-5050是一个集控制电路与发光电路于一体的智能外控LED光源;其外型采用最新的molding封装工艺,将IC与发光芯片封装在一个5050的封装尺寸中,每个元件即为一个像素点;像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和可编程定电流控制部分,有效保证了像素点光的颜色高度一致。下图为我所采用的25位的WS2812B RGB LED开发板。
WS2812驱动说明
有手册可知 WS2812B的供电电压在3.7V~5.3V,一般5V供电就可以了。
时序与实现操作(不同品牌的WS2812B在时序上数据传输时间上会有所区别,但原理都一样,跟着手册走就好)。
WS2812B利用一个组持续时间不同的高低电平形成0码、1码与RES复位码。
- 0码:高电平持续200ns - 380ns后跳变为低电平,低电平持续580ns - 1us;
- 1码:高电平持续580 - 1us后跳变为低电平,低电平持续580ns - 1us;
- Resset码:低电平保持时间大于280us
驱动WS2812B需要纳秒级别的延时,
arduino 的函数delay(xx);
或者Microsecond();
只能实现毫秒或者微秒级别的延时,
所以我们需要使用NOP空填充来写一个延时函数
void Delay_ns(int a)
{
for(int i;i<a;i++)
NOP();
}
不准确 但能使用。
级联与数据结构
驱动级联的WS2812可以通过创建一个二维数组的方式去储存每一个级联级的RGB值,这样就可以实现点亮多个级联的WS2812。
需要注意数据结构,本次用到的WS2812B灯珠的数据结构是GRB,市面上一般还有另外一种为RGB数据结构,具体看手册就好。
区别:
GRB结构的灯珠发送0xFF0000显示的是绿色;
RGB结构的灯珠发送0xFF0000显示的是红色。
驱动
ESP-23 | WS2812B |
---|---|
5V | VCC |
GND | GND |
D4 | Din |
控制引脚和灯珠数量可直接在.ino文件中更改
#define DataPin 4 //控制引脚
#define Num 8 //灯珠数量
主程序
#include "My-WS2812.h"
#define DataPin 4
#define Num 8
#define BL_Color 0x000000 //关---清空颜色
#define W_Color 0xFFFFFF //白光
#define R_Color 0xFF0000 //红色
#define G_Color 0x00FF00 //绿色
#define B_Color 0x0000FF //蓝色
WS2812 ws2812(DataPin);
void setup() {
// put your setup code here, to run once:
Init();
}
void loop() {
// put your main code here, to run repeatedly:
binlk(BL_Color); //关闭灯光
delay(500);
binlk(W_Color); //白光
delay(500);
binlk(R_Color); //红光
delay(500);
binlk(G_Color); //绿光
delay(500);
binlk(B_Color); //蓝光
delay(500);
runLight (R_Color,G_Color,B_Color); //跑马灯
delay(500);
}
效果展示
넶0
2022-06-10 18:23