在本教程中,我们将学习如何使用Arduino控制单独可寻址的RGB LED或WS2812B LED带。你可以观看下面的视频或阅读下面的书面教程了解更多细节。
首先,我们将通过一些基本示例解释工作原理,然后使用这些LED来看真正酷的Arduino项目,DIY交互式LED咖啡桌。咖啡桌具有WS2812B LED,红外接近传感器,用于检测对象和HC-05蓝牙模块,用于通过自定义构建Android应用程序控制颜色。这个项目实际上是我和我之间的合作Marija来自创意英雄YouTube频道.
WS2812B led如何工作
让我们开始仔细看看LED条带。它包括5050型RGB LED,其中集成了非常紧凑的WS2812B LED驱动器IC。
根据红、绿、蓝三种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编程,我们将使用错了图书馆.这是一个优秀的和良好的文档库,使易于控制WS2812B led。
你可以从下面的链接中获得这个例子所需的组件:
- WS2812B LED条.....................亚马逊/伯格多德/阿里巴巴全球速卖通
- Arduino Board .................................亚马逊/伯格多德/阿里巴巴全球速卖通
- 5V 6A直流电源..................亚马逊/伯格多德/阿里巴巴全球速卖通
必威外围提钱披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。
这是Arduino源代码的第一个例子:
#include#define LED_PIN 7 #define NUM_LEDS 20 CRGB led [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:因此,首先,我们需要包括错配库,定义LED条数据连接的引脚,定义LED的数量,以及定义CRGB类型的阵列。此类型包含LED,其中三个红色,绿色和蓝色频道中的每一个具有三个单字节数据成员。
在设置部分中,我们只需初始化上面定义的参数的标记。现在它是我们想要控制我们的LED的主循环。使用CRGB功能,我们可以使用红色,绿色和蓝色的三个参数设置任何导致任何颜色。为了使我们在LED上发生变化,我们需要将函数紧张.Show()。
示例2
使用一些“for”循环,我们可以轻松制作一些动画。
下面是第二个例子的Arduino源代码:
#include#define LED_PIN 7 #define NUM_LEDS 20 CRGB led [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);}}
这里的第一个“用于”循环点亮了所有20个LED的蓝色,从第一个到最后一个LED,延迟了40毫秒。接下来的“for”循环再次亮起所有20个LED,但这一次以红色和相反的顺序,从最后到第一个LED。
FastLED库提供了许多其他功能,这些功能可以用来制作有趣的动画和灯光秀,所以只有依靠你的想象力才能让你的下一个LED项目发光。
使用WS2812B LED的交互式LED咖啡桌
现在让我们来看看我在开始提到的DIY互动LED咖啡桌项目。这是我和创意英雄的Marija的一个合作项目。
你可以查看她的网站文章,她解释了制作这张桌子的整个过程,从切割和组装木质结构,到焊接和连接所有电子部件。必威lol下面我将讲解电子部分是如何工作的,如何构建定制的Andr必威loloid应用程序以及如何对Arduino板进行编程。
这是这个项目的完整电路原理图。
因此,该表格由45个可寻址led, 45个红外接近传感器和HC-05蓝牙模块组成,所有这些模块都连接到Arduino Mega板。电路由5V 6A电源供电。
你可以从下面的链接中获得这个例子所需的组件:
- WS2812B LED条.....................亚马逊/伯格多德/阿里巴巴全球速卖通
- 红外接近传感器........................亚马逊/伯格多德/阿里巴巴全球速卖通
- HC-05蓝牙模块...... ......亚马逊/伯格多德/阿里巴巴全球速卖通
- Arduino Board .................................亚马逊/伯格多德/阿里巴巴全球速卖通
- 5V 6A直流电源..................亚马逊/伯格多德/阿里巴巴全球速卖通
必威外围提钱披露:这些是联盟链接。作为亚马逊助理,我从合格购买中获得。
源代码
这是这个项目的Arduino代码,如果我们排除蓝牙颜色控制功能,我们可以注意到代码实际上非常简单。
#include "FastLED.h" #define NUM_LEDS 45 #define LED_PIN 2 #define COLOR_ORDER GRB CRGB led [NUM_LEDS];void setup(){fastled.adleds(LED,NUM_LEDS);FastLED.setBrightness(亮度);//设置45个接近传感器引脚作为输入,从数字引脚3到引脚48为(int pinNo = 0 + 3;> = 0;pinNo++) {pinMode(pinNo, INPUT);}} void loop() {for (int pinNo = 0;pinNo < = NUM_LEDS-1;pinNo++) {leds[pinNo] = CRGB(0,255,0);//设置所有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。最后,我们使用FastLED.show()函数更新led的颜色。
为了包括蓝牙颜色控制功能,我们需要添加更多的代码行,以及使Android应用程序。我已经有单独的教程如何使用HC-05蓝牙模块与Arduino和如何使用MIT App Inventor Online应用程序制作自己的Android应用程序,所以你可以随时查看更多细节。
以下是Android应用程序的工作原理。它包括一个调色板图像,从那里我们可以挑选颜色,两个检查按钮,从那里我们可以选择所选的颜色将应用到反应或背景led和一个调节亮度的滑块。
如果我们看一下应用程序的块,我们可以看到当我们触碰放置调色板图像的画布时发生了什么。使用。getpixelcolor块,我们得到所拾取颜色的红色、绿色和蓝色值,并使用蓝牙SendText块,我们以文本形式将这些信息发送到Arduino。
根据选定的复选框,我们发送不同的第一个字符或标记,这有助于在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蓝牙模块之间的串行通信,或者模块所连接的引脚。在设置部分,我们需要设置这个模块工作的波特率。然后在主循环中使用Bluetooth.available()函数检查是否有来自智能手机的传入数据。如果这是真的,使用Bluetooth.readString()函数我们接收字符串数据。然后使用. startswith()函数检查第一个字符或标记,以这种方式知道我们是否想要改变活性颜色、背景或亮度。
使用.substring()函数,我们从接收的文本中提取Red、Green和Blue值,并将它们转换为整数。这些值随后在下面的“for”循环中使用,如前所述,该循环设置颜色并点亮led。同样地,我们调整led的亮度。
这就是本教程的全部内容。欢迎在下面的评论部分提出任何问题。
非常好的项目,但你能告诉我哪些针是红外传感器,哪些是数字传感器吗?我对图片有点迷惑(灰色针连接和绿色针连接),所以你能告诉我灰色和绿色线的正确连接方式....谢谢
在电路原理图中,灰色的电线连接到每个红外传感器,绿色的电线连接到Arduino到第一个LED,然后再连接到下一个LED。
谢谢,先生,但是你能告诉我arduino mega里哪个针是红外传感器,哪个r是数字传感器吗,我搞混了…
示例:在Arduino Mega Loard,我们在IR连接中连接的销钉,用于数字(绿色电线)连接可以让你在图中告诉我我在这些IR和数字连接中迷惑了......谢谢
Becoz在视频中,她将许多灰色和绿色的电线连接到Arduino Mega所以你可以扰乱,告诉我哪些针灰色连接,绿色......谢谢
等你的回复......
回复晚了非常抱歉。问题是,我们对所有IR传感器的灰色电线没有足够的灰色电线,以及我们使用的一些人使用绿色,这可能会让你混淆。
无论如何,IR输出从0到45到Arduino 3到48的数字引脚。至于led,我们只有一个引脚在使用,那就是引脚2。
非常感谢你,先生,你们太棒了,你能通过arduino....做一个可以被我们控制的音乐播放器吗(例如:好的jarvis播放轨道我喜欢你)我将非常感谢如果你能使这种类型的项目....再次感谢先生
你好,dejan先生,你能制造像亚马逊echo那样的谷歌辅助echo设备吗?它可以控制我们的家用电器,音乐,还可以像亚马逊echo那样回复
你好,
您能解释如何获得快速LED库和工作吗?我无法达到这个工作,所以我无法获得工作的程序。
非常感谢
抢劫
只要确保将FAST LED库包含到Arduino库目录中即可。
在我的led条上有60个led,我如何使用它们?
就像我在上面的教程中解释的那样,只需要在Arduino代码中更改你正在使用的LED的数量。还要确保你有足够的电源,你需要大约4A 5V电源(60led x 60mA = 3600mA = 3.6A)。
嗨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)==低){
led [pinNo] = CRGB(reactiveR, reactiveG, reactiveB);
但是我不能让它改变颜色。
我很乐意得到的是:
使用APP控制WS2812B LED条带没有任何输入。如果您能够帮助我清除Arduino代码和MIT应用程序以来,我会非常欣赏,因为我迷路了(;
谢谢
在这种情况下,同样的应用程序,你只能在同一时间改变所有led的颜色。
因此,您仍然可以使用“acctiver / g / b”变量来设置颜色,因此正确而不是您提到的代码,您可以使用简单的A for循环来激活所有LED的“acctiver / g /B“变量值。就像是:
for(int pinno = 0; pinno <= 45; pinno ++){led [pinNo] = CRGB(reactiveR, reactiveG, reactiveB);这应该可以工作,尽管我现在不能测试它。
在此为循环(第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 ++){
谢谢你的输入,这是一个很好的输入。我已经更新了帖子。实际上它甚至可以仅说“Pinno
第33行也可以更新为使用变量NUM_LEDS。
你好,Dejan,关于电容类型/尺寸,我需要在WS2812b上使用5V20A的电源,5m 60leds/m:
我引用你的话“,以及一个大约100uF的电容穿过5V和接地来平滑电源”-你能不能更具体地说一下,根据我的电源和led带,电容和电容的具体位置应该放在哪里?
我想这是一个愚蠢的问题,但我不知道,只是开始学习,并希望完成我已经开始的。
先谢谢你。
在那里,这个电容称为“旁路”或“去耦”电容。在电压突然下降的情况下,电路使用来自电容器的存储电荷以保持电压稳定。
实际上它对这些LED来说并不重要,但它可以使用一个。如果为5米,建议使用大约100-500U的东西,在5V上方的电压,因此16V,25V,35V等。电容器尽可能接近LED条带,并且其正销进入条带销的正销和负条或GND。
你好,
首先,伟大的projekt!
你能解释一下subString函数是如何工作的吗?
特别是我不明白的部分与+1。
+1是什么意思?
种reguards
嘿,谢谢!子字符串函数仅提取我们想要的字符串的一部分。以下是您提到的“+1”部分的示例的含义:
例如,我们从电话中获得的值是R255G220B123。所以用indexOf()函数我们首先定位R字符,在这里是索引1,但是我们想让字符串从下一个索引开始,或者+1,那就是索引2。另一方面,我们希望我们的字符串以G字符结尾(它不包括G字符)。因此,提取的字符串将只有255,然后可以转换成整数值。
你好
我喜欢你的程序和想法,但你在Banggood上链接的RGBW strip不支持FastLed。它只支持RGB条带。Adafruit Neopixel库支持RGBW和RGB条带,但是如果要使用的话,你的程序必须重写。
我花了一些时间才弄明白。我认为RGBW带有一个错误,但与正确的库它工作良好。
问候,SveinM
谢谢你指出来。我已经更新了链接到正确的RGB条带。
* * * *的问题
嗨,伟大的教程我发现它真的很有趣!我对Arduino完全是新的,并做了一些这样的项目。bet188me但有一个想法,我想尝试涉及相同的LED条带。
我的问题是Arduino本身以及有多少不同的模块,但是对于一个类似的项目,我想控制45个LED我需要一个Arduino Mega?或者可以使用更便宜的模块(如uno),如果是这样哪一个?
嘿,谢谢!如果你想控制45个这种类型的led, WS2812B,那么你甚至可以使用最小的Arduino, NANO或PRO MINI。为了控制这些led,你只需要Arduino上的一个数字引脚,当然还有一个专用的电源。
嘿,
伟大的解释!但我有一个问题:
是否存在将5V 4A电源直接连接到Arduino Boards 5V引脚的问题?我想用一个电源为LED条带和电路板供电,但我不确定它是否会炸我的电路板......?
嘿,谢谢!是的,你可以通过Arduino 5V引脚用5V 4A电源给Arduino供电。
你好
非常好的项目!
我看到了很多无限的项目,并会问你,如何修改代码,bet188me以便每个传感器都可以解决更多的1个led。
问候
Guido.
确保您可以控制每个传感器的更多LED。这完全是关于调整代码。