美文网首页Arduino 专题学习
项目二:PWM实现变色Led灯(二)

项目二:PWM实现变色Led灯(二)

作者: 0235_左雨欣 | 来源:发表于2019-06-27 15:37 被阅读0次

本节内容:串口控制变色灯的实现


简单回顾下之前的内容:

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 呈现相应颜色 的过程。

相关文章

网友评论

    本文标题:项目二:PWM实现变色Led灯(二)

    本文链接:https://www.haomeiwen.com/subject/catnfctx.html