Arduino教程 05 炫彩RGB LED「DFR0100」

2014-05-2715.2万
AI 快速预览详细 收起
本篇Arduino教程介绍了如何使用DFR0100入门套件中的RGB LED创建炫彩灯光效果。项目包括元件清单、硬件连接图和示例代码。通过定义三个引脚并设置为输出模式,主函数中调用colorRGB()函数生成随机颜色。此外,还详细解释了constrain()和random()函数的使用方法,并提供了课后练习,如实现彩虹色变化和呼吸灯效果。
【本篇课程内容于 2024年9月3日更新】

项目 - 炫彩LED

这个项目介绍一种新的LED——RGB LED。
之所以叫RGB,是因为这个LED是由红(Red)、绿(Green)和蓝(Blue)三色组成。我们电脑的显示器也是由一个个小的红、绿、蓝点组成的。可以通过调整三个LED中每个灯的亮度就能产生不同的颜色。这个项目就是教你通过一个RGB小灯随机产生不同的炫彩颜色。找出所需元件,按下图连接硬件并输入代码。

元件清单
Arduino教程 05 炫彩RGB LED「DFR0100」图1

硬件连接

连接之前,先判别RGB是共阴还是共阳,如果不是很清楚的,可以先跳到这个项目的硬件部分介绍。连接时,还需注意一点,引脚的顺序,可参照左边的引脚图。

Arduino教程 05 炫彩RGB LED「DFR0100」图2
图 1 炫彩LED硬件连接图

示例代码
样例代码:

  1. //项目 – 炫彩RGB
  2. int redPin = 9;
  3. int greenPin = 10;
  4. int bluePin = 11;
  5. void setup(){
  6.      pinMode(redPin, OUTPUT);
  7.      pinMode(greenPin, OUTPUT);
  8.      pinMode(bluePin, OUTPUT);
  9. }
  10. void loop(){
  11.     colorRGB(random(0,255),random(0,255),random(0,255)); //R:0-255 G:0-255 B:0-255
  12.     delay(1000);
  13. }
  14. void colorRGB(int red, int green, int blue){
  15.      analogWrite(redPin,constrain(red,0,255));
  16.      analogWrite(greenPin,constrain(green,0,255));
  17.      analogWrite(bluePin,constrain(blue,0,255));
  18. }
复制代码

代码下载完成后,我们可以看到LED颜色呈现随机的变化,不只是单一的一种颜色。

代码回顾
来分析一下,其实一个RGB灯,就是我们前面讲的单色LED的结合体,内部集成了三个LED,也就需要用三个数字PWM口来控制。在我们程序开头部分可以看到定义了三个引脚,并设置为输出模式。
主函数中调用了一个自己创建的函数colorRGB(),函数有三个传递参数,用于写入Red、Green、Blue的值,也就是0~255的值。
使用函数的好处在于,之后我们想调到某个颜色的时候,只有直接给这三个参数赋值就可以了。不需要重复写analogWrite()函数,使程序变得冗长。

这段函数中,我们比较陌生的就是constrain()和random()这两个函数。

函数格式如下:

Arduino教程 05 炫彩RGB LED「DFR0100」图3

constrain()函数需要3个参数:x、a和b。这里x是一个被约束的数,a是最小值,b是最大值。如果值小于a,则返回a。如果大于b,则返回b。

回到我们的程序,red、green、blue值是被约束数,约束范围在0~255,也就是我们PWM值的范围。它们的值来源于random()函数随机产生。
函数格式如下:

Arduino教程 05 炫彩RGB LED「DFR0100」图4

random()函数用于生成一个随机数,min是随机数的最小值,max是随机数的最大值。如果想知道random()函数的其他用法,可以参看手册


硬件回顾

RGB灯

RGB灯有4个引脚,R、G、B三个引脚连接到信号传输口上,还有一个引脚是共用的正极(阳)或者共用的负极(阴)。我们这里选用的是共阴RGB。图2展示了三个LED如何华丽蜕变为一个RGB LED的过程,R、G、B其实就是三个 LED的正极,把它们的负极拉到一个公共引脚上了,它们公共引脚是负极,所以称之为共阴RGB。

RGB灯如何使用?如何实现变色?

RGB只是简单的把三个颜色的LED灯封装在一个LED中,只要当做三个灯使用就可以了。我们都知道红色、绿色、蓝色是三原色,Arduino通过PWM口对三种颜色明暗的调节,即analogWrite(value)语句,就能让RGB LED调出任何你想要的颜色。

Arduino教程 05 炫彩RGB LED「DFR0100」图5
图 2 三个LED蜕变成一个RGB的过程

Arduino教程 05 炫彩RGB LED「DFR0100」图6
图 3 混合RGB产生不同颜色

表1只是展示了几种典型的混合颜色,可调的色彩远多于下表所示的,使用PWM可以产生0~255之间的全部颜色,共16777216种颜色(256×256×256)。不妨可以动手尝试一下,设置三个LED的PWM值来随意切换颜色吧!

Arduino教程 05 炫彩RGB LED「DFR0100」图7
表 1 不同LED的PWM值所组合产生的颜色

共阳RGB与共阴RGB的区别

上面我们还遗留一个问题——共阴与共阳在使用上有什么区别?共阳RGB就是把正极拉到一个公共引脚上,其他三个端则是负极。下图是可以看出,外表上共阴共阳没有任何区别。然而在使用上是有区别的,区别分为以下两点:

(1)接线中的改变。共阳的话,共用端需要接5V,而不是GND,否则LED不能被点亮。

(2)第二点就是,在颜色的调配上,与共阴是完全相反的。

举个例子:共阴RGB显示红色为R-255,G-0,B-0。然而共阳则完全相反,RGB数值是R-0, G-255, B-255。

Arduino教程 05 炫彩RGB LED「DFR0100」图8

如何判断共阴还是共阳

其实非常简单,甚至都不需要编写程序来验证。前面讲过RGB LED其实是三个颜色的LED。共阴和共阳的电路图如下:

Arduino教程 05 炫彩RGB LED「DFR0100」图9
图 6 RGB LED共阴共阳对比图

测试方法如下:

1.在R、G、B三个引脚各串联一个220Ω电阻。
2.首先将公共端接入负极(接地)。
3.逐一尝试将R、G、B引脚接入正极(如3V电源)。
4.观察LED是否亮起对应颜色:若某引脚接入正极时亮起相应颜色(红、绿、蓝),则该RGB LED为共阴极;若均不亮,则判定为共阳极。
5.为确保准确性,可按相同方法测试共阳极情况(即公共端接正极,逐一测试R、G、B引脚接地)




课后练习
1、基于我们上面的炫彩RGB项目,改变程序做一个沿着彩虹色变化的RGB灯,而不是我们这样随机产生颜色。这里比较困难的应该是颜色的调制,通过改变Red、Green、Blue的值0~255,组合出你想要的颜色。

提示:只要在原有代码基础上做修改就可以了,直接调用colorRGB()函数,将函数中3个参数写入所对应颜色的值即可。

2、在作业1的基础上,能否结合我们上面说的呼吸灯,将彩虹色以呼吸灯渐变形式变化。这样的变换会显得更加柔和。

3、Arduino是个开源的平台,从Arduino IDE中就可以加载一些别人已经写好了的库,不需要自己从头写,难度也比较大,所以我们只需调用别人写好的库,来达到我们想要的效果就可以了。

比如我们今天使用的RGB LED,就已经有现成的用户库了。
下面就提供一个加载RGB LED库和使用库的案例。

Arduino教程 05 炫彩RGB LED「DFR0100」图10
图 7 工具->管理库


Arduino教程 05 炫彩RGB LED「DFR0100」图11
图 8 搜索rgbled->安装

Arduino教程 05 炫彩RGB LED「DFR0100」图12
图 9 安装成功

Arduino教程 05 炫彩RGB LED「DFR0100」图13
图 10 文件->示例->rgbled

Arduino教程 05 炫彩RGB LED「DFR0100」图14
图 11 验证和上传


下一篇教程:Arduino教程 06 报警器

DFRobot版权所有,欢迎转载。
转载请务必标注来源: DF创客社区+作者姓名+原文网址。

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(36)
raymondo
raymondo

也是呼吸灯的,更简洁
[code]int i,j;
void setup() // 当您按下重置或给电路板通电时,设置功能运行一次
{
pinMode(9, OUTPUT); // 将数字引脚9初始化为输出
pinMode(10, OUTPUT); // 将数字引脚10初始化为输出
pinMode(11, OUTPUT); // 将数字引脚11初始化为输出
}
void loop() // 循环函数永远重复运行
{
for(i=9;i<=11;i++) // 对9-11从小到大循环遍历
{
for(j=0;j<=255;j++) // 使i号引脚渐亮
{
analogWrite(i,j);
delay(2);
}
for(j=255;j>=0;j--) // 使i号引脚渐暗
{
analogWrite(i,j);
delay(1);
}
}
}
[/code]
liuchang
liuchang
能不能出一个图形化的..
miner233-
miner233-
为什么一些 RGB 数值不能正常显示?
比如 rgb(193, 57, 49)
应该是深红色,但显示出来的是蓝色。
使用的是共阴 LED
我已多次确认接线和引脚号没有任何问题
但是,也有一些颜色可以正常显示
比如 rgb(0, 142, 156)
JOVI
JOVI
学习学习
ling.09
ling.09
LEDRGB有办法形成渐变色吗
Kaiii
Kaiii
呼吸灯闪烁,课后作业代码:[code]//analogWrite()函数支持以下引脚: 3, 5, 6, 9, 10, 11。
int r = 9;
int g = 11;
int b = 10;
void setup() {
pinMode(r,OUTPUT);
pinMode(g,OUTPUT);
pinMode(b,OUTPUT);
}
void loop() {
Serial.begin(9600);
colorRGB(random(0,255),random(0,255),random(0,255));
delay(1000);
}
void colorRGB(int red,int green,int blue){
fadeIn(1000,5,red,r);
fadeIn(1000,5,green,g);
fadeIn(1000,5,blue,b);
fadeOut(1000,5,red,r);
fadeOut(1000,5,green,g);
fadeOut(1000,5,blue,b);
}
void fadeIn(unsigned int time,int incnum,int color,int port){
for(byte i = 0; i< color; i+= incnum){
analogWrite(port,constrain(i,0,255));
delay(time/(255/5));
}
}
void fadeOut(unsigned int time,int incnum,int color,int port){
for(int i = color; i > 0; i-= incnum){
analogWrite(port,constrain(i,0,255));
delay(time/(255/5));
}
}
[/code]
Kaiii
Kaiii回复Kaiii
有一点不好的就是 因为数值是增加上去的 所以 颜色的变化 也是 刚开始红橙青 能看到明显的颜色变化 记录一下
skagh
skagh
如果单是随机变色,random(0,255) 产生0-254的值,那么此处constrain限制 0-255 貌似就没意义了
飞雪弥香
飞雪弥香
请教下,电路图是用什么软件画的?我想找面包板扩展板,一直没找到图。
浮尘清寒
浮尘清寒回复飞雪弥香
Fritzing这个软件可以画电路图和面包板图,总体来说比Arduino Box好用
绝地智者
绝地智者
厉害了,新手来顶一顶帖子,加油学习~
LeSoleil
LeSoleil
太好了!
怒放
怒放
慢慢学习了
怒放
怒放
认真学习了
神之米兰号
神之米兰号
666666
66666
6666
666
66
6
DFr14Nfdmf4
DFr14Nfdmf4
怎么下不了
gada888
gada888
炫彩灯带。好
wangcomeon
wangcomeon
谢谢楼主的帖子。提个小小的笔误:“这里就提供一个RGELED库”,这个地方是不是想写RGB?
15626202348m
15626202348m
colorRGB 是一个函数吗?不懂中间void loop那一段是干嘛用的。。括号里三个ramdon按顺序就是对应Red,Green,Blue了吗?
15626202348m
15626202348m回复15626202348m
明白了 就是先给范围 再创建解释变量 跟之前一直用的matlab的编程语言思路不一样。。
虚心学习
虚心学习
想问一下 Jane 老师,文章中的电路示意图是用什么软件画的?
Jane
Jane
作者
回复虚心学习
用的Inkscape画的
295290513
295290513

希望有帮助 :)
地狱满员
地狱满员
楼主哦,要是有没学过数组的同学看了这代码估计蒙了。
colorRGB(random(0,255),random(0,255),random(0,255));
void colorRGB(int red, int green, int blue)