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

如何使用 Arduino 控制 WS2812B 可单独寻址的 LED

在本教程中,我们将学习如何使用 Arduino 控制可单独寻址的 RGB LED 或 WS2812B LED 灯条。您可以观看以下视频或阅读下面的书面教程了解更多详情。

概览

首先,我们将通过一些基本示例来解释工作原理,然后看看使用这些 LED 的非常酷的 Arduino 项目,一个 DIY 交互式 LED 咖啡桌。咖啡桌配备 WS2812B LED、用于检测物体的红外接近传感器和用于通过定制构建的 Android 应用程序控制颜色的 HC-05 蓝牙模块。这个项目实际上是我和来自 Creativity Hero YouTube 频道的 Marija 之间的合作。

WS2812B LED 工作原理

让我们先仔细看看 LED 灯条。它由 5050 型 RGB LED 组成,其中集成了非常紧凑的 WS2812B LED 驱动器 IC。

根据三个单独的红色、绿色和蓝色 LED 的强度,我们可以模拟我们想要的任何颜色。

这些 LED 的优点在于,我们甚至可以通过 Arduino 板上的一个引脚来控制整个 LED 灯条。每个 LED 在每一端都有三个连接器,两个用于供电,一个用于数据。箭头表示数据流向。前一个 LED 的数据输出焊盘连接到下一个 LED 的数据输入焊盘。我们可以将条带切割成我们想要的任何尺寸,以及使用一些电线来拉开 LED 的距离。

至于电源,它们在 5V 上工作,每个红色、绿色和蓝色 LED 消耗大约 20mA,或者每个 LED 在全亮度下总共消耗 60mA。请注意,当 Arduino 通过 USB 供电时,5V 引脚只能处理 400 mA 左右,而使用桶形电源连接器供电时,5V 引脚可以处理 900 mA 左右。

如果您使用更多 LED 并且它们所消耗的电流量超过上述限制,则必须使用单独的 5V 电源。在这种情况下,您还需要将两条接地线相互连接起来。此外,建议在 Arduino 和 LED 灯条数据引脚之间使用约 330 欧姆的电阻以减少该线路上的噪声,并在 5V 和接地之间使用约 100uF 的电容器以平滑电源.

Arduino 和 WS2812B LED 示例

示例1

现在作为一个例子,我将使用 20 个 LED 长条,通过 330 欧姆电阻连接到 Arduino,并使用单独的 5V 电源供电,如上所述。对于 Arduino 编程,我们将使用 FastLED 库。这是一个优秀且有据可查的库,可以轻松控制 WS2812B LED。

您可以从以下链接获取此示例所需的组件:

  • WS2812B LED 灯条……………………..
  • Arduino 开发板………………………………
  • 5V 6A 直流电源………………

这是第一个示例的 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() {
  
  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);
}Code language: Arduino (arduino)

说明: 所以首先我们需要包含 FastLED 库,定义 LED 灯条数据连接的引脚,定义 LED 的数量,以及定义 CRGB 类型的数组。此类型包含 LED,三个红色、绿色和蓝色通道中的每一个都有三个单字节数据成员。

在设置部分,我们只需要使用上面定义的参数初始化 FastLED。现在它是主循环,我们可以随心所欲地控制我们的 LED。使用 CRGB 功能,我们可以使用红色、绿色和蓝色三个参数将任何 LED 设置为任何颜色。为了使 LED 发生变化,我们需要调用函数 FastLED.show()。

示例 2

使用一些“for”循环我们可以轻松制作一些动画。

这是第二个示例的 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);
  }
}Code language: Arduino (arduino)

这里第一个“for”循环以 40 毫秒的延迟点亮所有 20 个 LED,从第一个 LED 到最后一个 LED。下一个“for”循环再次点亮所有 20 个 LED,但这次是红色,顺序相反,从最后一个 LED 到第一个 LED。

FastLED 库具有许多其他功能,可用于制作非常有趣的动画和灯光表演,因此您的下一个 LED 项目只能发挥想象力。

使用 WS2812B LED 的交互式 LED 咖啡桌

现在我们来看看我开篇提到的DIY互动LED茶几项目。所以这是我和 Creativity Hero 的 Marija 之间的合作项目。

您可以查看她的网站文章,其中她解释了制作桌子的整个过程,从切割和组装木制结构到焊接和连接所有电子部件。在这里,我将解释电子部分的工作原理,如何构建自定义 Android 应用程序以及对 Arduino 板进行编程。

这是这个项目的完整电路原理图。

因此该表由 45 个可寻址 LED、45 个红外接近传感器和一个 HC-05 蓝牙模块组成,所有这些都连接到一个 Arduino Mega 板。电路采用5V 6A电源供电。

您可以从以下链接获取此示例所需的组件:

  • WS2812B LED 灯条……………………..
  • 红外接近传感器……………………
  • HC-05 蓝牙模块………………
  • Arduino 开发板………………………………
  • 5V 6A 直流电源………………

相关:如何在 Arduino 中使用 RGB LED |教程

源代码

这是这个项目的Arduino代码,如果我们排除蓝牙颜色控制功能,我们可以注意到代码实际上非常简单。

#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);
  // Set the 45 proximity sensors pins as inputs, from digital pin 3 to pin 48
  for (int pinNo = 0 + 3; pinNo <= 45 + 3; pinNo++) {
    pinMode(pinNo, INPUT);
  }
}

void loop() {
  for (int pinNo = 0; pinNo <= NUM_LEDS-1; pinNo++) {
    leds[pinNo] = CRGB( 0, 255, 0);    // Set all 45 LEDs to green color 
    // If an object is detected on top of the particular sensor, turn on the particular led
    if ( digitalRead(pinNo + 3) == LOW ) {
      leds[pinNo] = CRGB( 0, 0, 255); // Set the reactive LED to bluee
    }
  }
  FastLED.show(); // Update the LEDs
  delay(20);
}Code language: Arduino (arduino)

描述: 首先,我们需要定义前面解释的基本参数,并将 45 个接近传感器引脚设置为输入。

在使用单个“for”循环的主循环中,我们将所有 LED 设置为特定颜色,并检查接近传感器是否检测到物体。如果这是真的,或者在这种情况下为低逻辑状态,则特定的反应颜色将设置为特定的 LED。最后使用 FastLED.show() 函数更新 LED 的颜色。

为了包含蓝牙颜色控制功能,我们需要添加更多代码行以及制作 Android 应用程序。我已经有关于如何将 HC-05 蓝牙模块与 Arduino 一起使用以及如何使用 MIT App Inventor 在线应用程序制作自己的 Android 应用程序的单独教程,因此您可以随时查看它们以获取更多详细信息。

这是Android应用程序的工作方式。它由一个调色板图像组成,我们可以从中选择颜色,两个检查按钮可以选择将所选颜色应用于反应性 LED 还是背景 LED,以及一个用于调整亮度的滑块。

如果我们看一下应用程序的块,我们可以看到当我们触摸放置调色板图像的画布时会发生什么。使用 .GetPixelColor 块,我们获取拾取颜色的 Red、Green 和 Blue 值,并使用蓝牙 SendText 块,我们将此信息以文本形式发送到 Arduino。

根据选中的复选框,我们发送不同的第一个字符或标记,这有助于在 Arduino 接收文本。当我们改变滑块的位置时也会发生同样的情况,一个从 10 到 100 的值以文本的形式发送到 Arduino,前面带有标记“3”。

您可以下载下面的 Android 应用,以及 MIT App Inventor 项目文件:

DIY_Reactive_LED_Table_Control

1 个文件 0.00 KB 下载

DIY_Reactive_LED_Table_Control MIT App Inventor 项目文件

1 个文件 208.06 KB 下载

这是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) - Bluetooth (TX, RX)

// Initial background color 
int backR = 100;
int backG = 50;
int backB = 10;

// Initial reactive color 
int reactiveR = 10;
int reactiveG = 50;
int reactiveB = 100;

int brightness = 50; // Initial brightness

String dataIn = "";

void setup() {
  FastLED.addLeds<WS2812, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.setBrightness(brightness);
  Serial.begin(38400);
  Bluetooth.begin(38400); // Default baud rate of the Bluetooth module

  for (int pinNo = 0 + 3; pinNo <= 45 + 3; 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);
}Code language: Arduino (arduino)

说明: 首先,我们需要定义 Arduino 和 HC-05 蓝牙模块之间的串行通信,或模块所连接的引脚。在设置部分,我们需要设置该模块工作的波特率。然后在主循环中使用 Bluetooth.available() 函数我们检查是否有来自智能手机的传入数据。如果这是真的,使用 Bluetooth.readString() 函数我们将数据作为字符串接收。然后使用 .startsWith() 函数检查第一个字符或标记,从而知道我们是否要更改反应颜色、背景或亮度。

使用 .substring() 函数,我们从接收到的文本中提取红色、绿色和蓝色值,并将它们转换为整数。这些值随后在下面的“for”循环中使用,该循环设置颜色并点亮 LED,如前所述。以同样的方式调整 LED 的亮度。

这就是本教程的全部内容。欢迎在下方评论区提出任何问题。


制造工艺

  1. 如何破解红外遥控器
  2. 使用 Arduino、1Sheeld 和 Android 的通用远程控制
  3. Arduino 控制中心
  4. 使用物联网远程控制机械臂
  5. Arduino 带蓝牙控制 LED!
  6. 使用 Firmata 和 Xbox One 控制器控制 Arduino Rover
  7. 如何使用 Arduino 测量地球质量
  8. Arduino Quadruped
  9. 使用 Bolt 和 Arduino 控制 LED 亮度
  10. 使用 Alexa 和 Arduino IoT Cloud 完全控制您的电视
  11. 如何使用 PHP 创建一个与 Arduino 通信的网站
  12. 如何使用 Arduino 和 Processing IDE 制作指南针