掌握 WS2812B LED 控制:Arduino 分步指南
概述
本教程将学习如何使用 Arduino 控制单个可寻址 RGB LED 或 WS2812B LED 灯带。你可以观看下方视频或阅读以下图文教程了解更多细节。
首先通过基础示例解释工作原理,然后展示一个很酷的 Arduino 项目——DIY 互动 LED 咖啡桌。桌面包含 WS2812B LED、红外接近传感器检测物体、HC-05 蓝牙模块通过自制 Android App 控制颜色。该项目是我与 Creativity Hero YouTube 频道的 Marija 合作完成。

WS2812B LED 工作原理
仔细观察灯带:由 5050 RGB LED 组成,内部集成极紧凑的 WS2812B 驱动 IC。

通过调节红、绿、蓝三颗 LED 的强度可模拟任意颜色。

最棒的是:整条灯带仅需 Arduino 一个引脚即可控制。每颗 LED 两端各有三个焊盘:两个供电、一个数据。箭头指示数据流向。前一颗 LED 的数据输出连接下一颗的数据输入。灯带可任意剪裁、用导线延长间距。

供电 5V,每颗 LED 红绿蓝各约 20mA,全亮约 60mA。Arduino USB 供电时 5V 引脚仅供约 400mA,桶形插座供电约 900mA。若电流超限,必须外接 5V 电源,并将两地连接。建议数据线串联 330Ω 电阻降噪,电源端并联 100μF 电容滤波。
Arduino 与 WS2812B LED 示例
示例 1:基础点亮

示例用 20 颗灯带,经 330Ω 电阻接 Arduino,外接 5V 电源。编程用 FastLED 库(优秀、文档完善)。
所需组件:
- WS2812B LED 灯带
- Arduino 开发板
- 5V 6A 直流电源
#include <FastLED.h>
#define LED_PIN 7
#define NUM_LEDS 20
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}
void loop() {
leds[0] = CRGB(255, 0, 0); FastLED.show(); delay(500);
leds[1] = CRGB(0, 255, 0); FastLED.show(); delay(500);
leds[2] = CRGB(0, 0, 255); FastLED.show(); delay(500);
leds[5] = CRGB(150, 0, 255); FastLED.show(); delay(500);
leds[9] = CRGB(255, 200, 20); FastLED.show(); delay(500);
leds[14] = CRGB(85, 60, 180); FastLED.show(); delay(500);
leds[19] = CRGB(50, 255, 20); FastLED.show(); delay(500);
}
说明:包含 FastLED,定义引脚、LED 数、CRGB 数组(每颗 LED 三字节 RGB)。setup 初始化 FastLED。loop 中用 CRGB 设定颜色,FastLED.show() 刷新生效。
示例 2:简单动画

#include <FastLED.h>
#define LED_PIN 7
#define NUM_LEDS 20
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}
void loop() {
for (int i = 0; i <= 19; i++) { leds[i] = CRGB(0, 0, 255); FastLED.show(); delay(40); }
for (int i = 19; i >= 0; i--) { leds[i] = CRGB(255, 0, 0); FastLED.show(); delay(40); }
}
第一个 for 循环正向蓝色流动,第二个反向红色流动,延时 40ms。FastLED 提供丰富函数可制作绚丽动画,发挥想象力即可。
基于 WS2812B 的互动 LED 咖啡桌
这是我与 Marija 合作的 DIY 互动 LED 咖啡桌。她在网站详细讲解木工制作全过程,这里讲解电子部分、Android App 制作和 Arduino 编程。

电路原理图

桌面含 45 颗可寻址 LED、45 个红外接近传感器、HC-05 蓝牙模块,全接 Arduino Mega,5V 6A 供电。
所需组件:
- WS2812B LED 灯带
- 红外接近传感器
- HC-05 蓝牙模块
- Arduino 开发板
- 5V 6A 直流电源
源代码
不含蓝牙控制时代码极简:
#include "FastLED.h"
#define NUM_LEDS 45
#define LED_PIN 2
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(brightness);
for (int pinNo = 3; pinNo <= 48; pinNo++) pinMode(pinNo, INPUT);
}
void loop() {
for (int pinNo = 0; pinNo <= NUM_LEDS-1; pinNo++) {
leds[pinNo] = CRGB(0, 255, 0); // 全绿背景
if (digitalRead(pinNo + 3) == LOW) { // 检测到物体
leds[pinNo] = CRGB(0, 0, 255); // 反应色蓝
}
}
FastLED.show();
delay(20);
}
说明:定义参数,设 45 个传感器引脚为输入。loop 单层 for 循环:先设所有 LED 为背景色,若对应传感器检测到物体(低电平),将该 LED 设为反应色,最后 FastLED.show() 更新。
加入蓝牙颜色控制需额外代码及 Android App。HC-05 蓝牙和 MIT App Inventor 制作 App 有单独教程可参考。
Android App 界面与逻辑
App 包含调色盘图片取色、两个复选框选“反应色/背景色”、亮度滑块。

触摸调色盘时,GetPixelColor 取得 RGB,蓝牙发送文本。复选框决定发送标记符("1" 反应色、"2" 背景色),滑块发送亮度值(10-100)标记 "3"。

可下载 Android App 及 MIT App Inventor 工程文件:
DIY_Reactive_LED_Table_Control
1 file(s) 0.00 KB Download
DIY_Reactive_LED_Table_Control MIT App Inventor Project File
1 file(s) 208.06 KB Download带蓝牙控制的 Arduino 代码
#include <SoftwareSerial.h>
#include "FastLED.h"
#define NUM_LEDS 45
#define LED_PIN 2
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
SoftwareSerial Bluetooth(53, 52); // Arduino RX, TX - 蓝牙 TX, RX
int backR=100, backG=50, backB=10;
int reactiveR=10, reactiveG=50, reactiveB=100;
int brightness=50;
String dataIn="";
void setup() {
FastLED.addLeds<WS2812, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(brightness);
Serial.begin(38400);
Bluetooth.begin(38400);
for (int pinNo=3; pinNo<=48; pinNo++) pinMode(pinNo, INPUT);
}
void loop() {
if (Bluetooth.available() > 0) {
dataIn = Bluetooth.readString(); delay(20);
if (dataIn.startsWith("1")) {
delay(10);
String stringR = dataIn.substring(dataIn.indexOf("R")+1, dataIn.indexOf("G"));
reactiveR = stringR.toInt();
String stringG = dataIn.substring(dataIn.indexOf("G")+1, dataIn.indexOf("B"));
reactiveG = stringG.toInt();
String stringB = dataIn.substring(dataIn.indexOf("B")+1, dataIn.indexOf("E"));
reactiveB = stringB.toInt();
} else if (dataIn.startsWith("2")) {
String stringR = dataIn.substring(dataIn.indexOf("R")+1, dataIn.indexOf("G"));
backR = stringR.toInt();
String stringG = dataIn.substring(dataIn.indexOf("G")+1, dataIn.indexOf("B"));
backG = stringG.toInt();
String stringB = dataIn.substring(dataIn.indexOf("B")+1, dataIn.indexOf("E"));
backB = stringB.toInt();
} else if (dataIn.startsWith("3")) {
String stringBrightness = dataIn.substring(dataIn.indexOf("3")+1, dataIn.length());
brightness = stringBrightness.toInt();
FastLED.setBrightness(brightness);
}
}
for (int pinNo=0; pinNo<=NUM_LEDS-1; pinNo++) {
leds[pinNo] = CRGB(backR, backG, backB);
if (digitalRead(pinNo+3) == LOW) {
leds[pinNo] = CRGB(reactiveR, reactiveG, reactiveB);
}
}
FastLED.show();
delay(20);
}
说明:定义 SoftwareSerial 连蓝牙(引脚 53/52)。setup 设波特率 38400。loop 检查蓝牙数据,readString() 读取字符串,startsWith() 判断标记符,substring() 提取 RGB 转整数,供下方 for 循环使用。亮度同理解析后调用 FastLED.setBrightness()。最后 for 循环设背景色/反应色并刷新。
本教程到此结束。欢迎在评论区提问。
制造工艺
- 用 Arduino 制作万能红外遥控器:分步指南
- 基于 Arduino、1Sheeld 与红外控制的万能安卓遥控器
- Arduino 电源控制中心:N-FET/P-FET/继电器/RTC 多功能扩展板
- 基于 Arduino MKR1000 与 ThingSpeak 的远程 IoT 机械臂控制系统
- Arduino + HC-05 蓝牙控制 LED:MIT App Inventor 手机 App 开发全攻略
- Firmata + Xbox 手柄无线遥控 Arduino 小车:UWP 应用桥接方案
- 用 Arduino 测量地球质量:DIY 分步指南
- 从零构建智能 Arduino 四足机器人:完整指南
- Bolt IoT + Arduino UNO 实现 6 路 LED 无级调光
- 通过 Arduino IoT Cloud 用 Alexa 控制电视:分步指南
- 构建基于 PHP 的 Web 界面控制 Arduino Uno
- Arduino 实时数字罗盘:HMC5883L + Processing 可视化教程