用5050 RGB灯珠做彩虹流水灯,这个项目说难不难,说简单也得掌握几个关键点。很多新手卡在PWM调光和颜色渐变算法上,其实搞懂原理后,你会发现20行代码就能让灯珠像彩虹一样流动起来。

5050 RGB灯珠到底是什么?
5050指的是灯珠尺寸——5.0mm × 5.0mm的贴片封装。这种灯珠内部其实藏着三颗独立的LED芯片:红(R)、绿(G)、蓝(B)。通过控制这三个颜色的亮度比例,理论上能混出1677万种颜色(256×256×256)。
两种常见类型的区别
普通5050 RGB(共阳或共阴)
需要外部驱动电路(三极管/MOS管)
每个颜色独立控制一根信号线
适合小规模项目(10颗灯以内)
成本低,0.3元/颗左右
5050智能灯珠(WS2812B/SK6812)
内置IC芯片,自带驱动
单总线串联控制,一根信号线搞定
适合大规模阵列(几百颗都行)
稍贵,1.2元/颗,但省掉驱动电路
你要做彩虹流水效果,强烈推荐用WS2812B。为啥?因为它支持级联,第一颗灯的数据输出直接接到第二颗的输入,像接力赛一样把颜色信息传下去。普通RGB灯你得给每颗灯单独接线,10颗灯就是30根线,想想都头大。

硬件准备清单(照着买不踩坑)
必备材料
单片机开发板 :STM32F103C8T6(蓝色药丸板,15块)或51单片机(STC89C52,8块)
WS2812B灯珠 :建议先买16颗的圆形模块(22块包邮),方便调试
电源 :5V 2A适配器(手机充电头就行)
杜邦线 :公对母20根(2块钱)
面包板 :可选,方便不想焊接的朋友
接线方式(3根线解决问题)
单片机 → WS2812B灯条 GND → GND(黑线) 5V → VCC(红线) P1.0 → DIN(绿线,数据输入)
注意!灯珠功耗不小,16颗全亮白光要吃掉960mA电流(每颗60mA)。如果你用的是USB供电的单片机板,别超过10颗灯,不然板子会重启。超过20颗必须外接独立5V电源,记得把单片机和电源的GND连在一起(共地)。

彩虹渐变的核心原理(看懂这个就成功一半)
彩虹的七种颜色其实是连续过渡的,红→橙→黄→绿→青→蓝→紫。用RGB三原色模拟这个过程,关键是掌握颜色轮盘算法 。
HSV色彩空间转RGB
直接写RGB值太麻烦,专业做法是用HSV(色相-饱和度-亮度)模型:
H(Hue/色相) :0-360°,代表彩虹上的位置(0°红色,120°绿色,240°蓝色)
S(Saturation/饱和度) :0-100%,100%是纯色
V(Value/亮度) :0-100%,控制明暗
举个例子:
纯红色:H=0°, S=100%, V=100%
纯绿色:H=120°, S=100%, V=100%
浅粉色:H=0°, S=50%, V=100%
你的代码只需要让H值从0°匀速增加到360°,颜色自然就像彩虹一样变化了。下面是简化版的转换函数(C语言):
// HSV转RGB简化算法
void HSV_to_RGB(uint16_t h, uint8_t s, uint8_t v, uint8_t *r, uint8_t *g, uint8_t *b) {
uint8_t region = h / 43; // 把360度分成6段
uint8_t remainder = (h % 43) * 6;
uint8_t p = (v * (255 - s)) >> 8;
uint8_t q = (v * (255 - ((s * remainder) >> 8))) >> 8;
uint8_t t = (v * (255 - ((s * (255 - remainder)) >> 8))) >> 8;
switch(region) {
case 0: *r = v; *g = t; *b = p; break;
case 1: *r = q; *g = v; *b = p; break;
case 2: *r = p; *g = v; *b = t; break;
case 3: *r = p; *g = q; *b = v; break;
case 4: *r = t; *g = p; *b = v; break;
default: *r = v; *g = p; *b = q; break;
}
}三种彩虹效果实现方案(从简单到炫酷)
方案一:静态彩虹(新手友好)
让16颗灯同时显示彩虹的不同颜色,每颗灯间隔22.5°(360÷16)。
#include "ws2812.h"
void rainbow_static(void) {
uint8_t r, g, b;
for(uint8_t i = 0; i < 16; i++) {
uint16_t hue = i * 22; // 每颗灯色相偏移22度
HSV_to_RGB(hue, 255, 200, &r, &g, &b); // 亮度200避免刺眼
WS2812_SetPixelColor(i, r, g, b);
}
WS2812_Show(); // 刷新显示
}效果:灯条像彩虹一样渐变,但不会动。适合做氛围灯。

方案二:流水彩虹(最经典)
在方案一基础上加个定时器,每100ms把所有灯的色相值+10°,视觉上就是彩虹在"流动"。
uint16_t hue_offset = 0; // 全局偏移量
void rainbow_flow(void) {
uint8_t r, g, b;
for(uint8_t i = 0; i < 16; i++) {
uint16_t hue = (i * 22 + hue_offset) % 360;
HSV_to_RGB(hue, 255, 200, &r, &g, &b);
WS2812_SetPixelColor(i, r, g, b);
}
WS2812_Show();
hue_offset += 5; // 每次调用增加5度
if(hue_offset >= 360) hue_offset = 0;
}
// 在主循环或定时器中断里调用
while(1) {
rainbow_flow();
delay_ms(50); // 速度控制
}调整hue_offset += 5的数值可以改变流速:
+=2:慢速流动,适合冥想氛围
+=10:快速闪烁,适合派对
方案三:呼吸彩虹(高级玩法)
在流水基础上加入亮度变化(V值),制造"呼吸"效果。
uint8_t brightness = 0;
int8_t breath_dir = 1; // 1递增,-1递减
void rainbow_breath(void) {
uint8_t r, g, b;
// 亮度正弦变化
brightness += breath_dir * 5;
if(brightness >= 250) breath_dir = -1;
if(brightness <= 50) breath_dir = 1;
for(uint8_t i = 0; i < 16; i++) {
uint16_t hue = (i * 22 + hue_offset) % 360;
HSV_to_RGB(hue, 255, brightness, &r, &g, &b);
WS2812_SetPixelColor(i, r, g, b);
}
WS2812_Show();
hue_offset += 3;
}效果像在深呼吸,很多智能音箱的灯效就是这个原理。

WS2812B通信协议重点提示
这个灯珠用的是单总线协议 ,时序要求很严格:
0码:高电平0.4μs + 低电平0.85μs
1码:高电平0.8μs + 低电平0.45μs
复位信号:低电平持续50μs以上
手写时序太折磨,建议用现成的库:
STM32 :搜"WS2812 SPI DMA库",用SPI+DMA模拟时序,CPU占用率不到5%
51单片机 :用汇编写的库,搜"51单片机WS2812.c"
Arduino :直接装FastLED库,三行代码搞定
// Arduino示例(最简单)
#include <FastLED.h>
#define NUM_LEDS 16
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812B, 6, GRB>(leds, NUM_LEDS);
}
void loop() {
fill_rainbow(leds, NUM_LEDS, 0, 16); // 一行代码实现彩虹
FastLED.show();
delay(50);
}常见问题排查指南
问题1:第一颗灯亮了,后面的不亮
检查5V供电是否充足(万用表测灯条末端电压,低于4.5V就是电源不够)
确认数据线接对了引脚(DIN不是DOUT)
焊接的朋友检查下虚焊
问题2:颜色不对,全是红色或绿色
WS2812B的颜色顺序是GRB,不是RGB!发送数据时调整下顺序
检查代码里是不是写成了
SetPixelColor(i, g, r, b)
问题3:灯光闪烁不稳定
在灯条的VCC和GND之间并联一个470μF电容(靠近第一颗灯)
数据线太长的话(超过50cm),串联一个330Ω电阻
问题4:第5颗灯之后颜色错乱
某颗灯可能坏了,跳过它直接接下一颗试试
时序不准,降低单片机主频或者换个时序更严格的库
进阶玩法推荐
掌握彩虹基础后,可以试试这些:
音乐律动灯
用麦克风模块(MAX4466)采集音频,根据音量大小动态调整亮度和颜色变化速度。低音推红色,高音推蓝色,瞬间变身音乐可视化装置。
矩阵屏显示
把256颗WS2812B排成16×16的矩阵,用二维数组控制,可以显示图案、文字、俄罗斯方块游戏画面。
手机APP控制
加个蓝牙模块(HC-05),用手机调颜色、选模式。代码框架不变,只是把参数改成从串口接收。
成本和时间预估
如果你是第一次做:
材料成本 :50-80元(含单片机板)
学习时间 :3-5小时(看懂原理+调通第一个效果)
完整项目 :周末两天搞定,包括焊接、编程、调试
有现成开发板和基础的话,1小时就能看到彩虹流动起来。我第一次做的时候卡在时序上折腾了两天,后来发现是晶振频率配置错了(51单片机11.0592MHz写成了12MHz)。用逻辑分析仪一测,波形全乱了。所以建议新手直接用Arduino或者STM32的成熟库,别自己硬刚时序。
项目扩展方向
智能台灯 :加个旋钮电位器调颜色,按键切换模式
氛围灯带 :粘在显示器背后,玩游戏时自动变色
圣诞装饰 :缠在树上,设置成雪花飘落效果(白色灯珠从上往下移动)
可穿戴设备 :做成发光手环,用纽扣电池供电
关键是理解了RGB混色和单总线通信原理,剩下的都是举一反三。WS2812B这个芯片用途太广了,从小米台灯到特斯拉氛围灯都有它的身影。学会了这个,以后看到各种炫酷灯效,你就知道怎么实现了。