本节内容:串口控制变色灯的实现
简单回顾下之前的内容:
1.什么是PWM?
脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。
2.analogWrite(pin,value)函数
参数:pin:整型,要写入的引脚编号;
value:占空比,在0~255之间。(0时候为关,即LOW;255为开,即HIGH)
返回值:无
本节所需的组件:
共阴极 RGB LED灯
3个470欧电阻
Arduino Nano开发板
面包板和跳线
认识一下RGB LED:
RGB LED灯可以通过混合红色、绿色和蓝色这三种基本颜色来发出不同的颜色。所以它实际上由3个独立的LED组成,红色、绿色和蓝色包装在一个盒子里。这就是为什么它有4个引脚,3种颜色中的每一种都有一根引线,而RGB LED类型则有共用阴极或阳极。在本篇文章中,我使用的是共阴极。
RGB LED 原理图共阳极和共阴极在使用上是有区别的,区别分为以下两点:
(1)接线中的改变,共阳的话,共用端需要接5V,而不是GND,否则LED不能被点亮。
(2)在颜色的调配上,共阳极与共阴极是完全相反的。
举个例子:共阴RGB显示红色为R-255,G-0,B-0。然而共阳则完全相反,RGB数值是R-0,G-255,B-255。
工作原理:
RGB只是简单的把三个颜色的LED灯封装在一个LED中。只要当做三个灯使用就可以了。我们都知道红色、绿色、蓝色是三原色,通过组合这些基本颜色可以得到任何色调。我们将使用PWM模拟输出,这将为LED提供不同的电压电平,通过串口得到数值,再使Arduino通过PWM口对三种颜色明暗的调节,也就analogWrite(value)语句,就能让LED调出任何你想要的颜色。
PWM实现变色原理图
电路原理图:
我们将阴极接地,3个阳极通过220欧姆电阻连接到Arduino开发板上的3个数字引脚,这些引脚可提供PWM信号。我们将使用PWM模拟模拟输出,这将为LED提供不同的电压电平,以便我们可以获得所需的颜色。
电路连线图 实物接线图
源代码:
在Arduino中完整代码
我使用的是引脚9、10和11,分别将它们命名为RedPin、GreenPin和BluePin。并定义一个字符串变量str和一个整形数组RGB。
String str; //定义字符串变量str
int RedPin = 9; //红灯连接引脚为9的接口
int GreenPin = 10; //绿灯连接10接口
int BluePin = 11; //蓝灯连接11接口
int RGB[3]; //定义整形数组RGB
在setup部分,我们需要将它们定义为输出。开启串口。
void setup(){//创建函数
Serial.begin(9600); // 打开串口
pinMode(RedPin, OUTPUT); //设定红灯引脚为输出模式
pinMode(GreenPin, OUTPUT);//设定绿灯引脚为输出模式
pinMode(BluePin, OUTPUT);//设定蓝灯引脚为输出模式
}
现在在loop函数中我们将制作程序,它将根据串口输入的数值改变LED的颜色。
void loop(){//创建循环函数
if (Serial.available() > 0) { // 当串口接收到数据时
str = Serial.readString(); //将串口接收到数据赋给str变量
}
if (str != "") { //当接收到数据时
//对输入的数字分割读取并赋给数组
RGB[0] = str.substring(0, str.indexOf(',')).toInt();
RGB[1] = str.substring(str.indexOf(',')+1, str.lastIndexOf(',')).toInt();
RGB[2] = str.substring(str.lastIndexOf(',')+1).toInt();
}
setcolor(RGB[0], RGB[1], RGB[2]); //调用setcolor函数
}
函数参考:
① 变量.Substring(参数1,参数2);
截取字串的一部分,参数1为左起始位数,参数2为截取几位。
如:string s1 = str.Substring(0,2); //截取第0位到第2位三位字节赋给s1
② 变量.IndexOf()
查找字串中指定字符或字串首次出现的位置,返首索引值。
如:str1.IndexOf("字"); //查找“字”在str1中的索引值(位置)
③变量 .toInt()
可以将字符串转换成整型
如:上述代码将字符串转化为整型
然后我定义了一个名为setcolor()的自定义函数,它接受3个不同的参数red、green和blue。这些参数表示LED的亮度或使用analogWrite()函数创建的PWM信号的占空比,在0到255之间变化。
void setcolor(int red, int green, int blue){//创建setColor函数
analogWrite(RedPin,redValue);//analogWrite函数通过PWM的方式在引脚上输出一个模拟量,控制LED亮度
analogWrite(GreenPin,greenValue);//analogWrite函数通过PWM的方式在引脚上输出一个模拟量,控制LED亮度
analogWrite(BluePin,blueValue);//analogWrite函数通过PWM的方式在引脚上输出一个模拟量,控制LED亮度
}
实验步骤:
电路的连接非常简单:
1. 将RGB LED插入面包板。
2. 将共阴极的公共端,与Arduino中的GND引脚连接。
3. 将每个LED引线(红色、绿色和蓝色)与Arduino中的数字引脚相连, 每个引脚与470欧姆电阻串联。
4. 利用USB连至计算机。
5. 输入代码,上传即可实现。
实验结果:
map函数的用法:
(1)函数原型:map(value, fromLow, fromHigh, toLow, toHigh)
(2)功能: 将数字从一个范围重新映射到另一个范围。
(3)参数:value: 要映射的数字
fromLow: 值当前范围的下限
fromHigh: 值当前范围的上限
toLow: 值的目标值范围的下限
toHigh: 值的目标值范围的上限
(4)返回值:映射的值
(5)例如:val = map(analogRead(0),0,1023,100, 200); // 将analog0 所读取到的讯号对等转换至100 – 200之间的数值。
以上实现了如 输入255,0,0 得到红色 等 输入对应值RGB 呈现相应颜色 的过程。
网友评论