跳到主要内容

趣味灯条

重要提示:关于开发板的兼容性

本教程的核心逻辑适用于所有 ESP32 开发板,但所有操作步骤均以 微雪 ESP32-S3-Zero 迷你开发板 为例进行讲解。如果您使用其他型号的开发板,请根据实际情况修改相应设置。

项目介绍

这个项目展示了一个通过电位器控制 WS2812 可编程 LED 灯条的程序。通过旋转电位器,可以实时改变灯条的显示效果:灯条会依次经历三个阶段的颜色变化(黄色 → 绿色 → 红色),亮起的灯珠数量也会随着电位器的旋转而逐渐增加,形成流畅的视觉渐变效果。

硬件连接

需要使用的器件有:

  • WS2812 灯条 * 1
  • 电位器 * 1
  • 面包板 * 1
  • 导线
  • ESP32 开发板

按照下面接线图连接电路:

ESP32-S3-Zero 引脚图

ESP32-S3-Zero-Pinout

接线图

代码实现

提示

此代码示例依赖 “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) 进行简单的延时。

参考链接