前言
- 本文主要介绍WS2812B彩灯实验,主要内容有:
- 1、介绍WS2812B及灯环,灯环由32个彩灯组成;
- 2、灯环显示三基色;
- 3、顺时针、逆时针的彩色流水灯;
- 4、彩虹灯环,循环显示赤橙黄绿青蓝紫七色。
一、WS2812B及灯环
1、WS2812B简介
-
(1)基本组成:
-
WS2812B是一款智能控制LED光源,控制电路和RGB芯片集成在一个5050个组件的封装中。内部包括智能数字端口数据锁存器和信号整形放大驱动电路。还包括一个精密的内部振荡器和一个12V电压可编程恒流控制部分,有效地保证像素点光的颜色高度一致。
-
(2)通信方式:
-
数据传输协议采用单一NZR通信方式(单总线)。像素上电复位后,DIN端口接收控制器的数据,第一个像素采集初始的24位数据,然后发送给内部数据锁存器,另一个由内部信号整形放大电路整形的数据通过DO端口发送给下一个级联像素。每个像素传输后,信号减少24位。像素采用自动整形传输技术,使得像素级联数不受信号传输的限制,只依赖于信号传输的速度。
-
(3)优点:
-
WS2812B具有驱动电压低、环保节能、亮度高、散射角大、一致性好、功耗低、寿命长等优点。集成在LED上的控制芯片电路更加简单,体积小,安装方便。
-
(4)机械尺寸:
-
(5)管脚说明:
2、灯环介绍
- (1)本文采用的RGB灯环是自制灯环,由32个WS2812彩灯组成,电路原理图如下:
- (2)灯环说明:
- ① 32个WS2812按(1)串联后组成灯环,外接引脚三个:VCC_5V0、GND、DIN。
- ② 灯环的DIN是第1颗灯珠的信号输入引脚DIN,灯环的DOUT是第32颗灯珠的信号输入引脚DOUT,DOUT悬空不接。
二、彩色流水灯实验
1、三基色流水灯
-
(1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。
-
(2)三基色流水灯的电路图,如下图所示:
-
(3)实验准备:安装下载安装 “Adafruit_NeoPixel” 库文件。
-
(4)实现功能:三基色流水灯,第一圈红色,第二圈绿色,第三圈蓝色,第四圈红色,循环显示。
代码实现:
//WS2812,RGB灯环
//炫彩流水灯,第一圈红色,第二圈绿色,第三圈蓝色,第四圈红色,循环显示
#include <Adafruit_NeoPixel.h>
#define PIN 7 // 控制灯带的引脚
#define NUM_LEDS 32 // 灯带上灯的数量
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
strip.begin(); // 初始化灯带
strip.show(); // 所有LED灯关闭
}
void loop() {
for (int i = 0; i < NUM_LEDS; i++)
{
strip.setPixelColor(i, 20, 0, 0); // 设置颜色为红色
strip.show(); // 展示颜色
delay(50); // 50毫秒的延迟
}
for (int i = 0; i < NUM_LEDS; i++)
{
strip.setPixelColor(i, 0, 20, 0); // 设置颜色为绿色
strip.show(); // 展示颜色
delay(50); // 50毫秒的延迟
}
for (int i = 0; i < NUM_LEDS; i++)
{
strip.setPixelColor(i, 0, 0, 20); // 设置颜色为蓝色
strip.show(); // 展示颜色
delay(50); // 50毫秒的延迟
}
}
- (5)实现现象(部分展示):
2、彩色流水灯(顺时针、逆时针)
-
(1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。
-
(2)彩色流水灯(顺时针、逆时针)的电路图,如下图所示:
-
(3)实验准备:下载安装 “FastLED” 库文件。
-
(4)实现功能:炫彩流水灯,先是6圈顺时针彩色流水灯,再是6圈逆时针的彩色流水灯,最后重复操作,6圈顺时针、6圈逆时针彩色流水灯效果。
代码实现:
//WS2812,RGB灯环
//炫彩流水灯,顺时针、逆时针的彩色流水灯
#include <FastLED.h>
#define LED_PIN 7
#define NUM_LEDS 32
CRGB leds[NUM_LEDS];
void setup()
{
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
FastLED.setMaxPowerInVoltsAndMilliamps(5, 500);
FastLED.clear();
FastLED.show();
}
void loop()
{
//深色,红色→绿色,顺时针
for (int i = 0; i < NUM_LEDS; i++ )
{
leds[i] = CRGB(255 - 7 * i, 7 * i, 0 );
FastLED.setBrightness(20);
FastLED.show();
delay (50);
}
//深色,绿色→蓝色,顺时针
for (int i = 0; i < NUM_LEDS; i++ )
{
leds[i] = CRGB(0, 255 - 7 * i, 7 * i );
FastLED.setBrightness(20);
FastLED.show();
delay (50);
}
//深色,蓝色→红色,顺时针
for (int i = 0; i < NUM_LEDS; i++ )
{
leds[i] = CRGB(7 * i, 0, 255 - 7 * i );
FastLED.setBrightness(20);
FastLED.show();
delay (50);
}
//浅色,红色→绿色,顺时针
for (int i = 0; i < NUM_LEDS; i++ )
{
leds[i] = CRGB(255 - 7 * i, 7 * i, 255);
FastLED.setBrightness(20);
FastLED.show();
delay (50);
}
//浅色,绿色→蓝色,顺时针
for (int i = 0; i < NUM_LEDS; i++ )
{
leds[i] = CRGB(255, 255 - 7 * i, 7 * i);
FastLED.setBrightness(20);
FastLED.show();
delay (50);
}
//浅色,蓝色→红色,顺时针
for (int i = 0; i < NUM_LEDS; i++ )
{
leds[i] = CRGB(7 * i, 255, 255 - 7 * i);
FastLED.setBrightness(20);
FastLED.show();
delay (50);
}
//深色,红色→蓝色,逆时针
for (int i = NUM_LEDS; i > 0; i-- )
{
leds[i] = CRGB(255 - 7 * i, 0, 7 * i );
FastLED.setBrightness(20);
FastLED.show();
delay (50);
}
//深色,蓝色→绿色,逆时针
for (int i = NUM_LEDS; i > 0; i-- )
{
leds[i] = CRGB(0, 7 * i, 255 - 7 * i );
FastLED.setBrightness(20);
FastLED.show();
delay (50);
}
//深色,绿色→红色,逆时针
for (int i = NUM_LEDS; i > 0; i-- )
{
leds[i] = CRGB(7 * i , 255 - 7 * i, 0);
FastLED.setBrightness(20);
FastLED.show();
delay (50);
}
//浅色,红色→蓝色,逆时针
for (int i = NUM_LEDS; i > 0; i-- )
{
leds[i] = CRGB(255 - 7 * i, 255, 7 * i );
FastLED.setBrightness(20);
FastLED.show();
delay (50);
}
//浅色,蓝色→绿色,逆时针
for (int i = NUM_LEDS; i > 0; i-- )
{
leds[i] = CRGB(255, 7 * i, 255 - 7 * i );
FastLED.setBrightness(20);
FastLED.show();
delay (50);
}
//浅色,绿色→红色,逆时针
for (int i = NUM_LEDS; i > 0; i-- )
{
leds[i] = CRGB(7 * i , 255 - 7 * i, 255);
FastLED.setBrightness(20);
FastLED.show();
delay (50);
}
}
- (5)实现现象(部分展示):
3、彩虹灯环
-
(1)本实验采用Arduino UNO R3开发板及自主搭建电路的方式,实现预设功能。
-
(2)彩虹灯环的电路图,如下图所示:
-
(3)实验准备:下载安装 “FastLED” 库文件。
-
(4)实现功能:炫彩流水灯,灯环呈现彩虹色,依次显示赤橙黄绿青蓝紫。
//WS2812,RGB灯环
//炫彩流水灯,灯环呈现彩虹色:赤橙黄绿青蓝紫
#include <FastLED.h>
#define LED_PIN 7
#define NUM_LEDS 32
CRGB leds[NUM_LEDS];
void setup()
{
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
FastLED.setMaxPowerInVoltsAndMilliamps(5, 500);
FastLED.clear();
FastLED.show();
}
void loop()
{
//红色→橙色→黄色
for (int i = 0; i < NUM_LEDS; i++ )
{
leds[i] = CRGB(255, 7 * i + 31, 0 );
FastLED.setBrightness(20);
FastLED.show();
delay (50);
}
//黄色→绿色
for (int i = 0; i < NUM_LEDS; i++ )
{
leds[i] = CRGB(224 - 7 * i, 255, 0 );
FastLED.setBrightness(20);
FastLED.show();
delay (50);
}
//绿色→青色→蓝色
for (int i = 0; i < NUM_LEDS; i++ )
{
leds[i] = CRGB(0, 224 - 7 * i, 7 * i + 31);
FastLED.setBrightness(20);
FastLED.show();
delay (50);
}
//蓝色→紫色
for (int i = 0; i < NUM_LEDS; i++ )
{
leds[i] = CRGB(7 * i, 0, 255);
FastLED.setBrightness(20);
FastLED.show();
delay (50);
}
//紫色→红色
for (int i = 0; i < NUM_LEDS; i++ )
{
leds[i] = CRGB(255, 0, 224 - 7 * i);
FastLED.setBrightness(20);
FastLED.show();
delay (50);
}
}
- (5)实现现象(部分展示):
总结
- 通过上述三个实验,实现了Arduino控制WS2812B灯环,从电路原理到编程实现,进一步了解RGB彩灯的控制原理。
参考资料1: WS2812B引脚图及功能,应用电路和原理说明
参考资料2: 用Arduino制作溢彩流光的LED梦幻灯带
参考资料3: 【雕爷学编程】Arduino动手做(124)—24位WS2812环形灯板
参考资料4: 秒上手!使用Arduino控制基于WS2812B的LED灯条