[WS2812] WS2812 RGB LED 模块的使用

1. WS2812介绍

WS2812是一种可编程的全彩色LED芯片,相比于其它的LED,具有三大优势:

  1. 【一线串口通信】
    通信只需要一个GPIO口即可完成,通过高低电平的持续时间,传递0和1。
  2. 【RGB全彩调节】
    支持RGB从0-255的调节,可以输出 2^24种不同的颜色。
  3. 【级联控制】
    支持多芯片串联。

2. 接线与级联控制原理

VCC——————-5V
GND——————GND
DIN ——————-开发板GPIO口
DOUT—————-下一个WS2812的DIN

单片机通过一线串口向DIN传递3个8位数据(RGB),实现LED的色彩调节。如果想要点亮多个LED,则需要传递多个24位数据,第一个LED会锁存第一个24位数据,余下的数据则向下一颗LED传递,下一颗LED继续锁存余下数据的第一个24位数据并将剩余的数据继续向下传递,以此类推。

[WS2812] WS2812 RGB LED 模块的使用

3. 使用Arduino控制WS2812

在Arduino中,可以直接使用 Adafruit_NeoPixel库实现WS2812的控制。

//NUM: 灯珠数量, PIN:接DIN的口
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUM, PIN, NEO_GRB + NEO_KHZ800);
//i:灯柱序号,Color函数返回32位颜色数值
pixels.setPixelColor(i, strip.Color(r, g, b));
//点亮
pixels.show();
//关闭
pixels.clear();

4. 示例

使用Arduino + WS2812实现彩虹渐变色。

#include <Adafruit_NeoPixel.h>
#include <math.h>

#define PIN 5
#define NUM 12

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM, PIN, NEO_GRB + NEO_KHZ800);

int r = 0;
int g = 0;
int b = 0;

void setup() {
  // put your setup code here, to run once:
  strip.begin();
  Serial.begin(115200);
}

void loop() {

  for (int j = 0; j < 70; j++){
    if (j < 20){
      r = 255;
      g = ceil(255 * 3 * j / 60);
      b = 0;
    }else if(j >= 20 && j < 30){
      r = ceil(750 - j * (250 * 6 / 60));
      g = 255;
      b = 0;
    }else if(j >= 30 && j < 40){
      r = 0;
      g = 255;
      b = ceil(j * (250 * 6 / 60) - 750);
    }else if(j >= 40 && j < 50){
      r = 0;
      g = ceil( 1250 - j * (250 * 6 / 60));
      b = 255;
    }else if(j >= 50 && j < 60){
      r = ceil( 150 * j * (6 / 60) - 750);
      g = 0;
      b = 255;
    }else{
      r = ceil( 150 * j * (6 / 60) - 750);
      g = 0;
      b = ceil( 1750 - j * (250 * 6 / 60));
    }

    for ( int i = 0; i < strip.numPixels(); i++ ){
      strip.setPixelColor(i, strip.Color(r, g, b));
    }
    strip.show();

    delay(100);
  }
  
}

© 版权声明

相关文章

暂无评论

none
暂无评论...