趣味灯条
重要提示:关于开发板的兼容性
本教程的核心逻辑适用于所有 ESP32 开发板,但所有操作步骤均以 微雪 ESP32-S3-Zero 迷你开发板 为例进行讲解。如果您使用其他型号的开发板,请根据实际情况修改相应设置。
项目介绍
这个项目展示了一个通过电位器控制 WS2812 可编程 LED 灯条的程序。通过旋转电位器,可以实时改变灯条的显示效果:灯条会依次经历三个阶段的颜色变化(黄色 → 绿色 → 红色),亮起的灯珠数量也会随着电位器的旋转而逐渐增加,形成流畅的视觉渐变效果。
硬件连接
需要使用的器件有:
- WS2812 灯条 * 1
- 电位器 * 1
- 面包板 * 1
- 导线
- ESP32 开发板
按照下面接线图连接电路:
ESP32-S3-Zero 引脚图


代码实现
提示
此代码示例依赖 “FastLED” 库。请在 Arduino IDE 的库管理器中搜索并安装 “FastLED” 库。
安装方法请参考:Arduino 库管理教程。
/*
电位器控制 WS2812 灯带
读取电位器的模拟值,并将其映射到 WS2812 灯带上。
随着数值增加,灯光依次点亮(黄 -> 绿 -> 红)。
电路连接:
* 电位器连接到引脚 7
* WS2812 灯带数据线连接到引脚 8
Wulu (Waveshare Team)
*/
#include <FastLED.h>
// --- 常量定义 ---
const int potPin = 7; // 电位器引脚
const int ledPin = 8; // WS2812 数据引脚
const int numLeds = 8; // 灯珠数量
const int brightness = 50; // 亮度
// 定义 LED 数组
CRGB leds[numLeds];
void setup() {
Serial.begin(115200);
Serial.println("电位器控制 WS2812");
// 初始化电位器引脚
pinMode(potPin, INPUT);
// 初始化 FastLED
FastLED.addLeds<WS2812B, ledPin, GRB>(leds, numLeds).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(brightness);
FastLED.clear();
FastLED.show();
}
void loop() {
// 读取电位器模拟值
int analogValue = analogRead(potPin);
// 更新灯光
updateLeds(analogValue);
// 简单的延时,防止刷新过快
delay(50);
}
// 辅助函数放在 loop 之后
void updateLeds(int analogValue) {
// 将 0-4095 映射到 0-24 (3 个阶段 * 8 个灯)
int totalSteps = 3 * numLeds;
// 使用 map 函数进行映射
long position = map(analogValue, 0, 4095, 0, totalSteps);
// 限制最大值,防止溢出
if (position > totalSteps) {
position = totalSteps;
}
// 遍历所有 LED
for (int i = 0; i < numLeds; i++) {
// 逻辑判断:优先级从高到低 (红 -> 绿 -> 黄)
// 第三部分:红色覆盖 (当进度超过 16 + 灯的索引)
if (position > (2 * numLeds + i)) {
leds[i] = CRGB::Red;
}
// 第二部分:绿色覆盖 (当进度超过 8 + 灯的索引)
else if (position > (1 * numLeds + i)) {
leds[i] = CRGB::Green;
}
// 第一部分:黄色亮起 (当进度超过 灯的索引)
else if (position > i) {
leds[i] = CRGB::Yellow;
}
// 其他情况:熄灭
else {
leds[i] = CRGB::Black;
}
}
// 将数据写入灯带
FastLED.show();
}
代码解释
-
导入库:引入
FastLED库用于控制 WS2812 灯带。这是一个功能强大且高效的 LED 控制库。提示此代码示例依赖 “FastLED” 库。请在 Arduino IDE 的库管理器中搜索并安装 “FastLED” 库。
安装方法请参考:Arduino 库管理教程。
-
配置参数:使用
const常量定义电位器引脚、WS2812 引脚、灯珠数量以及亮度。const int potPin = 7; // 电位器引脚
const int ledPin = 8; // WS2812 数据引脚
const int numLeds = 8; // 灯珠数量
const int brightness = 50; // 亮度 -
对象初始化:
- 定义一个
CRGB类型的数组leds,用于存储每个灯珠的颜色数据。
CRGB leds[numLeds]; - 定义一个
-
setup()函数:- 初始化串口通信。
- 设置电位器引脚为输入模式。
- 初始化 FastLED:使用
FastLED.addLeds配置灯带参数(类型、引脚、颜色顺序、数组地址、数量),并设置颜色校正。FastLED.addLeds<WS2812B, ledPin, GRB>(leds, numLeds)无颜色校正FastLED.addLeds<WS2812B, ledPin, GRB>(leds, numLeds).setCorrection(TypicalLEDStrip);带颜色校正,色彩看起来更自然、准确
FastLED.setBrightness(brightness)设置全局亮度。FastLED.clear()和FastLED.show()确保启动时灯带熄灭。
-
updateLeds()函数:- 映射:使用
map()函数将 ADC 读取值(0-4095)映射到总步数(0-24)。 - 逻辑判断:遍历每个灯珠,根据当前进度
position决定颜色。 - 设置颜色:直接给
leds[i]赋值预定义的颜色(如CRGB::Red,CRGB::Green,CRGB::Yellow,CRGB::Black)。 - 更新显示:调用
FastLED.show()将数组中的颜色数据发送到灯带。
- 映射:使用
-
loop()函数:- 使用
analogRead()读取电位器电压值。 - 调用
updateLeds()更新灯带状态。 - 使用
delay(50)进行简单的延时。
- 使用