ESP32-S3 控制 WS2812 RGB 彩灯

ESP32-S3 WS2812 RGB 彩灯进阶实验合集

在很多 ESP32 项目中,RGB 彩灯(如 WS2812)常用于氛围灯、状态指示灯、DIY 灯带等场景。

本文整理了一套从入门到进阶的实验合集,涵盖了单颗渐变、跑马灯、彩虹流水、呼吸灯以及声音律动灯的效果。


一、实验准备

  • 开发板:ESP32-S3

  • RGB 灯珠:WS2812 / WS2812B(单颗或灯带均可)

  • 软件环境:Arduino IDE

  • 库依赖:Adafruit_NeoPixel(在 Arduino IDE 中通过“项目 → 导入库 → 添加.ZIP库”安装)

  • 接线说明

    • WS → IO16
    • VCC → 3.3V
    • GND → GND

代码中统一使用以下定义(如实际接线不同,请修改):

#define PIN_NEOPIXEL 16   // 数据引脚
#define NUMPIXELS    8    // 灯珠数量

二、实验一:单颗 RGB 渐变灯

实验现象
单颗 RGB 灯珠在红-蓝之间渐变,类似氛围灯。

核心代码

#include <Adafruit_NeoPixel.h>

#define PIN_NEOPIXEL 16
#define NUMPIXELS    1

Adafruit_NeoPixel pixels(NUMPIXELS, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800);

void setup() {
  pixels.begin();
  pixels.setBrightness(100);
  pixels.clear();
}

void loop() {
  for(int r=0; r<256; r+=5) {
    pixels.setPixelColor(0, pixels.Color(r, 0, 255-r));
    pixels.show();
    delay(30);
  }
}

三、实验二:多颗灯珠跑马灯

实验现象
多颗灯珠依次点亮,形成“跑马灯”效果。

核心代码

#include <Adafruit_NeoPixel.h>

#define PIN_NEOPIXEL 16
#define NUMPIXELS    8

Adafruit_NeoPixel pixels(NUMPIXELS, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800);

void setup() {
  pixels.begin();
  pixels.setBrightness(100);
  pixels.clear();
}

void loop() {
  for(int i=0; i<NUMPIXELS; i++) {
    pixels.clear();
    pixels.setPixelColor(i, pixels.Color(255,0,0)); // 红色跑马
    pixels.show();
    delay(200);
  }
}

四、实验三:彩虹流水灯 🌈

实验现象
灯珠颜色不断变化,形成彩虹流水的流动效果。

核心代码

#include <Adafruit_NeoPixel.h>

#define PIN_NEOPIXEL 16
#define NUMPIXELS    8

Adafruit_NeoPixel pixels(NUMPIXELS, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800);

uint16_t j = 0;

void setup() {
  pixels.begin();
  pixels.setBrightness(120);
}

void loop() {
  for(int i=0; i<NUMPIXELS; i++) {
    int pixelHue = (i * 65536L / NUMPIXELS + j) & 65535;
    pixels.setPixelColor(i, pixels.gamma32(pixels.ColorHSV(pixelHue)));
  }
  pixels.show();
  j += 256;  // 控制流速
  delay(30);
}

五、实验四:呼吸灯效果

实验现象
灯珠亮度由暗变亮,再由亮变暗,循环往复,类似“呼吸灯”。

核心代码

#include <Adafruit_NeoPixel.h>

#define PIN_NEOPIXEL 16
#define NUMPIXELS    8

Adafruit_NeoPixel pixels(NUMPIXELS, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800);

void setup() {
  pixels.begin();
  pixels.setBrightness(255);
}

void loop() {
  for(int b=0; b<=255; b+=5) {
    pixels.fill(pixels.Color(0,0,b)); // 蓝色呼吸灯
    pixels.show();
    delay(20);
  }
  for(int b=255; b>=0; b-=5) {
    pixels.fill(pixels.Color(0,0,b));
    pixels.show();
    delay(20);
  }
}

六、实验五:音乐律动灯(进阶🔥)

实验现象
接入麦克风声音传感器后,RGB 灯珠会根据音量高低进行动态变化。

接线说明

  • 麦克风传感器 AO → ESP32 IO34 (ADC)

核心代码

#include <Adafruit_NeoPixel.h>

#define PIN_NEOPIXEL 16
#define NUMPIXELS    8
#define MIC_PIN      34  // 麦克风模拟输入

Adafruit_NeoPixel pixels(NUMPIXELS, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800);

void setup() {
  pixels.begin();
  pixels.setBrightness(255);
  analogReadResolution(12);
}

void loop() {
  int micValue = analogRead(MIC_PIN); // 读取音量
  int level = map(micValue, 0, 4095, 0, NUMPIXELS);

  pixels.clear();
  for(int i=0; i<level; i++) {
    pixels.setPixelColor(i, pixels.Color(0, 255, 0)); // 音量条绿色
  }
  pixels.show();
  delay(20);
}

七、总结

本文整理了 五个进阶实验,涵盖了从入门到高级的 RGB 彩灯玩法:

  • 基础实验:渐变、跑马、呼吸灯
  • 进阶实验:彩虹流水、音乐律动

通过这些实验,读者可以快速掌握 ESP32-S3 控制 WS2812 RGB 灯珠 的方法,并进一步扩展到 WiFi 远程控制、MQTT 智能灯带、音乐可视化 等更有趣的应用。

posted @ 2025-08-16 14:28  jeikerxiao  阅读(588)  评论(0)    收藏  举报