炫酷LED呼吸灯

LED(发光二极管)虽然体积很小,但内有乾坤,在我们的生活中也是随处可见他的身影,电子钟表表盘上的数字、超大电视屏幕上的图像、或是用于点亮交通信号灯,他是电子世界中真正的英雄,默默无闻,但是作用巨大,出现的形式也是多种多样的;

炫酷LED呼吸灯_第1张图片

上图是LED灯的内部结构图,具体的发光原理这边就不赘述了,如需要详细了解,可以看这篇文章:https://www.jzic.com/news_item/3230.html

对于我们的实现来讲,我们需要简单了解一下LED的电气特性:

  1. 从外观上来讲,它由发光部分、正极引线(长的一根)和负极引线(短的一根)组成;
  2. 从电气实现上来讲,当有电流经过时,LED就将被点亮,电流越大,发光就越强(但是需要注意的是,如果电流过大,会造成内部的击穿,就会损坏LED了,所以我们一般来讲,要在电路中间添加一个电阻,缓冲电流)

我们首先直接通过Arduino供电,看看能否点亮LED灯:
炫酷LED呼吸灯_第2张图片

当Arduino上电之后,我们会发现LED也亮了,我们一起来分析一下电流的走向:

  1. 首先正电从Arduino中流出,通过导线流向面包板;
  2. 然后通过跳线流向电阻;
  3. 经过电阻的缓冲,电流变弱了;
  4. 然后流向LED的正极;
  5. 从LED正极流入,负极流出;
  6. 最后流向Arduino的GND,使其构成了一个回路,LED灯被点亮;

现在我们不能通过Arduino对他进行控制,只能随着Arduino的上电和断电实现LED的亮灭,那么我们怎么才能通过Arduino控制LED呢?

我们在初识Arduino——以UNO为例中已经知道了Arduino的引脚构成,通过这些引脚我们就可以控制传感器或者获取传感器的采集数据,接下来我们就通过数字引脚2实现LED灯的闪烁:

炫酷LED呼吸灯_第3张图片

/*
 * 实现功能: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呼吸灯_第4张图片

/*
 * 实现功能:实现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;
  }
}

 

你可能感兴趣的:(arduino)