阿杜诺 | RGB LED 灯条控制器
Arduino | RGB LED Strip Controller
我有一个 Arduino UNO,我正在尝试打开和关闭条带的颜色(红色、绿色或蓝色)灯。这是我的代码,但所有灯都亮着。问题是,例如我可能只想显示红色,但我似乎无法关闭任何颜色。我的引脚如下:
- 红色:5
- 绿色:6
- 蓝色:3
我的设置:
默认控制器照片:
相关代码:
int ledPinR = 5;
int ledPinG = 6;
int ledPinB = 3;
void setup() {
pinMode(ledPinR, OUTPUT);
pinMode(ledPinG, OUTPUT);
pinMode(ledPinB, OUTPUT);
}
void loop() {
analogWrite(ledPinR, 0);
analogWrite(ledPinG, 0);
analogWrite(ledPinB, 0);
}
您必须将 pinMode() 添加到设置中。
void setup() {
pinMode(ledPinR, OUTPUT);
pinMode(ledPinG, OUTPUT);
pinMode(ledPinB, OUTPUT);
}
您必须延迟操作,然后再打开或关闭下一盏灯,如下所示:
编辑:适合您情况的完整推子,您可能想在循环中跳过 4,但我会让您处理。
int ledPinR = 5;
int ledPinG = 6;
int ledPinB = 3;
int brightness = 0;
int fade = 5;
void setup() {
pinMode(ledPinR, OUTPUT);
pinMode(ledPinG, OUTPUT);
pinMode(ledPinB, OUTPUT);
}
void loop() {
for(int LED_PIN = 3; LED_PIN<=6; LED_PIN++) {
analogWrite(LED_PIN, brightness); //setting the brightness at LED pin
brightness += fade; //brightness increasE
if(brightness == 0 || brightness == 255){
fade = -fade;
}
delay(30); //time of delay is in miliseconds
}
}
EDIT2:好的,看到了你的设置,我对你想用颜色做的事情还差得很远,不知道我是否应该删除答案,现在是误导。希望延迟有所帮助。
我认为你误解了我在@Secko 的回答下的最后评论,所以这就是我的意思:
int r = 5;
int g = 6;
int b = 3;
void setup() {
pinMode(r, OUTPUT);
pinMode(g, OUTPUT);
pinMode(b, OUTPUT);
}
void loop() {
analogWrite(r, 128);
delay(50);
analogWrite(r, 0);
analogWrite(g, 128);
delay(50);
analogWrite(g, 0);
analogWrite(b, 128);
delay(50);
analogWrite(b, 0);
delay(50);
}
您需要关闭上次打开的颜色才能获得红色、绿色和蓝色的闪烁灯。否则如果你在红色之后打开绿色,条带会短时间变黄。如果您随后打开蓝色,它将变成白色并保持白色,因为不会关闭任何颜色。
第二个参数是施加到你的管脚上的电压。它的范围是 0 - 255,其中 0 是 0V,255 是 5V。 128就在中间,2.5V。
如果你的条带很大(=>3 个 LED 和节能 LED。否则 >1),我希望你使用晶体管来将电流消耗从 arduino 卸载到晶体管。否则你很快就会把 arduino 搞砸了。
编辑:
你可能已经通过从它的引脚拉出太多电流(太多 LED)而烧毁了 arduino。
您需要在每种颜色和能够处理大电流的 arduino 之间放置一个 PNP 晶体管(因为您驱动了很多 LED),这意味着达林顿晶体管阵列集成电路。
我想到了类似 TIP125 的东西。 (https://www.fairchildsemi.com/datasheets/TI/TIP125.pdf)
它的最大集电极电流为5A。把它放在你的 VCC 和条带的中间(VCC 到集电极,条带到发射极)并将 arduino 连接到晶体管的基极。您将需要 3 个,每种颜色一个。
编辑2:
这是一个非常快速制作的示意图,向您展示基础知识。对于一个 12V LED 灯条来说,它应该是完全有效的,单个颜色的电流消耗高达 5A(因此总共 15A)。
尽管如此,您可能希望在晶体管基极上添加电阻以吸收电流。
编辑 3:
由于您可能不熟悉电子产品:如果基极较低,PNP 晶体管将启用集电极和发射极之间的连接。含义:analogWrite(r, 0)
将打开条带上的颜色,而 analogWrite(r, 255)
将关闭它。它与中间的晶体管倒置。
此外,我希望这是显而易见的,请勿通过面包板或细线为每种颜色布线 5A。他们会冒烟。
我遇到了同样的问题。我的问题是我在晶体管上反转了发射极和集电极接线。
对于 showp1984 建议的 TIP125 晶体管,您需要确保 LED 灯带连接到发射极引脚,集电极引脚必须连接到 Arduino GND .将晶体管的基极连接到 Arduino 输出引脚(见下文)。使用一个 1K 欧姆的电阻来连接 Base。
这是我的设置:
- 3x 晶体管 TIP125 达林顿
- 1 个 Arduino Nano
- 1x 12V LED 灯条
- 3x 1KiloOhm 电阻器
接线
每种 LED 颜色(R、G、B)使用一个晶体管:
红色
- 晶体管底座 --> 电阻器 --> Arduino PIN D5
- 晶体管集电极 --> Arduino GND
- 晶体管发射极 --> LED 红色
绿色
- 晶体管底座 --> 电阻器 --> Arduino PIN D6
- 晶体管集电极 --> Arduino GND
- 晶体管发射极 --> LED 绿色
蓝色
- 晶体管底座 --> 电阻器 --> Arduino PIN D3
- 晶体管集电极 --> Arduino GND
- 晶体管发射极 --> LED 蓝色
代码
// color swirl! connect an RGB LED to the PWM pins as indicated
// in the #defines
// public domain, enjoy!
#define REDPIN 5
#define GREENPIN 6
#define BLUEPIN 3
#define FADESPEED 5 // make this higher to slow down
void setup() {
pinMode(REDPIN, OUTPUT);
pinMode(GREENPIN, OUTPUT);
pinMode(BLUEPIN, OUTPUT);
}
void loop() {
int r, g, b;
// fade from blue to violet
for (r = 0; r < 256; r++) {
analogWrite(REDPIN, r);
delay(FADESPEED);
}
// fade from violet to red
for (b = 255; b > 0; b--) {
analogWrite(BLUEPIN, b);
delay(FADESPEED);
}
// fade from red to yellow
for (g = 0; g < 256; g++) {
analogWrite(GREENPIN, g);
delay(FADESPEED);
}
// fade from yellow to green
for (r = 255; r > 0; r--) {
analogWrite(REDPIN, r);
delay(FADESPEED);
}
// fade from green to teal
for (b = 0; b < 256; b++) {
analogWrite(BLUEPIN, b);
delay(FADESPEED);
}
// fade from teal to blue
for (g = 255; g > 0; g--) {
analogWrite(GREENPIN, g);
delay(FADESPEED);
}
}
观察
这里还有一些我遇到的障碍,我花了一些时间才弄清楚。
反转值
- 在使用 TIP125 时,您实际上需要将输出 PIN 设置为 255 以关闭该 PIN,并将其设置为 0 以启动它:
analogWrite(REDPIN, 255); //RED is off
analogWrite(REDPIN, 0); //RED is on
晶体管散热器短路
这听起来很明显,但我花了好几个小时。我在面包板上测试这个设置,三个晶体管散热器中的两个向后倾斜,刚好可以与电阻腿轻微接触。这实际上是连接到这些晶体管的 LED 意外点亮的主要原因之一...
我有一个 Arduino UNO,我正在尝试打开和关闭条带的颜色(红色、绿色或蓝色)灯。这是我的代码,但所有灯都亮着。问题是,例如我可能只想显示红色,但我似乎无法关闭任何颜色。我的引脚如下:
- 红色:5
- 绿色:6
- 蓝色:3
我的设置:
默认控制器照片:
相关代码:
int ledPinR = 5;
int ledPinG = 6;
int ledPinB = 3;
void setup() {
pinMode(ledPinR, OUTPUT);
pinMode(ledPinG, OUTPUT);
pinMode(ledPinB, OUTPUT);
}
void loop() {
analogWrite(ledPinR, 0);
analogWrite(ledPinG, 0);
analogWrite(ledPinB, 0);
}
您必须将 pinMode() 添加到设置中。
void setup() {
pinMode(ledPinR, OUTPUT);
pinMode(ledPinG, OUTPUT);
pinMode(ledPinB, OUTPUT);
}
您必须延迟操作,然后再打开或关闭下一盏灯,如下所示:
编辑:适合您情况的完整推子,您可能想在循环中跳过 4,但我会让您处理。
int ledPinR = 5;
int ledPinG = 6;
int ledPinB = 3;
int brightness = 0;
int fade = 5;
void setup() {
pinMode(ledPinR, OUTPUT);
pinMode(ledPinG, OUTPUT);
pinMode(ledPinB, OUTPUT);
}
void loop() {
for(int LED_PIN = 3; LED_PIN<=6; LED_PIN++) {
analogWrite(LED_PIN, brightness); //setting the brightness at LED pin
brightness += fade; //brightness increasE
if(brightness == 0 || brightness == 255){
fade = -fade;
}
delay(30); //time of delay is in miliseconds
}
}
EDIT2:好的,看到了你的设置,我对你想用颜色做的事情还差得很远,不知道我是否应该删除答案,现在是误导。希望延迟有所帮助。
我认为你误解了我在@Secko 的回答下的最后评论,所以这就是我的意思:
int r = 5;
int g = 6;
int b = 3;
void setup() {
pinMode(r, OUTPUT);
pinMode(g, OUTPUT);
pinMode(b, OUTPUT);
}
void loop() {
analogWrite(r, 128);
delay(50);
analogWrite(r, 0);
analogWrite(g, 128);
delay(50);
analogWrite(g, 0);
analogWrite(b, 128);
delay(50);
analogWrite(b, 0);
delay(50);
}
您需要关闭上次打开的颜色才能获得红色、绿色和蓝色的闪烁灯。否则如果你在红色之后打开绿色,条带会短时间变黄。如果您随后打开蓝色,它将变成白色并保持白色,因为不会关闭任何颜色。
第二个参数是施加到你的管脚上的电压。它的范围是 0 - 255,其中 0 是 0V,255 是 5V。 128就在中间,2.5V。
如果你的条带很大(=>3 个 LED 和节能 LED。否则 >1),我希望你使用晶体管来将电流消耗从 arduino 卸载到晶体管。否则你很快就会把 arduino 搞砸了。
编辑: 你可能已经通过从它的引脚拉出太多电流(太多 LED)而烧毁了 arduino。
您需要在每种颜色和能够处理大电流的 arduino 之间放置一个 PNP 晶体管(因为您驱动了很多 LED),这意味着达林顿晶体管阵列集成电路。
我想到了类似 TIP125 的东西。 (https://www.fairchildsemi.com/datasheets/TI/TIP125.pdf)
它的最大集电极电流为5A。把它放在你的 VCC 和条带的中间(VCC 到集电极,条带到发射极)并将 arduino 连接到晶体管的基极。您将需要 3 个,每种颜色一个。
编辑2: 这是一个非常快速制作的示意图,向您展示基础知识。对于一个 12V LED 灯条来说,它应该是完全有效的,单个颜色的电流消耗高达 5A(因此总共 15A)。
尽管如此,您可能希望在晶体管基极上添加电阻以吸收电流。
编辑 3:
由于您可能不熟悉电子产品:如果基极较低,PNP 晶体管将启用集电极和发射极之间的连接。含义:analogWrite(r, 0)
将打开条带上的颜色,而 analogWrite(r, 255)
将关闭它。它与中间的晶体管倒置。
此外,我希望这是显而易见的,请勿通过面包板或细线为每种颜色布线 5A。他们会冒烟。
我遇到了同样的问题。我的问题是我在晶体管上反转了发射极和集电极接线。
对于 showp1984 建议的 TIP125 晶体管,您需要确保 LED 灯带连接到发射极引脚,集电极引脚必须连接到 Arduino GND .将晶体管的基极连接到 Arduino 输出引脚(见下文)。使用一个 1K 欧姆的电阻来连接 Base。
这是我的设置:
- 3x 晶体管 TIP125 达林顿
- 1 个 Arduino Nano
- 1x 12V LED 灯条
- 3x 1KiloOhm 电阻器
接线
每种 LED 颜色(R、G、B)使用一个晶体管:
红色
- 晶体管底座 --> 电阻器 --> Arduino PIN D5
- 晶体管集电极 --> Arduino GND
- 晶体管发射极 --> LED 红色
绿色
- 晶体管底座 --> 电阻器 --> Arduino PIN D6
- 晶体管集电极 --> Arduino GND
- 晶体管发射极 --> LED 绿色
蓝色
- 晶体管底座 --> 电阻器 --> Arduino PIN D3
- 晶体管集电极 --> Arduino GND
- 晶体管发射极 --> LED 蓝色
代码
// color swirl! connect an RGB LED to the PWM pins as indicated
// in the #defines
// public domain, enjoy!
#define REDPIN 5
#define GREENPIN 6
#define BLUEPIN 3
#define FADESPEED 5 // make this higher to slow down
void setup() {
pinMode(REDPIN, OUTPUT);
pinMode(GREENPIN, OUTPUT);
pinMode(BLUEPIN, OUTPUT);
}
void loop() {
int r, g, b;
// fade from blue to violet
for (r = 0; r < 256; r++) {
analogWrite(REDPIN, r);
delay(FADESPEED);
}
// fade from violet to red
for (b = 255; b > 0; b--) {
analogWrite(BLUEPIN, b);
delay(FADESPEED);
}
// fade from red to yellow
for (g = 0; g < 256; g++) {
analogWrite(GREENPIN, g);
delay(FADESPEED);
}
// fade from yellow to green
for (r = 255; r > 0; r--) {
analogWrite(REDPIN, r);
delay(FADESPEED);
}
// fade from green to teal
for (b = 0; b < 256; b++) {
analogWrite(BLUEPIN, b);
delay(FADESPEED);
}
// fade from teal to blue
for (g = 255; g > 0; g--) {
analogWrite(GREENPIN, g);
delay(FADESPEED);
}
}
观察
这里还有一些我遇到的障碍,我花了一些时间才弄清楚。
反转值
- 在使用 TIP125 时,您实际上需要将输出 PIN 设置为 255 以关闭该 PIN,并将其设置为 0 以启动它:
analogWrite(REDPIN, 255); //RED is off
analogWrite(REDPIN, 0); //RED is on
晶体管散热器短路
这听起来很明显,但我花了好几个小时。我在面包板上测试这个设置,三个晶体管散热器中的两个向后倾斜,刚好可以与电阻腿轻微接触。这实际上是连接到这些晶体管的 LED 意外点亮的主要原因之一...