如何使用Arduino控制WS2812B单独寻址led

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

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

创意英雄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的数据输出pad与下一LED的数据输入pad相连。我们可以把条带切成任何我们想要的尺寸,也可以用一些电线来拉开led灯的距离。

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

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

Arduino和WS2812B LED示例

示例1

现在,我将使用20个LED长条,通过330欧姆电阻连接到Arduino,并使用单独的5V电源供电,如上所述。为了编程Arduino,我们将使用错配图书馆。这是一个优秀且文档丰富的库,可以轻松地控制WS2812B led。

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

必威外围提钱披露:这些是附属链接。作为一名亚马逊助理,我的收入来自符合条件的购买。

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

#include  #define LED_PIN 7 #define NUM_LEDS 20 CRGB leds[NUM_LEDS];void setup() {FastLED。addLeds(leds, NUM_LEDS);} void loop() {leds[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:因此,首先,我们需要包括错配库,定义LED条数据连接的引脚,定义LED的数量,以及定义CRGB类型的阵列。此类型包含LED,其中三个红色,绿色和蓝色频道中的每一个具有三个单字节数据成员。

在setup小节中,我们只需要用上面定义的参数初始化FastLED。现在它是主循环,我们可以以任何我们想要的方式控制我们的led。使用CRGB函数,我们可以使用红、绿、蓝三个参数将任何LED设置为任何颜色。为了对led进行更改,我们需要调用函数FastLED.show()。

示例2

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

Arduino和WS2812B示例2

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

#include  #define LED_PIN 7 #define NUM_LEDS 20 CRGB leds[NUM_LEDS];void setup() {FastLED。addLeds(leds, NUM_LEDS);} void loop() {for (int i = 0;我< = 19;i++) {leds[i] = CRGB (0,0,255);FastLED.show ();延迟(40);} for (int i = 19;我> = 0; i--) { leds[i] = CRGB ( 255, 0, 0); FastLED.show(); delay(40); } }

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

FastLED库提供了许多其他的功能,可以用来制作真正有趣的动画和灯光展示,所以你只需要发挥你的想象力,让你的下一个LED项目发光。

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

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

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

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

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

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

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

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

必威外围提钱披露:这些是附属链接。作为一名亚马逊助理,我的收入来自符合条件的购买。

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

源代码

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

#define GRB CRGB leds[NUM_LEDS] #define COLOR_ORDER GRB CRGB leds[NUM_LEDS];void setup(){fastled.adleds (LED,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++) {leds[pinNo] = CRGB(0,255,0);If (digitalRead(pinNo + 3) == LOW) {LEDs [pinNo] = CRGB(0,0,255); //设置所有45个led为绿色//如果在特定的传感器上检测到一个对象,打开特定的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); }

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

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

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

这是Android应用程序的工作原理。它包括从我们可以在哪里拾取颜色的颜色调色板图像,两个检查按钮我们可以选择所选颜色是否适用于反应性或背景LED以及用于调节亮度的滑块。

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

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

LED表Android应用程序块

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

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

这是Arduino代码:

#include  #include“fiteble.h”#define num_leds 45 #define led_pin 2 #define color_order grg crg cr gb lets [num_leds];软件版蓝牙(53,52);// Arduino(RX,TX) - 蓝牙(TX,RX)//初始背景颜色INT Backr = 100;int backg = 50;int backb = 10;//初始反应颜色int activer = 10;int反弹= 50;int reastiveb = 100;INT亮度= 50;//初始亮度字符串数据=“”; 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蓝牙模块之间的串行通信,或者模块连接到的引脚。在setup部分,我们需要设置此模块工作的波特率。然后在主循环中使用Bluetooth.available()函数检查是否有来自智能手机的传入数据。如果是这样,则使用Bluetooth.readString()函数将数据作为字符串接收。然后使用. startswith()函数检查第一个字符或标记,这样就知道我们是否想要改变反应色、背景或亮度。

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

以上就是本教程的全部内容。请在下面的评论部分提出任何问题。

29日回复

  1. 杰克

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

    回复
    • 德扬Nedelkovski

      在电路示意图中,灰色的线连接到每个红外传感器,绿色的线从Arduino连接到第一个LED,然后从上一个LED连接到下一个LED。

      回复
      • 杰克

        谢谢先生,但你能在Arduino Mega告诉我哪个引脚是针对红外传感器的销钉,而且数字是我困惑的数字......
        例如:在arduino mega board中,我们连接的是哪些引脚是ir连接的,哪些是数字(绿线)连接的,请plzz告诉我,因为在图中我对这些ir和数字连接感到困惑.....谢谢

      • 杰克

        Becoz在视频中,她将许多灰色和绿色的电线连接到Arduino Mega所以你可以扰乱,告诉我哪些针灰色连接,绿色......谢谢

  2. 德扬Nedelkovski

    很抱歉回复晚了。问题是我们没有足够的灰线来处理所有的红外传感器,有些我们用的是绿色的,这可能是让你们迷惑的地方。
    无论如何,IR输出从0到45转到Arduino 3到48的数字引脚。对于LED,我们只使用一个引脚,这是PIN编号2。

    回复
  3. 杰克

    谢谢你太棒了,你们啊,你们可以让你能够控制的音乐播放器(例如:OK Jarvis播放我喜欢eminem的追踪)通过Arduino ......如果你能做出这种类型的项目,我会非常感谢......谢谢谢谢

    回复
  4. 杰克

    你好,dejan先生,你能做像amazon echo这样的谷歌辅助echo设备吗?它可以控制我们的家用电器,音乐,回复像amazon echo一样

    回复
  5. 罗伯特。

    你好,

    你能解释一下如何安装和工作快速LEd库吗?我不能让这个工作,所以我不能让程序工作。

    非常感谢
    抢劫

    回复
    • 德扬Nedelkovski

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

      回复
  6. 爱丽儿

    嗨Dejan,

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

    我卡住了):也许你可以帮助我

    我尝试用应用程序点亮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) == LOW) {
    led [pinNo] = CRGB(reactiveR, reactiveG, reactiveB);

    但我无法改变颜色。

    我很乐意得到的是:

    使用APP控制WS2812B LED条带没有任何输入。如果您能够帮助我清除Arduino代码和MIT应用程序以来,我会非常欣赏,因为我迷路了(;

    谢谢

    回复
    • 德扬Nedelkovski

      嘿,在这种情况下,同一个应用程序,你只能改变所有led的颜色在同一时间为相同的颜色。
      因此,您仍然可以使用“acctiver / g / b”变量来设置颜色,因此正确而不是您提到的代码,您可以使用简单的A for循环来激活所有LED的“acctiver / g /B“变量值。就像是:
      for(int pinno = 0; pinno <= 45; pinno ++){led [pinNo] = CRGB(reactiveR, reactiveG, reactiveB);这应该可以工作,尽管我现在不能测试它。

      回复
  7. 马克

    在这个for循环中(第66-69行):
    for(int pinno = 0; pinno <= 45; pinno ++){
    led [pinNo] = CRGB(backR, backG, backB);
    if (digitalRead(pinNo + 3) == LOW) {
    led [pinNo] = CRGB(reactiveR, reactiveG, reactiveB);

    当Pinno为45时,它会尝试将像素数据写入LED [45],因为num_leds为45(即,您只有LED [0]对LED [44])。将数据写入不存在的像素通常会导致在内存中发生的不良事物,随机像素闪烁,甚至代码执行锁定。

    为了使代码在复制和改变NUM_LEDS的值时不太可能出错,你可以考虑将for循环行更新为这样:
    for(int pinno = 0; pinno <= num_leds-1; pinno ++){

    回复
    • 德国

      谢谢你的建议,很好。我已经更新了这篇文章。实际上,如果符号只是“<”而不是“<=”,甚至可以只声明“pinNo < NUM_LEDS;”而不使用“-1”。

      回复
  8. Bogdan Asanache

    你好,Dejan,只有一个关于电容类型/大小的问题,我需要在WS2812b上使用5V20A的电源,5m 60leds/m:
    我给你报价“,以及一个大约100uF的电容,通过5V和地面平滑电源”-你能更具体地说一下电容应该放在哪里,哪个类型根据我的电源和led条?
    我猜是一个愚蠢的问题,但我不知道,刚开始学习并希望完成我开始的东西。
    先感谢您 。

    回复
    • 德国

      在那里,这个电容称为“旁路”或“去耦”电容。在电压突然下降的情况下,电路使用来自电容器的存储电荷以保持电压稳定。
      实际上,这对这些led来说并不是那么关键,但是使用一个就可以了。5m时建议使用100-500uF左右,电压当然在5V以上,所以16V、25V、35V左右。电容器被放置在尽可能接近的LED带,它的正极引脚到带引脚的正极引脚和负极带或GND。

      回复
  9. 菲利普

    你好,
    首先,伟大的项目!
    你能不能给我解释一下子串函数是如何工作的?
    特别是我不懂+1的部分。
    +1意味着什么?

    种reguards

    回复
    • 德国

      嘿,谢谢!子字符串函数仅提取我们想要的字符串的一部分。以下是您提到的“+1”部分的示例的含义:
      我们从手机中获得的值是例如R255G220B123。So with the indexOf() function we first locate the R character, and that’s index 1 in this case, but with want our string to start from the next index, or +1 and that’s index 2. And on the other hand we want our string to end at the G character (it won’t include the G char). So the extracted string will be just 255 which can be then converted into integer value.

      回复
  10. Svein-Martin霍尔特


    我喜欢你的程序和想法,但你在Banggood上链接的RGBW Strip不受盗窃。它只支持RGB条带。Adafruit Neopixel Library支持RGBW和RGB条,但如果应该使用该程序,则必须重写您的程序。
    我花了些时间才弄明白。我认为RGBW带有一个错误,但与正确的库,它工作得很好。
    问候,SveinM

    回复
  11. * * * *的问题
    你好,很棒的教程,我发现它真的很有趣!我是Arduino的新手,做过这样的项目。bet188me但有一个想法,我想尝试涉及相同的LED条。

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

    回复
    • 德国

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

      回复
  12. Marko

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

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

    回复
  13. 圭多


    非常好的项目!
    我看到了很多无限的项目,并会问你,如何修改代码,bet188me以便每个传感器都可以解决更多的1个led。
    问候
    圭多

    回复

发表评论

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

受到推崇的

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

为初学者和爱好者最好的示波器

受到推崇的

8个最好的Arduino入门工具包,适合2019年初学者

8个最好的ARDUINO初学者工具包

受到推崇的

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

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