LED(发光二极管)虽然体积很小,但内有乾坤,在我们的生活中也是随处可见他的身影,电子钟表表盘上的数字、超大电视屏幕上的图像、或是用于点亮交通信号灯,他是电子世界中真正的英雄,默默无闻,但是作用巨大,出现的形式也是多种多样的;
上图是LED灯的内部结构图,具体的发光原理这边就不赘述了,如需要详细了解,可以看这篇文章:https://www.jzic.com/news_item/3230.html
对于我们的实现来讲,我们需要简单了解一下LED的电气特性:
当Arduino上电之后,我们会发现LED也亮了,我们一起来分析一下电流的走向:
现在我们不能通过Arduino对他进行控制,只能随着Arduino的上电和断电实现LED的亮灭,那么我们怎么才能通过Arduino控制LED呢?
我们在初识Arduino——以UNO为例中已经知道了Arduino的引脚构成,通过这些引脚我们就可以控制传感器或者获取传感器的采集数据,接下来我们就通过数字引脚2实现LED灯的闪烁:
/*
* 实现功能:LED灯隔3秒闪烁
* 使用材料:Arduino UNO*1、面包板*1、LED*1、1K欧姆电阻*1、杜邦线若干
* 创建时间:2019年5月23日19:16:16
* 修改时间:
*/
#define LED 2 //给引脚2取个名字,方便后面我们调用
void setup() { //一些初始化操作
// put your setup code here, to run once:
pinMode(LED,OUTPUT); //设置引脚2为输出模式
digitalWrite(LED,LOW); //设置引脚2的初始状态是低电平(即熄灭状态)
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(LED,LOW); //设置引脚2为高电平状态(即点亮)
delay(3000); //延时3秒(需要注意的是,这里的单位是毫秒,进制是1000)
digitalWrite(LED,HIGH);
delay(3000);
}
当我们将程序烧录到Arduino中,我们会发现,LED灯会点亮3秒、熄灭3秒做周期运动,那么就证明我们的电路连接和程序没有问题啦!
这是我们第一次使用Arduino IDE进行编程,对程序的几个部分做一下简单的分析:
#define LED 2
/************************************************
#define 标识符 参数
在C++中是预处理宏定义操作的意思,简单的说,就是在程序编译链接之前,先将代码中所有的标识符替换成他具体的参数,当所有的标识符都替换
完毕后,预处理部分就完成了,就会接下去编译链接生成固件,下载到Arduino中;
************************************************/
void setup() {
// put your setup code here, to run once:
// 将您的设置代码放在这里,运行一次
// 这部分代码会在程序的最开始运行一次,简单的说就是一系列的初始化操作,比如引脚模式的设定、串口波特率的设置等
}
pinMode(引脚,模式); //设置引脚的模式
//INPUT 输入 OUTPUT 输出
digitalWrite(引脚,状态); //设置引脚的状态
//HIGH 高电平 LOW 低电平
//对于数字引脚来讲,只有高电平或者低电平
void loop() {
// put your main code here, to run repeatedly:
// 把你的主要代码放在这里,重复运行
// 我们可以把这个看做一个死循环,里面的程序会无止境的执行下去,我们需要把功能实现的流程代码放在这里;
}
delay(毫秒); //这是一个延时函数,单位是毫秒,1000毫秒=1秒
现在我们已经可以实现LED的周期闪烁了,那么又如何实现呼吸灯的效果呢?
这会儿就需要提到一个新的概念了,PWM(脉宽调制)通过调整占空比来实现呼吸灯效果,举个最简单的栗子,“三天打鱼两天晒网”,这里一共花费了五天时间,但是实际工作的就只有三天,所以只能得到三天的收益,那么这里的占空比就是60%;在这里我们指在一个工作周期内,高电的时间比是怎么样的,如果一个工作周期一半时间是高电,那么占空比就是50%;
那么呼吸灯又是怎么实现的呢?工作周期内,高电的时间越短,电量越小,LED就越暗,高电的时间越长,点亮越大,LED就越亮;我们可以从0渐渐把占空比调大,到达最大后再见见把占空比调小,以此往复,实现呼吸灯的效果;
/*
* 实现功能:实现LED呼吸灯效果
* 创建时间:2019年5月23日20:13:52
* 修改时间:
*/
#define LED 3 //注意,这里的引脚改为3了,这是因为引脚2不具备PWM
int PWM_VALUE = 0; //用来存储占空比的值,最小是0,最大是255
void setup() {
// put your setup code here, to run once:
pinMode(LED,OUTPUT);
analogWrite(LED,0); //由于我们需要改变IO口输出占空比,用数字信号来模拟的模拟电压信号,所以这里是模拟信号输出
}
void loop() {
// put your main code here, to run repeatedly:
PWM_VALUE = PWM_VALUE + 16; //改变占空比的值
while (PWM_VALUE <= 255){ //如果值小于等于255,即没有超出最大值,使占空比趋向100%,当超过100%则跳出循环
analogWrite(3,PWM_VALUE);
delay(100); //需要等待100毫秒,等待电流平稳
PWM_VALUE = PWM_VALUE + 16;
}
PWM_VALUE = PWM_VALUE - 16;
while (PWM_VALUE >= 0){
analogWrite(3,PWM_VALUE);
delay(100);
PWM_VALUE = PWM_VALUE - 16;
}
}