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

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

首先,我们将通过一些基本的例子来解释工作原理,然后看看真正酷的Arduino项目使用这些LED,一个DIY交互式LED咖啡桌。咖啡桌有WS2812B led,用于检测物体的红外接近传感器和一个HC-05蓝牙模块,通过定制的Android应用程序来控制颜色。这个项目实际上是我和YouTube创意英雄频道的Marija

创意英雄LED表

WS2812B LED如何工作

让我们开始仔细看看LED条带。它包括5050型RGB LED,其中集成了非常紧凑的WS2812B LED驱动器IC。

WS2812B LED驱动IC 5050 RGB LED

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

WS2812B RGB led工作

这些LED的伟大是,即使是我们的Arduino板的单个别针也可以控制整个LED条带。每个LED在每个端部都有三个连接器,两个用于供电,一个用于数据。箭头表示数据流方向。先前LED的数据输出焊盘连接到下一个LED的数据输入焊盘。我们可以将条带切割成我们想要的任何尺寸,以及使用一些电线的LED距离。

至于电源,它们工作在5V,每个红、绿、蓝LED在20mA左右,或者是每个LED在全亮度下总共60mA。需要注意的是,Arduino通过USB供电时,5V引脚只能处理400 mA左右,而使用桶状电源连接器供电时,5V引脚可以处理900 mA左右。

如果你使用更多的led,并且它们所产生的电流超过了上面提到的限制,你必须使用单独的5V电源。在这种情况下,您还需要连接两个接地线2彼此。此外,建议在Arduino和LED条数据引脚之间使用一个330欧姆左右的电阻,以减少线路上的噪声,以及一个通过5V和地的大约100uF的电容,以平滑电源供应。

Arduino和WS2812B led示例

例1

现在作为一个例子,我将使用20个led长条,通过一个330欧姆电阻连接到Arduino,并与单独的5V电源供电,就像上面解释的那样。对于Arduino编程,我们将使用FastLED图书馆。这是一个优秀的、文档记录良好的库,可以轻松地控制WS2812B led。

你可以从下面的链接中获得这个例子所需的组件:

yaboAG娱乐城披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。

下面是Arduino源代码的第一个例子:

#include  #define LED_PIN 7 #define NUM_LEDS 20 CRGB leds[NUM_LEDS];void setup(){fastled.addleds (LED,NUM_LED);} void loop() {led [0] = CRGB(255, 0, 0);FastLED.show ();延迟(500);led [1] = CRGB(0, 255, 0);FastLED.show ();延迟(500);led [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); }

Desctiption:所以首先我们需要包含FastLED库,定义连接LED条数据的引脚,定义LED的数量,以及定义CRGB类型的数组。这种类型包含led,三个一字节的数据成员分别对应三个红、绿、蓝颜色通道。

在设置部分中,我们只需初始化上面定义的参数的标记。现在它是我们想要控制我们的LED的主循环。使用CRGB功能,我们可以使用红色,绿色和蓝色的三个参数设置任何导致任何颜色。为了使我们在LED上发生变化,我们需要将函数紧张.Show()。

例2.

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

Arduino和WS2812B示例2

下面是Arduino源代码的第二个例子:

#include  #define LED_PIN 7 #define NUM_LEDS 20 CRGB leds[NUM_LEDS];void setup(){fastled.addleds (LED,NUM_LED);void循环(){for(int i = 0; i <= 19; i ++){LED [i] = CRGB(0,0,255);FastLED.show ();延迟(40);for(int i = 19; i> = 0; i--){LED [i] = CRGB(255,0,0);FastLED.show ();延迟(40);}}

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

错配的图书馆具有许多其他功能,可以用于制作真正有趣的动画和光明节目,因此它只取决于您的想象力,使下一个LED项目发光。

交互式LED咖啡桌使用WS2812B LED

现在让我们来看看我在开始时提到的DIY交互式LED咖啡表项目。因此,这是与我和Marija之间的合作项目,从创造力英雄之间。

创造力英雄互动式LED咖啡桌

您可以查看她的网站文章,在那里她解释了制作桌子的整个过程,从切割和组装木结构开始,焊接并将所有电子部件连接在一起。yabo7. com在这里,我将解释电子部件的工作原理,如何构建自定义Andyabo7. comroid应用程序并编程Arduino板。

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

创意英雄互动LED咖啡桌电路原理图

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

你可以从下面的链接中获得这个例子所需的组件:

yaboAG娱乐城披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。

有关的:如何使用RGB LED带Arduino |教程

源代码

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

#define NUM_LEDS 45 #define LED_PIN 2 #define COLOR_ORDER GRB CRGB leds[NUM_LEDS];void setup() {FastLED。addLeds(leds, NUM_LEDS);FastLED.setBrightness(亮度);//设置45个接近传感器引脚为输入,从数字引脚3到引脚48 (int pinNo = 0 + 3;pinNo <= 45 + 3;pinNo++) {pinMode(pinNo, INPUT);}} void loop() {for (int pinNo = 0;pinNo < = NUM_LEDS-1;pinNo++) {led [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); }

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

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

包括蓝牙颜色控制功能,我们需要添加更多代码行以及制作Android应用程序。我已经有了单独的教程带Arduino的HC-05蓝牙模块如何使用如何使用MIT App Inventor Online应用程序制作自己的Android应用程序,所以你可以随时查看更多细节。

以下是Android应用程序的工作原理。它包括一个调色板图像,从那里我们可以挑选颜色,两个检查按钮,从那里我们可以选择选择的颜色将被应用到活性或背景led和一个滑块调整亮度。

交互式LED表自定义构建Android应用程序

如果我们看一看应用的块,我们可以看到当我们触摸放置调色板图像的画布时发生了什么。使用。getpixelcolor块,我们获得所选颜色的Red, Green和Blue值,并使用蓝牙SendText块,我们将这些信息以文本形式发送给Arduino。

LED表Android应用程序块

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

你可以下载下面的Android应用程序,以及麻省理工学院应用程序发明家项目文件:

下面是Arduino代码:

#include  #include "FastLED.h" #define NUM_LEDS 45 #define LED_PIN 2 #define COLOR_ORDER GRB CRGB leds[NUM_LEDS];SoftwareSerial蓝牙(53个,52岁);// Arduino(RX, TX) -蓝牙(TX, RX) //初始背景颜色int backR = 100;int backG = 50;int backB = 10;//初始反应颜色int reactiveR = 10;int reactiveG = 50;int reactiveB = 100;Int亮度= 50;//初始亮度String dataIn = ""; void setup() { FastLED.addLeds(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); }

描述:首先,我们需要定义Arduino和HC-05蓝牙模块之间的串行通信,或者连接到模块的引脚。在“设置”部分中,我们需要设置该模块工作的波特率。然后在主循环中使用蓝牙.Available()函数,我们检查智能手机是否有传入数据。如果这是真的,则使用蓝牙.ReadString()函数,我们将数据作为字符串收到。然后使用.startswith()函数,我们检查第一个字符或标记,以这种方式知道我们是否要更改无功颜色,背景或亮度。

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

这就是本教程的一切。随意询问以下意见部分中的任何问题。

29回应

  1. 杰克

    非常好的项目,但是你能告诉我哪些引脚是用于红外传感器的,哪些是用于数字传感器的吗?我对图片有点困惑(灰色引脚连接和绿色引脚连接),所以你能告诉我灰色和绿色线的正确连接吗....谢谢

    回复
      • 杰克

        谢谢,先生,但你能告诉我在arduino mega哪个针是IR传感器,哪个r是数字的,我很困惑…
        示例:在Arduino Mega Loard,我们在IR连接中连接的销钉,用于数字(绿色电线)连接可以让你在图中告诉我我在这些IR和数字连接中迷惑了......谢谢

      • 杰克

        因为在视频中,她将许多灰色和绿色的电线连接到arduino mega,所以你可以告诉我哪个针是灰色连接,哪个针是绿色的

  2. Dejan Nedelkovski.

    回复晚了非常抱歉。问题是,我们对所有IR传感器的灰色电线没有足够的灰色电线,以及我们使用的一些人使用绿色,这可能会让你混淆。
    不管怎样,从0到45的IR输出到Arduino 3到48的数字引脚。至于led,我们只有一个引脚在使用,那是第2引脚。

    回复
  3. 杰克

    非常感谢,先生,你们太棒了,你们可以通过arduino制作音乐播放器,可以由我们控制(例子:好的jarvis play track i like u by eminem) ....我将非常感谢如果你可以使这种类型的项目....再次感谢先生

    回复
  4. 杰克

    你好Dejan先生可以让谷歌协助回声设备如亚马逊回声谁可以控制我们的家庭电器,音乐和回复,如亚马逊回声,我会感谢你...谢谢先生

    回复
  5. 罗伯特

    你好,

    您能解释如何获得快速LED库和工作吗?我无法达到这个工作,所以我无法获得工作的程序。

    非常感谢

    回复
    • Dejan Nedelkovski.

      以与上面的教程中的我解释的方式相同,只需更改您在Arduino代码中使用的LED的数量。还要确保您有足够的电源,需要在4A 5V电源左右(60LED x 60mA = 3600mA = 3.6a)。

      回复
  6. Ariel.

    嗨,德扬,

    谢谢你发布这个(:
    我使用您的项目示例来构建一个不同的个人项目。

    我被困住了):也许你能帮助我

    我试图用应用程序轻轻亮WS2812B LED带,我使用了Arduino代码。
    由于我没有使用任何红外传感器,我放弃了代码行:

    for(int pinno = 0 + 1; pinno <= 2 + 1; pinno ++){
    pinMode (pinNo,输入);

    for (int pinNo = 0;pinNo < = 2;pinNo + +) {
    led [pinNo] = CRGB(backR, backG, backB);
    if(DigitalRead(Pinno + 1)==低){
    led [pinNo] = CRGB(reactiveR, reactiveG, reactiveB);

    但是我不能让它改变颜色。

    我想要的是:

    应用程序控制WS2812B led带,无需任何输入。如果您能帮我弄清楚,由于我迷路了,我需要在Arduino代码和MIT App中更改什么(;

    谢谢

    回复
    • Dejan Nedelkovski.

      嘿,在这种情况下使用相同的应用程序,您只能在相同的颜色同时将颜色更改为所有LED。
      因此,您仍然可以使用“reactiveR/G/B”变量来设置颜色,因此,与您在评论中提到的代码不同,您可以使用一个简单的a for循环来激活所有的led,使用那些“reactiveR/G/B”变量值。喜欢的东西:
      for (int pinNo = 0;pinNo < = 45;pinNo++) {led [pinNo] = CRGB(reactiveR, reactiveG, reactiveB);这个应该可以,虽然我现在不能测试它。

      回复
  7. 马克

    在此为循环(第66-69行):
    for (int pinNo = 0;pinNo < = 45;pinNo + +) {
    led [pinNo] = CRGB(backR, backG, backB);
    if(DigitalRead(Pinno + 3)==低){
    led [pinNo] = CRGB(reactiveR, reactiveG, reactiveB);

    当pinNo是45,它将尝试写像素数据到led[45],这并不存在,因为NUM_LEDS是45(即。你只有[0]到[44]的led)。向不存在的像素写入数据通常会导致内存中发生不好的事情,比如随机的像素闪烁,甚至是代码执行锁定。

    要使代码更少打破,并且在复制时打破,并且更改了num_leds的值,您可能会考虑更新for循环行:
    for (int pinNo = 0;pinNo < = NUM_LEDS-1;pinNo + +) {

    回复
  8. Bogdan Asanache

    您好Dejan,只有一个关于电容类型/尺寸的问题,我需要在WS2812B 5M 60LED / M上使用5V20A的电源:
    我引用你的话“,以及一个跨越5V和地面的大约100uF的电容,以平滑电源供应”——你能更具体地说一下,根据我的电源和led条,电容应该放在哪里,以及其类型吗?
    我猜这是一个愚蠢的问题,但我不知道,只是开始学习,希望完成我已经开始的事情。
    先谢谢你。

    回复
    • 德扬

      你好,这个电容器被称为“旁路”或“解耦”电容器。当电压突然下降时,电路利用电容器储存的电荷来保持电压稳定。
      实际上它对这些LED来说并不重要,但它可以使用一个。如果为5米,建议使用大约100-500U的东西,在5V上方的电压,因此16V,25V,35V等。电容器尽可能接近LED条带,并且其正销进入条带销的正销和负条或GND。

      回复
  9. 菲利普

    你好,
    首先,伟大的projekt!
    你能解释一下subString函数是如何工作的吗?
    特别是我不明白+1的部分。
    +1是什么意思?

    种reguards

    回复
    • 德扬

      嘿,谢谢!subString函数只提取我们想要的字符串部分。以下是你提到的“+1”部分的意思:
      例如,我们从手机中获得的值是R255G220B123。因此,使用indexOf()函数,我们首先找到R字符,在本例中这是索引1,但使用want我们的字符串从下一个索引开始,或+1,这是索引2。另一方面,我们希望字符串以G字符结束(它不包括G字符)。因此,提取的字符串将只有255,然后可以转换为整数值。

      回复
  10. Svein-Martin Holt

    你好
    我喜欢你的节目和想法,但是你在Banggood上链接的RGBW条带不被FastLed支持。它只支持RGB条带。Adafruit Neopixel库支持RGBW和RGB条带,但你的程序必须重写,如果那应该被使用。
    花了一些时间让我搞清楚。我认为RGBW地带有一个错误,但使用正确的库,它可以正常工作。
    问候,Sveinm

    回复
  11. **问题**
    嗨,伟大的教程我发现它真的很有趣!我对Arduino完全是新的,并做了一些这样的项目。足彩网女欧洲杯但有一个想法,我想尝试涉及相同的LED条带。

    我的问题是Arduino本身以及有多少不同的模块,但是对于一个类似的项目,我想控制45个LED我需要一个Arduino Mega?或者可以使用更便宜的模块(如uno),如果是这样哪一个?

    回复
    • 德扬

      嘿,谢谢!好吧,如果要控制此类型的45个LED,WS2812B,那么即使您也可以使用最小的Arduino,Nano或Pro Mini。为了控制这些LED,您只需从Arduino的单个数字引脚,以及当然的专用电源。

      回复
  12. Marko.

    嘿,
    伟大的解释!但我有一个问题

    是否存在将5V 4A电源直接连接到Arduino Boards 5V引脚的问题?我想用一个电源为LED条带和电路板供电,但我不确定它是否会炸我的电路板......?

    回复
  13. Guido.

    你好
    非常好的项目!
    我看到了很多无限的项目,我会问你,如何修改代码,足彩网女欧洲杯这样就有可能解决超过1个LED每个传感器。
    问候
    Guido.

    回复

留下一个回复

您的电子邮件地址不会被公开。

推荐

2019年面向初学者和爱好者的最佳入门级示波器

最适合初学者和爱好者的示波器

推荐

2019年针对初学者的8个最佳Arduino入门工具包

初学者的8个最佳Arduino Starter Kits

推荐

最佳3D打印机初学者和爱好者- 3D打印

最好的3d打印机初学者和爱好者