xiyou2020eeeee 发表于 2024-2-11 19:49

【安信可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]
查看完整版本: 【安信可BW16-Kit】2、SPI驱动8个WS2812B