如何使用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,或合计60mA的每个LED在全亮度。请注意,当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。

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

必威外围提钱披露:这些是会员链接。作为一名亚马逊员工,我通过符合条件的购买获得收入。

以下是第一个示例的Arduino源代码:

#包括#定义LED引脚7#定义数量LED 20个CRGB LED[数量LED];void setup(){FastLED.addLeds(LED,NUM_LED);}void loop(){LED[0]=CRGB(255,0,0);FastLED.show();delay(500);LED[1]=CRGB(0,255,0);FastLED.show();delay(500);LED[5]=CRGB(150,0,255);fastld.show();delay(500);LED[9]=CRGB(255,200,20);FastLED.show();延迟(500);发光二极管[14]=CRGB(85,60,180);FastLED.show();延迟(500);发光二极管[19]=CRGB(50255,20);FastLED.show();延迟(500);}

描述:因此,首先我们需要包含FastLED库,定义LED条数据连接到的引脚,定义LED的数量,以及定义类型为CRGB的数组。这种类型包含led,每个红色、绿色和蓝色通道都有三个一个字节的数据成员。

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

示例2

使用一些“for”循环,我们可以很容易地制作一些动画。

Arduino和WS2812B示例2

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

#包括#定义LED_引脚7#定义NUM_LED 20个CRGB LED[NUM_LED];无效设置(){FastLED.addLED(LED,NUM_LED);}void loop(){for(int i=0;i<=19;i++){LED[i]=CRGB(0,0255);FastLED.show();delay(40 CRGB=19;i>=0;i--{LED[i]=0,delay}

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

FastLED库提供了许多其他功能,这些功能可以用来制作有趣的动画和灯光秀,所以只有依靠你的想象力才能让你的下一个LED项目发光。

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

现在让我们来看看我在开始提到的DIY互动LED咖啡桌项目。这是我和创意英雄的Marija的一个合作项目。

创造力英雄Interactive-LED-coffe-table

你可以查看她的网站文章,她在文章中解释了制作桌子的整个过程,从切割和组装木制结构,到焊接和连接所有电子部件。在这里,我将解释电子部件如何工作,如何构建定制的Android应用程序和编程Arduino板。必威lol

这是这个项目的完整电路示意图。

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

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

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

必威外围提钱披露:这些是会员链接。作为一名亚马逊员工,我通过符合条件的购买获得收入。

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

源代码

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

#包括“FastLED.h”#定义LED数量45#定义LED引脚2#定义颜色顺序GRB CRGB LED[数量LED];void setup(){FastLED.addLeds(LED,NUM_LED);FastLED.setBrightness(亮度);//将45个接近传感器管脚设置为输入,从数字管脚3设置为(int pinNo=0+3;pinNo<=45+3;pinNo++){pinMode(pinNo,INPUT)}}}void loop(){for(int pinNo=0;pinNo<=NUM LED-1;pinNo++{LED[pinNo]=CRGB(0,255,0);//将所有45个led设置为绿色//如果在特定传感器顶部检测到物体,则在以下情况下打开特定led(digitalRead(pinNo+3)=低){led[pinNo]=CRGB(0,0,255);//将反应led设置为蓝色}}FastLED.show();//更新led延迟(20);}

Desctiopion:首先,我们需要定义基本参数,如前所述,并设置45接近传感器引脚作为输入。

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

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

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

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

如果我们看一下应用程序的块,我们可以看到当我们触碰放置调色板图像的画布时发生了什么。使用。getpixelcolor块,我们得到所拾取颜色的红色、绿色和蓝色值,并使用蓝牙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 led [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;//初始亮度字符串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蓝牙模块之间的串行通信,或者模块所连接的引脚。在设置部分,我们需要设置这个模块工作的波特率。然后在主循环中使用Bluetooth.available()函数检查是否有来自智能手机的传入数据。如果这是真的,使用Bluetooth.readString()函数我们接收字符串数据。然后使用. startswith()函数检查第一个字符或标记,以这种方式知道我们是否想要改变活性颜色、背景或亮度。

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

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

29关于“如何使用Arduino控制WS2812B可单独寻址LED”的思考

  1. 非常好的项目,但你能告诉我哪些引脚用于红外传感器,哪些引脚用于数字我与图片混淆(灰色引脚连接和绿色引脚连接),所以你能告诉我灰色和绿色导线的正确连接…谢谢

    回复
      • 谢谢,先生,但是你能告诉我arduino mega里哪个针是红外传感器,哪个r是数字传感器吗,我搞混了…
        示例:在arduino mega board中,我们在ir连接中连接了哪些引脚,在数字(绿线)连接中连接了哪些引脚,请在图中告诉我,因为我对这些ir和数字连接感到困惑……谢谢

        回复
      • 因为在视频中,她连接了许多灰色和绿色的电线到arduino mega,所以你可以告诉我哪些是灰色连接,哪些是绿色连接…谢谢

        回复
  2. 很抱歉反应太晚。问题是我们没有足够的灰色电线来安装所有的红外传感器,而对于其中一些传感器,我们使用了绿色,这可能会让你感到困惑。
    无论如何,IR输出从0到45到Arduino 3到48的数字引脚。至于led,我们只有一个引脚在使用,那就是引脚2。

    回复
  3. 非常感谢你,先生,你们太棒了,你能通过arduino....做一个可以被我们控制的音乐播放器吗(例如:好的jarvis播放轨道我喜欢你)我将非常感谢如果你能使这种类型的项目....再次感谢先生

    回复
  4. 您好dejan先生,您能像amazon echo那样制作谷歌辅助回音设备吗?谁能像amazon echo那样控制我们家的电器、音乐和回复?我会感谢您的……谢谢先生

    回复
  5. 你好

    您能解释一下如何安装和使用快速发光二极管库吗?我不能让它工作,所以我不能让程序工作。

    非常感谢
    抢劫

    回复
    • 就像我在上面的教程中解释的那样,只需要在Arduino代码中更改你正在使用的LED的数量。还要确保你有足够的电源,你需要大约4A 5V电源(60led x 60mA = 3600mA = 3.6A)。

      回复
  6. 嗨,德扬,

    谢谢你张贴此(:
    我正在使用您的项目示例来构建一个不同的个人项目。

    我卡住了)也许你能帮我

    我试图用应用程序点亮ws2812B LED条,我使用了你的Arduino代码。
    由于我没有使用任何红外传感器,因此我从代码中删除了以下行:

    对于(int-pinNo=0+1;pinNo<=2+1;pinNo++){
    pinMode (pinNo,输入);

    for (int pinNo = 0;pinNo < = 2;pinNo + +) {
    LED[pinNo]=CRGB(backR、backG、backB);
    如果(数字读取(pinNo+1)=低){
    LED[pinNo]=CRGB(反应器、反应器G、反应器B);

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

    我想要的是:

    使用app控制WS2812B led带,无需任何输入。如果你能帮我弄清楚我迷路后Arduino代码和MIT App有哪些需要更改的地方,我将非常感激(;

    谢谢

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

      回复
  7. 在此for循环中(第66-69行):
    for (int pinNo = 0;pinNo < = 45;pinNo + +) {
    LED[pinNo]=CRGB(backR、backG、backB);
    如果(数字读取(pinNo+3)=低){
    LED[pinNo]=CRGB(反应器、反应器G、反应器B);

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

    为了使代码在复制和NUM_LEDS的值更改时不太可能中断,您可以考虑将for循环行更新为如下代码:
    for (int pinNo = 0;pinNo < = NUM_LEDS-1;pinNo + +) {

    回复
  8. 你好,Dejan,关于电容类型/尺寸,我需要在WS2812b上使用5V20A的电源,5m 60leds/m:
    我向您报价”,以及一个跨5V和接地约100uF的电容器,以平滑电源”–您能否根据我的电源和led带更具体地说明电容器和wich类型应放置在何处?
    我想这是一个愚蠢的问题,但我不知道,只是开始学习,并希望完成我已经开始的。
    先谢谢你。

    回复
    • 你好,这个电容被称为“旁路”或“去耦”电容。它用于万一有突然下降的电压,然后电路使用存储的电荷从电容器保持电压稳定。
      实际上,对于这些LED来说,这并不是很关键,但使用一个也可以。如果是5m,建议使用100-500uF左右的电压,courese的电压高于5V,所以是16V、25V、35V左右。电容器尽可能靠近LED带,其正极引脚连接到带引脚的正极引脚,负极连接到LED带引脚负极带或接地。

      回复
  9. 你好
    首先,伟大的计划!
    你能给我解释一下子串函数是如何工作的吗?
    尤其是我不理解+1的部分。
    +1是什么意思?

    好心人

    回复
    • 嘿,谢谢!subString函数只提取我们想要的字符串的一部分。下面是你提到的“+1”例子的意思:
      例如,我们从电话中获得的值是R255G220B123。所以用indexOf()函数我们首先定位R字符,在这里是索引1,但是我们想让字符串从下一个索引开始,或者+1,那就是索引2。另一方面,我们希望我们的字符串以G字符结尾(它不包括G字符)。因此,提取的字符串将只有255,然后可以转换成整数值。

      回复
  10. 你好
    我喜欢你的程序和想法,但你在Banggood上链接的RGBW strip不支持FastLed。它只支持RGB条带。Adafruit Neopixel库支持RGBW和RGB条带,但是如果要使用的话,你的程序必须重写。
    我花了一些时间才弄明白。我认为RGBW带有一个错误,但与正确的库它工作良好。
    问候,SveinM

    回复
  11. * * * *的问题
    大家好,很好的教程,我发现它真的很有趣!我对Arduino完全不熟悉,并且做了一些类似的项目。但是我有一个想法,我想尝试使用相同的LED条。bet188me

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

    回复
    • 嘿,谢谢!如果你想控制45个这种类型的led, WS2812B,那么你甚至可以使用最小的Arduino, NANO或PRO MINI。为了控制这些led,你只需要Arduino上的一个数字引脚,当然还有一个专用的电源。

      回复

  12. 伟大的解释!但我有一个问题:

    将5V 4A电源直接连接到Arduino板的5V引脚是否有问题?我想用一个电源为LED条和板供电,但我不确定它是否会烧坏我的板…?

    回复
  13. 你好
    非常好的项目!
    我看到了许多无限项目,并将问你,如何修改代码,以bet188me便它是可能的地址超过1个LED每个传感器。
    当做
    圭多

    回复

留下你的评论