前言
RGB 3色灯是由内部三个不同颜色的灯珠组成的一个灯。RGB灯分为共阴和共阳两种,我们这里用的是共阳。四个引脚中最长的那个为阳极,其他三个分别为红灯,蓝灯,绿灯的阴极,我们通过控制三个灯两端的电压值,可以控制灯的发光亮度,然后组合,让RGB灯发出不同的颜色的光。本文将通过2个实验进行相关学习。
一、单个三色传感灯
1、目标实现
通过控制三个灯2端的电压值,使RGB灯的颜色逐渐变化,颜色变化为紫、青、黄。
2、实验器件
- 开发板:arduion
- 面包板:1 个
- 220欧电阻:3 个
- RGB三色灯:1 个
- 多彩杜邦线:若干
3、接线
接线原理如下图所示
实验接线如图所示
4、代码程序
在编写相关程序之前,我们应该对颜色的叠加有所了解。
红+蓝=紫-->蓝+绿=青-->红+绿=黄
要使代码实现相关目标,可以对实验要求进行转换:
①红灯变亮,绿灯变暗,蓝灯常亮
②蓝灯变亮,红灯变暗,绿灯常亮
③绿灯变亮,蓝灯变暗,红灯常亮
具体代码如下:
//观察到RGB灯的颜色在渐渐变化,可以组合出多种颜色
/*
需求:
①红灯变亮,绿灯变暗,蓝灯常亮
②蓝灯变亮,红灯变暗,绿灯常亮
③绿灯变亮,蓝灯变暗,红灯常亮
*/
int RedPin = 11;
int GreenPin = 10;
int BluePin = 9; //定义LED接口
int redval = 0;
int blueval = 0;
int greenval = 0; //定义LED变量
int value;
static void color(int red, int blue, int green); //给LED接口相关模拟值
void setup()
{
pinMode(RedPin, OUTPUT);
pinMode(BluePin, OUTPUT);
pinMode(GreenPin, OUTPUT);//设置LED接口为输出接口
}
void loop() {
value++;
if (value < 200)
{
redval++; //0-200 红色最亮变暗
greenval--; //0-(-200) 绿色瞬间熄灭后变亮
blueval = 1; //1 蓝色一直很亮 红+蓝=紫-->蓝+绿=青
}
else if (value < 400)
{
blueval++; //1-200 蓝色最亮变暗
redval--; //200-0 红色变亮
greenval = 1; //1 绿色一直很亮 蓝+绿=青-->红+绿=黄
}
else if (value < 600)
{
greenval++; //1-200 绿色最亮变暗
blueval--; //1-(-199) 蓝色瞬间熄灭后变亮
redval = 1; //1 红色一直很亮 红+绿=黄-->红+蓝=紫
}
else
{
value = 0; //重新给val赋值进行新循环
}
color(redval, blueval, greenval); //执行color()函数
delay(20);
}
static void color(int red, int blue, int green) //给LED接口相关模拟值
{
analogWrite(RedPin, red);
analogWrite(BluePin, blue);
analogWrite(GreenPin, green);
}
二、三色传感灯与开关
1、目标实现
在上个实现的基础上,我们加入一个开关,当开关松开时,RGB灯开始工作,当开关按下时,RGB灯停止工作。
2、实验器件
- 开发板:arduion
- 面包板:1 个
- 220欧电阻:4 个
- RGB三色灯:1 个
- 开关:1 个
- 多彩杜邦线:若干
3、接线
接线原理如下图所示
实验接线如图所示
4、代码程序
int Switch = 2; //定义数字2接口为按键的引脚编号
int RedPin = 11;
int GreenPin = 10;
int BluePin = 9; //定义LED接口
int redval = 0;
int blueval = 0;
int greenval = 0; //定义LED变量
int value;
static void color(int red, int blue, int green); //给LED接口相关模拟值
static void run_RGB(); //执行RGB灯
void setup()
{
pinMode(RedPin, OUTPUT);
pinMode(BluePin, OUTPUT);
pinMode(GreenPin, OUTPUT);//设置LED接口为输出接口
pinMode(Switch, INPUT); //定义按键接口为输入接口
}
void loop()
{
if (digitalRead(Switch) == HIGH) //松开按钮
{
run_RGB();
}
else //按下按钮
{
color(255,255,255);
}
}
static void run_RGB()
{
value++;
if (value < 200)
{
redval++; //0-200 红色最亮变暗
greenval--; //0-(-200) 绿色瞬间熄灭后变亮
blueval = 1; //1 蓝色一直很亮 红+蓝=紫-->蓝+绿=青
}
else if (value < 400)
{
blueval++; //1-200 蓝色最亮变暗
redval--; //200-0 红色变亮
greenval = 1; //1 绿色一直很亮 蓝+绿=青-->红+绿=黄
}
else if (value < 600)
{
greenval++; //1-200 绿色最亮变暗
blueval--; //1-(-199) 蓝色瞬间熄灭后变亮
redval = 1; //1 红色一直很亮 红+绿=黄-->红+蓝=紫
}
else
{
value = 0; //重新给val赋值进行新循环
}
color(redval, blueval, greenval); //执行color()函数
delay(20);
}
static void color(int red, int blue, int green) //给LED接口相关模拟值
{
analogWrite(RedPin, red);
analogWrite(BluePin, blue);
analogWrite(GreenPin, green);
}
Gitte源码仓库:https://gitee.com/chen_xy_chen/arduion_c.git
三、最终效果
具体效果视频就不在此展示了,感兴趣的伙伴可以自行接线复制代码进行实验。