亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

掌握 WS2812B LED 控制:Arduino 分步指南

概述

本教程将学习如何使用 Arduino 控制单个可寻址 RGB LED 或 WS2812B LED 灯带。你可以观看下方视频或阅读以下图文教程了解更多细节。

首先通过基础示例解释工作原理,然后展示一个很酷的 Arduino 项目——DIY 互动 LED 咖啡桌。桌面包含 WS2812B LED、红外接近传感器检测物体、HC-05 蓝牙模块通过自制 Android App 控制颜色。该项目是我与 Creativity Hero YouTube 频道的 Marija 合作完成。

掌握 WS2812B LED 控制:Arduino 分步指南

WS2812B LED 工作原理

仔细观察灯带:由 5050 RGB LED 组成,内部集成极紧凑的 WS2812B 驱动 IC。

掌握 WS2812B LED 控制:Arduino 分步指南

通过调节红、绿、蓝三颗 LED 的强度可模拟任意颜色。

掌握 WS2812B LED 控制:Arduino 分步指南

最棒的是:整条灯带仅需 Arduino 一个引脚即可控制。每颗 LED 两端各有三个焊盘:两个供电、一个数据。箭头指示数据流向。前一颗 LED 的数据输出连接下一颗的数据输入。灯带可任意剪裁、用导线延长间距。

掌握 WS2812B LED 控制:Arduino 分步指南

供电 5V,每颗 LED 红绿蓝各约 20mA,全亮约 60mA。Arduino USB 供电时 5V 引脚仅供约 400mA,桶形插座供电约 900mA。若电流超限,必须外接 5V 电源,并将两地连接。建议数据线串联 330Ω 电阻降噪,电源端并联 100μF 电容滤波。

Arduino 与 WS2812B LED 示例

示例 1:基础点亮

掌握 WS2812B LED 控制:Arduino 分步指南

示例用 20 颗灯带,经 330Ω 电阻接 Arduino,外接 5V 电源。编程用 FastLED 库(优秀、文档完善)。

所需组件:

#include <FastLED.h>
#define LED_PIN 7
#define NUM_LEDS 20
CRGB leds[NUM_LEDS];
void setup() {
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}
void loop() {
  leds[0] = CRGB(255, 0, 0); FastLED.show(); delay(500);
  leds[1] = CRGB(0, 255, 0); FastLED.show(); delay(500);
  leds[2] = CRGB(0, 0, 255); FastLED.show(); delay(500);
  leds[5] = CRGB(150, 0, 255); FastLED.show(); delay(500);
  leds[9] = CRGB(255, 200, 20); FastLED.show(); delay(500);
  leds[14] = CRGB(85, 60, 180); FastLED.show(); delay(500);
  leds[19] = CRGB(50, 255, 20); FastLED.show(); delay(500);
}

说明:包含 FastLED,定义引脚、LED 数、CRGB 数组(每颗 LED 三字节 RGB)。setup 初始化 FastLED。loop 中用 CRGB 设定颜色,FastLED.show() 刷新生效。

示例 2:简单动画

掌握 WS2812B LED 控制:Arduino 分步指南
#include <FastLED.h>
#define LED_PIN 7
#define NUM_LEDS 20
CRGB leds[NUM_LEDS];
void setup() {
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}
void loop() {
  for (int i = 0; i <= 19; i++) { leds[i] = CRGB(0, 0, 255); FastLED.show(); delay(40); }
  for (int i = 19; i >= 0; i--) { leds[i] = CRGB(255, 0, 0); FastLED.show(); delay(40); }
}

第一个 for 循环正向蓝色流动,第二个反向红色流动,延时 40ms。FastLED 提供丰富函数可制作绚丽动画,发挥想象力即可。

基于 WS2812B 的互动 LED 咖啡桌

这是我与 Marija 合作的 DIY 互动 LED 咖啡桌。她在网站详细讲解木工制作全过程,这里讲解电子部分、Android App 制作和 Arduino 编程。

掌握 WS2812B LED 控制:Arduino 分步指南

电路原理图

掌握 WS2812B LED 控制:Arduino 分步指南

桌面含 45 颗可寻址 LED、45 个红外接近传感器、HC-05 蓝牙模块,全接 Arduino Mega,5V 6A 供电。

所需组件:

源代码

不含蓝牙控制时代码极简:

#include "FastLED.h"
#define NUM_LEDS 45
#define LED_PIN 2
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
void setup() {
  FastLED.addLeds<WS2812, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.setBrightness(brightness);
  for (int pinNo = 3; pinNo <= 48; pinNo++) pinMode(pinNo, INPUT);
}
void loop() {
  for (int pinNo = 0; pinNo <= NUM_LEDS-1; pinNo++) {
    leds[pinNo] = CRGB(0, 255, 0); // 全绿背景
    if (digitalRead(pinNo + 3) == LOW) { // 检测到物体
      leds[pinNo] = CRGB(0, 0, 255); // 反应色蓝
    }
  }
  FastLED.show();
  delay(20);
}

说明:定义参数,设 45 个传感器引脚为输入。loop 单层 for 循环:先设所有 LED 为背景色,若对应传感器检测到物体(低电平),将该 LED 设为反应色,最后 FastLED.show() 更新。

加入蓝牙颜色控制需额外代码及 Android App。HC-05 蓝牙和 MIT App Inventor 制作 App 有单独教程可参考。

Android App 界面与逻辑

App 包含调色盘图片取色、两个复选框选“反应色/背景色”、亮度滑块。

掌握 WS2812B LED 控制:Arduino 分步指南

触摸调色盘时,GetPixelColor 取得 RGB,蓝牙发送文本。复选框决定发送标记符("1" 反应色、"2" 背景色),滑块发送亮度值(10-100)标记 "3"。

掌握 WS2812B LED 控制:Arduino 分步指南

可下载 Android App 及 MIT App Inventor 工程文件:

掌握 WS2812B LED 控制:Arduino 分步指南

DIY_Reactive_LED_Table_Control

1 file(s) 0.00 KB Download 掌握 WS2812B LED 控制:Arduino 分步指南

DIY_Reactive_LED_Table_Control MIT App Inventor Project File

1 file(s) 208.06 KB Download

带蓝牙控制的 Arduino 代码

#include <SoftwareSerial.h>
#include "FastLED.h"
#define NUM_LEDS 45
#define LED_PIN 2
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
SoftwareSerial Bluetooth(53, 52); // Arduino RX, TX - 蓝牙 TX, RX
int backR=100, backG=50, backB=10;
int reactiveR=10, reactiveG=50, reactiveB=100;
int brightness=50;
String dataIn="";
void setup() {
  FastLED.addLeds<WS2812, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.setBrightness(brightness);
  Serial.begin(38400);
  Bluetooth.begin(38400);
  for (int pinNo=3; pinNo<=48; pinNo++) pinMode(pinNo, INPUT);
}
void loop() {
  if (Bluetooth.available() > 0) {
    dataIn = Bluetooth.readString(); delay(20);
    if (dataIn.startsWith("1")) {
      delay(10);
      String stringR = dataIn.substring(dataIn.indexOf("R")+1, dataIn.indexOf("G"));
      reactiveR = stringR.toInt();
      String stringG = dataIn.substring(dataIn.indexOf("G")+1, dataIn.indexOf("B"));
      reactiveG = stringG.toInt();
      String stringB = dataIn.substring(dataIn.indexOf("B")+1, dataIn.indexOf("E"));
      reactiveB = stringB.toInt();
    } else if (dataIn.startsWith("2")) {
      String stringR = dataIn.substring(dataIn.indexOf("R")+1, dataIn.indexOf("G"));
      backR = stringR.toInt();
      String stringG = dataIn.substring(dataIn.indexOf("G")+1, dataIn.indexOf("B"));
      backG = stringG.toInt();
      String stringB = dataIn.substring(dataIn.indexOf("B")+1, dataIn.indexOf("E"));
      backB = stringB.toInt();
    } else if (dataIn.startsWith("3")) {
      String stringBrightness = dataIn.substring(dataIn.indexOf("3")+1, dataIn.length());
      brightness = stringBrightness.toInt();
      FastLED.setBrightness(brightness);
    }
  }
  for (int pinNo=0; pinNo<=NUM_LEDS-1; pinNo++) {
    leds[pinNo] = CRGB(backR, backG, backB);
    if (digitalRead(pinNo+3) == LOW) {
      leds[pinNo] = CRGB(reactiveR, reactiveG, reactiveB);
    }
  }
  FastLED.show();
  delay(20);
}

说明:定义 SoftwareSerial 连蓝牙(引脚 53/52)。setup 设波特率 38400。loop 检查蓝牙数据,readString() 读取字符串,startsWith() 判断标记符,substring() 提取 RGB 转整数,供下方 for 循环使用。亮度同理解析后调用 FastLED.setBrightness()。最后 for 循环设背景色/反应色并刷新。

本教程到此结束。欢迎在评论区提问。

制造工艺

  1. 用 Arduino 制作万能红外遥控器:分步指南
  2. 基于 Arduino、1Sheeld 与红外控制的万能安卓遥控器
  3. Arduino 电源控制中心:N-FET/P-FET/继电器/RTC 多功能扩展板
  4. 基于 Arduino MKR1000 与 ThingSpeak 的远程 IoT 机械臂控制系统
  5. Arduino + HC-05 蓝牙控制 LED:MIT App Inventor 手机 App 开发全攻略
  6. Firmata + Xbox 手柄无线遥控 Arduino 小车:UWP 应用桥接方案
  7. 用 Arduino 测量地球质量:DIY 分步指南
  8. 从零构建智能 Arduino 四足机器人:完整指南
  9. Bolt IoT + Arduino UNO 实现 6 路 LED 无级调光
  10. 通过 Arduino IoT Cloud 用 Alexa 控制电视:分步指南
  11. 构建基于 PHP 的 Web 界面控制 Arduino Uno
  12. Arduino 实时数字罗盘:HMC5883L + Processing 可视化教程