2H Dev Notes

2H Dev Notes

WS2812 灯带 Arduino 控制教程

87
2025-12-24

一、硬件准备

  • Arduino 开发板(如 Uno、Nano、Mega 等)

  • WS2812 灯带(或 WS2812B、NeoPixel 灯珠模块)

  • 杜邦线若干

  • 外部电源(5V,根据灯珠数量选择合适电流,一般每个灯珠最大60mA)

接线说明

WS2812 VDD → Arduino 5V(小数量灯珠)或 外部 5V 电源正极 WS2812 GND → Arduino GND 和 外部电源负极共地 WS2812 DIN → Arduino 数字引脚(例如 D6) ⚠️ 注意:如果灯珠数量超过 10 个,建议使用外部 5V 电源,并确保 Arduino GND 与外部电源 GND 共地。

二、软件准备

安装 Arduino IDE(官网下载) 安装 Adafruit NeoPixel 库: 打开 Arduino IDE → 工具 → 管理库 搜索 “Adafruit NeoPixel” 安装最新版本

三、基础代码示例

// 引入 Adafruit NeoPixel 库
#include <Adafruit_NeoPixel.h>
​
// ===== 用户配置区 =====
#define LED_PIN     6        // 连接灯带数据线的 Arduino 引脚
#define LED_COUNT   30       // 灯带上 LED 的数量(根据你的灯带修改)
​
// 创建一个 NeoPixel 对象
// 参数说明:LED数量, 数据引脚, LED类型标志(通常用 NEO_GRB + NEO_KHZ800)
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
​
// ===== setup 函数:只运行一次 =====
void setup() {
  // 初始化串口监视器(用于调试,可选)
  Serial.begin(9600);
  
  // 初始化 NeoPixel 灯带
  strip.begin();
  
  // 将所有 LED 设置为关闭状态(非常重要!)
  strip.show(); 
  
  // 设置整体亮度(0~255,255为最亮;降低亮度可减少发热和电流)
  strip.setBrightness(50); 
}
​
// ===== loop 函数:循环执行 =====
void loop() {
  // 示例1:逐个点亮红色
  colorWipe(strip.Color(255, 0, 0), 50);    // 红色,间隔50ms
  colorWipe(strip.Color(0, 255, 0), 50);    // 绿色
  colorWipe(strip.Color(0, 0, 255), 50);    // 蓝色
​
  // 示例2:彩虹效果
  rainbow(20);               // 彩虹滚动,速度20ms
  
  // 示例3:彩虹循环(更平滑)
  rainbowCycle(20);          // 彩虹循环,速度20ms
}
​
// ===== 自定义函数:逐个填充颜色 =====
// 参数:
//   color: 要填充的颜色(使用 strip.Color(r, g, b) 生成)
//   wait: 每点亮一个LED后的等待时间(毫秒)
void colorWipe(uint32_t color, int wait) {
  for(int i=0; i<strip.numPixels(); i++) { 
    // 设置第 i 个 LED 的颜色
    strip.setPixelColor(i, color);
    // 更新灯带显示
    strip.show();
    // 等待一段时间,形成动画效果
    delay(wait);
  }
}
​
// ===== 自定义函数:彩虹效果 =====
// 参数:
//   wait: 每次更新之间的延迟(毫秒)
void rainbow(uint8_t wait) {
  // 外层循环:控制彩虹的起始相位(0~255)
  for(long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 256) {
    // 内层循环:为每个 LED 分配颜色
    for(int i=0; i<strip.numPixels(); i++) {
      // 计算每个 LED 的色相值(Hue)
      // 使用 Wheel 函数将色相(0-65535)转换为 RGB 颜色
      int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
      strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
    }
    strip.show(); // 更新显示
    delay(wait);  // 等待
  }
}
​
// ===== 自定义函数:彩虹循环效果 =====
void rainbowCycle(uint8_t wait) {
  // 循环多次以完成完整循环
  for(long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 256) {
    for(int i=0; i<strip.numPixels(); i++) {
      // 每个 LED 的色相 = 起始色相 + 偏移量
      // 偏移量 = (i * 65536 / LED总数) ,确保整圈是完整彩虹
      int pixelHue = firstPixelHue + (i * 65536L);
      strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
    }
    strip.show();
    delay(wait);
  }
}

四、关键函数说明

strip.Color(r, g, b)

生成一个 32 位颜色值 r/g/b 范围:0~255 示例:strip.Color(255, 0, 0) = 纯红

strip.setPixelColor(index, color)

设置第 index 个 LED 的颜色(从 0 开始计数) 不会立即显示,需调用 show()

strip.show()

将缓冲区中的颜色数据发送到灯带

strip.ColorHSV(hue, sat=255, val=255)

使用 HSV(色相-饱和度-明度)模式设置颜色 hue 范围:0~65535(对应 0°~360°) 更适合制作彩虹、渐变等效果

五、进阶提示

  • 电源安全:30个灯珠全亮白光时电流可达 1.8A(30×60mA),务必使用足够功率的 5V 电源。

  • 避免长时间全亮:可适当降低 setBrightness() 值。

  • 数据线加电阻:在 Arduino 输出和灯带 DIN 之间串联 300~500Ω 电阻,可提高信号稳定性。(如果是模块基本已经集成了,可以不加)

  • 第一个灯珠损坏?:WS2812 是串联结构,第一个坏了后面全不亮,注意静电防护。

六、常见问题

Q:灯带不亮?

A:检查接线是否正确,GND 是否共地,数据线是否接对引脚。

Q:颜色不对(如红蓝颠倒)?

A:尝试将 NEO_GRB 改为 NEO_RGB(取决于灯珠型号)。

Q:Arduino 重启或灯带闪烁?

A:可能是电源不足,改用外部 5V 电源并确保共地。

七、参考资料

点击下载