炫酷LED呼吸灯

    xiaoxiao2022-07-13  192

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

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

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

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

    我们首先直接通过Arduino供电,看看能否点亮LED灯:

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

    首先正电从Arduino中流出,通过导线流向面包板;然后通过跳线流向电阻;经过电阻的缓冲,电流变弱了;然后流向LED的正极;从LED正极流入,负极流出;最后流向Arduino的GND,使其构成了一个回路,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; } }

     

    最新回复(0)