【安信可BW16-Kit】2、SPI驱动8个WS2812B
# 【安信可BW16-Kit】2、SPI驱动8个WS2812B## 1、WS2812概述
WS2812是一种数字可控LED灯珠,也被称为Neopixel。它由三个颜色的LED(红、绿、蓝)和一个集成的控制电路组成。WS2812通常以表面贴装的方式制造,具有小尺寸、低功耗和高亮度的特点。WS2812特点
* 小尺寸:WS2812的尺寸通常为5mm x 5mm,非常小巧,适合于各种紧凑的应用场景。
* 低功耗:WS2812的功耗非常低,通常在0.3W左右,非常节能。
* 高亮度:WS2812的亮度非常高,通常可以达到120流明以上。
* 数字可控:WS2812可以通过单线串行通信控制每个灯珠的颜色和亮度,非常灵活。
WS2812应用:WS2812广泛应用于各种LED灯带、装饰灯、彩灯等应用场景。同时,由于其小尺寸和低功耗,也可以应用于穿戴设备、智能家居等领域。
WS2812控制:WS2812的控制采用了一种特殊的时序通信协议,称为WS2812B协议。这种协议通过发送特定格式的数据来控制灯光的颜色和亮度。
WS2812B协议的基本数据格式如下:
```
0 <------ 24bit RGB数据 ------> 1
```
其中,0和1分别代表协议的起始位和结束位,24bit RGB数据代表灯珠的颜色和亮度信息。WS2812B协议的通信速率通常为800Kbps,每个数据位由一个高电平和一个低电平组成,高电平的持续时间为0.7μs,低电平的持续时间为0.35μs。
WS2812连接:WS2812通常以串联的方式连接,即每个灯珠的输出端连接到下一个灯珠的输入端。这种连接方式可以形成一个灯带或灯条,实现更丰富的灯光效果。
WS2812的电源和数据线通常通过一个三针插头连接,插头的引脚定义如下:
* VCC:电源正极
* GND:电源负极
* DIN:数据输入
WS2812是一种灵活、高亮度、低功耗的数字可控LED灯珠,具有广泛的应用前景。通过了解WS2812的特点、应用、控制和注意事项,可以更好地使用WS2812来实现各种创意的灯光效果。
## 2、连线
## 3、程序解读
```
#include "WS2812B.h" // 引入WS2812B LED灯带的库文件。
#define NUM_OF_LEDS 8 // 定义连接的LED灯珠数量为8。
uint32_t rgbhue; // 定义一个用于存储颜色值的变量(未在程序中直接使用)。
WS2812B led(SPI_MOSI, NUM_OF_LEDS); // 创建WS2812B对象,指定数据信号线连接的引脚(使用SPI的MOSI引脚)和LED的数量。
void setup() {
Serial.begin(115200); // 初始化串口通信,波特率设置为115200。
Serial.println("WS2812B test"); // 通过串口打印测试信息。
led.begin(); // 初始化LED灯带。
}
void loop() {
// 下面三个调用逐个点亮LED为红、绿、蓝色,每个颜色的显示时间间隔为50ms。
colorWipe(50, 0, 0, 50); // 红色擦除效果。
colorWipe(0, 50, 0, 50); // 绿色擦除效果。
colorWipe(0, 0, 50, 50); // 蓝色擦除效果。
// 以下调用创建追逐效果,不同颜色的追逐,每次间隔50ms。
theaterChase(0, 50, 50, 50); // 青色追逐效果。
theaterChase(50, 0, 50, 50); // 紫色追逐效果。
theaterChase(50, 50, 0, 50); // 黄色追逐效果。
rainbow(20); // 彩虹效果,每次更新间隔20ms。
theaterChaseRainbow(50); // 彩虹追逐效果,每次更新间隔50ms。
}
void colorWipe(uint8_t rColor, uint8_t gColor, uint8_t bColor, uint8_t wait) {
// 逐个点亮LED到指定颜色,之后有短暂延迟。
for (uint16_t i = 0; i < NUM_OF_LEDS; i++) {
led.setPixelColor(i, rColor, gColor, bColor); // 设置特定LED的颜色。
led.show(); // 更新LED灯带的显示。
delay(wait); // 等待一段时间。
}
}
void rainbow(uint8_t wait) {
// 创建一个彩虹效果,通过改变颜色的'Hue'值。
for(long firstPixelHue = 0; firstPixelHue < 3*65536; firstPixelHue += 256) {
led.rainbow(firstPixelHue); // 设置彩虹效果的起始颜色。
led.show(); // 更新LED灯带的显示。
delay(wait); // 等待一段时间。
}
}
void theaterChase(uint8_t rColor, uint8_t gColor, uint8_t bColor, uint8_t wait) {
// 创建一个追逐效果,每三个灯中点亮一个,然后移动。
for (uint8_t a = 0; a < 10; a++) { // 总共迭代10次。
for(uint8_t b = 0; b < 3; b++) { // 每次移动一步。
led.clear(); // 清除LED灯带的当前显示。
for(uint8_t c = b; c < NUM_OF_LEDS; c += 3) {
led.setPixelColor(c, rColor, gColor, bColor); // 设置特定LED的颜色。
}
led.show(); // 更新LED灯带的显示。
delay(wait); // 等待一段时间。
}
}
}
void theaterChaseRainbow(uint8_t wait) {
// 创建一个彩虹追逐效果。
int firstPixelHue = 0; // 彩虹的起始颜色'Hue'值。
for(int a = 0; a < 30; a++) { // 总共迭代30次。
for(int b = 0; b < 3; b++) {
led.clear(); // 清除LED灯带的当前显示。
for(int c = b; c < NUM_OF_LEDS; c += 3) {
int hue = firstPixelHue + c * 65536L / NUM_OF_LEDS; // 计算每个LED的'Hue'值。
uint32_t color = led.colorHSV(hue, 255, 255); // 根据'Hue'值生成颜色。
// 提取RGB分量。
uint8_t r = (color & 0x00FF0000) >> 16;
uint8_t g = (color & 0x0000FF00) >> 8;
uint8_t b = (color & 0x000000FF);
led.setPixelColor(c, r, g, b); // 设置特定LED的颜色。
}
led.show(); // 更新LED灯带的显示。
delay(wait); // 等待一段时间。
firstPixelHue += 65536 / 90; // 更新起始'Hue'值,使颜色在迭代中逐渐变化。
}
}
}
```
## 4、效果
de5a0c9815f4e8eb930c4bc53f427ea4<br/>
页:
[1]