ESP32控制WS2812/11灯带
这个部分中笔者将使用ESP32的RMT功能控制WS2812/11灯带。
什么是WS2812/2811灯带?与5050rgb灯带有何区别
- 不象5050rgb灯带只能同时显示一种颜色,ws2812/2811灯带上的每一个led都能被单独精确控制,显示(8位*3)种颜色。
- WS2812/2811只需一根信号线就能控制灯带上所有led。多个灯带间可以通过串联轻松延长。
- 在30hz的刷新频率下一个信号线能够控制至多500个led。
WS2811芯片 与WS2812led.
WS2811芯片实现了上述功能。WS2812led灯珠为内置了2811芯片的RGB灯珠。
一些灯带用一个WS2811芯片驱动3个普通5050RGB灯珠,而另一些全部使用了集成了芯片的WS2812灯珠。WS2812灯条都为5v供电,芯片驱动版本的灯带有12v供电版本。
WS2812/2811的控制信号
如上所说,WS2812芯片依靠一个信号线控制上百个LED的颜色,这是如何实现的呢?
每个LED的信号有24位,由R,G,B各八位组成。每个数据位的高低由信号引脚的波形决定:
T0H,T0L,T1H,T1L的时间值由具体的芯片决定,具体请参考worldsemi网站的技术手册。
当发送多个led的数据时,每个芯片都会吞掉最前面的24位数据。两个数据帧之间需要间隔280微秒以上。
ESP32输出WS2812控制信号
为了接入wifi,这个项目使用ESP32作为灯带控制器和MQTT网关。笔者使用的是arduino-ide的开发环境(关于如何在arduino-ide或类似环境中开发esp32)。
控制WS2812/11的arduino库有WS2812FX和NeoPixelBus,但是它们都不支持ESP32硬件。好在esp32有内置的RMT库专门用来输出数字波形,并且提供了控制ws2812的范例程序(arduinoIDE-文件-示例-esp32-RMT-RMTWriteNeoPixel)。
//设置led数量,声明rmt对象。
#define NR_OF_LEDS 50
#define NR_OF_ALL_BITS (24*NR_OF_LEDS)
//rmt数据
rmt_data_t led_data[NR_OF_ALL_BITS];
//rmt对象
rmt_obj_t* rmt_send =