WS2812 RGB LED 灯条

概述

在本课中,您将了解 NeoPixel LED 以及如何使用 FastLED 库在 Arduino Uno R4 上控制它们。NeoPixel LED 广泛应用于家居装饰、可穿戴设备和活动照明等领域。FastLED 库简化了这些 LED 的编程过程。这里,将一串 8 个 NeoPixel LED 连接到 Arduino,序列中的每个 LED 会短暂亮起蓝色然后熄灭,接着轮到链条中的下一个 LED。这个基础示例可以作为更复杂的光效或交互式照明项目的基础。

所需元件

本项目中,我们需要以下元件。

购买整套套件会更加方便,以下是链接:

名称

套件所含项目

链接

Elite Explorer 套件

300+

Elite Explorer Kit

您也可以从以下链接单独购买。

元件介绍

购买链接

Arduino Uno R4 WiFi

-

杜邦线

BUY

WS2812 RGB 8 LED灯条

BUY

接线

../_images/12-ws2812_bb.png

原理图

../_images/12_ws2812_schematic.png

代码

备注

  • 您可以直接打开路径 elite-explorer-kit-main\basic_project\12-ws2812 下的 12-ws2812.ino 文件。

  • 或者将以下代码复制到 Arduino IDE 中。

备注

要安装库,请使用 Arduino 库管理器搜索 “FastLED” 并安装。

重要

随着 FastLED 3.7.0 的发布,FastLED 库现已正式支持 Arduino UNO R4。因此,您不再需要手动安装开发版本。只需使用 Arduino 库管理器更新或安装 FastLED 库即可。

警告

[已过时] 由于 FastLED 库尚未正式发布支持 Arduino R4 的版本,您需要下载 FastLED 库的最新开发代码 并覆盖现有的 FastLED 库文件。有关如何执行此操作的详细说明,请参考 手动安装 部分。(当 FastLED 库正式发布支持 Arduino UNO R4 的更新后,此说明将被撤回。)

代码成功上传后,您将看到 8 个 NeoPixel LED 灯串中的每个 LED 逐个亮起蓝色。程序将持续循环此序列,在转到下一个 LED 之前关闭当前 LED。由于每个 LED 之间有一个短暂的延迟,灯光效果将显示为一个沿着灯串移动的蓝色光点。

代码分析

  1. 导入库并设置常量

    • 导入 FastLED 库以使用其函数。

    • 定义 LED 数量及其连接的数据引脚。

    #include <FastLED.h>  // 包含 FastLED 库
    #define NUM_LEDS 8    // 灯串中 LED 的数量
    #define DATA_PIN 6    // LED 控制的数据引脚
    
  2. 初始化 LED 数组

    创建一个 CRGB 类型的数组,用于存储每个 LED 的颜色信息。

    CRGB leds[NUM_LEDS];  // 用于存储 LED 颜色数据的数组
    
  3. 在 Setup 中初始化 LED

    使用 FastLED.addLeds 初始化 LED。

    void setup() {
      FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);  // 初始化 LED
    }
    
  4. 在 Loop 中控制 LED

    循环遍历每个 LED,将其设为蓝色、显示、清除然后延迟。

    • leds 数组作为 LED 灯条的颜色缓冲区。该数组中的每个元素对应物理灯条上的一个 LED,其颜色值决定了该 LED 将显示的颜色。数组中元素的顺序与灯条上 LED 的顺序一致,从第一个 LED(对应于 leds[0])到最后一个 LED。要更改灯条上特定 LED 的颜色,只需修改 leds 数组中相应的元素。您可以使用 predefined colors 或使用 RGB 设置颜色(以绿色为例,使用 leds[dot] = CRGB::Greenleds[dot] = CRGB(0, 255, 0);)。

    • FastLED.show(); 函数用新的颜色数据更新 LED 灯条,使更改可见。这就像在代码中进行编辑和调整后,为 LED 灯条按下”发布”按钮。


    void loop() {
      for (int dot = 0; dot < NUM_LEDS; dot++) {
        leds[dot] = CRGB::Blue;   // 将当前 LED 设为蓝色
        FastLED.show();           // 更新 LED
        leds[dot] = CRGB::Black;  // 清除当前 LED
        delay(30);                // 短暂等待后转到下一个 LED
      }
    }