【入门教程】DFR0100 Arduino教程05-呼吸灯-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6185|回复: 0

【入门教程】DFR0100 Arduino教程05--呼吸灯

[复制链接]
发表于 2016-12-2 10:50 | 显示全部楼层 |阅读模式
本帖最后由 dfrobot 于 2016-12-2 11:07 编辑

该教程实验套件平台:Arduino入门套件
上一篇教程:DFR0100 Arduino教程 4 -- 互动交通信号灯

简单回顾下Lesson 4的内容:

  • 什么是变量?
  • INPUT 与OUTPUT
  • digitalRead(pin)函数
  • pinMode()与digitalWrite()、digitalRead()的关系
  • if语句
  • 常用逻辑运算符
  • millis()函数
  • 按键开关

今天要做的是个呼吸灯,在前面几个Lesson中,我们知道了如何通过程序来控制LED亮灭。但Arduino还有个很强大的功能通过程序来控制LED的明亮度。Arduino UNO数字引脚中有六个引脚标有“~”,这个符号就说明该口具有PWM功能。我们动手做一下,在做的过程中体会PWM的神奇力量!下面就介绍一个呼吸灯,所谓呼吸灯,就是让灯有一个由亮到暗,再到亮的逐渐变化的过程,感觉像是在均匀的呼吸。


STEP 1 : 硬件电路搭建

这个Lesson的硬件连接Lesson 2是完全相同的。
Lesson 2


STEP 2:输入代码

完成硬件连接后,打开Arduino IDE,输入下面这段代码。[mw_shl_code=c,true]int ledPin = 10;

void setup() {
      pinMode(ledPin,OUTPUT);
}

void loop(){
      fadeOn(1000,5);
      fadeOff(1000,5);
}

void fadeOn(unsigned int time,int increament){
        for (byte value = 0 ; value < 255; value+=increament){
            analogWrite(ledPin, value);
                delay(time/(255/increament));
        }
}

void fadeOff(unsigned int time,int decreament){
        for (byte value = 255; value >0; value-=decreament){
            analogWrite(ledPin, value);
                delay(time/(255/decreament));
        }
}
[/mw_shl_code]

代码下载完成后,我们可以看到LED会有个逐渐由亮到灭的一个缓慢过程,而不是直接的亮灭,如同呼吸一般,均匀变化。


STEP 3:代码回顾

大部分代码我们已经很熟悉了,比如初始化变量声明、引脚设置、for循环、以及函数调用。
在主函数中,只有两个调用函数,先看其中一个就能明白了。[mw_shl_code=c,true]
void fadeOn(unsigned int time,int increament){
        for (byte value = 0 ; value < 255; value+=increament){
            analogWrite(ledPin, value);
                delay(time/(255/increament));
        }
}
[/mw_shl_code]


fadeOn()函数有两个传递参数,从参数名称中就可以简单看出,int time指的是时间,int increament指的是增量。函数中包含了一个for循环,循环条件是value<255,变量的增量由 increament决定。

for语句中涉及了一个新函数
[mw_shl_code=c,true]
analogWrite(ledPin, value);
[/mw_shl_code]
如何发送一个模拟值到一个数字引脚呢?就要用到该函数,使用这个函数是要具备特定条件的——该数字引脚需具有PWM功能。analogWrite(pin,value)函数
Arduino官方:analogWrite(pin,value)

观察一下Arduino板,查看数字引脚,你会发现其中6个引脚(3、5、6、9、10、11)旁标有“~”,这些引脚不同于其他引脚,因为它们可以输出PWM信号。analogWrite()函数用于给PWM口写入一个0~255的模拟值。

PWM是一项通过数字方法来获得模拟量的技术。数字控制来形成一个方波,方波信号只有开关两种状态(也就是我们数字引脚的高低)。通过控制开与关所持续时间的比值就能模拟到一个0到5V之间变化的电压。开(学术上称为高电平)所占用的时间就叫做脉冲宽度,所以PWM也叫做脉冲宽度调制。

通过下面五个方波来更形象的了解一下PWM。



上图绿色竖线代表方波的一个周期。每个analogWrite(value)中写入的value都能对应一个百分比,这个百分比也称为占空比(Duty Cycle),指的是一个周期内高电平持续时间比上低电平持续时间得到的百分比。图中,从上往下,第一个方波,占空比为0%,对应的value为0。LED亮度最低,也就是灭的状态。高电平持续时间越长,也就越亮。所以,最后一个占空比为100%的对应value是255,LED最亮。50%就是最亮的一半了,25%则相对更暗。

你可以试下设置0~255之间不同的值,看看LED的亮度是不是有变化。

可以做些其他的事

用LED能否做个火焰的效果,通过PWM使LED产生随机的亮度变化,来模拟一个火焰闪烁的效果。找个用个浅色罩子盖住效果更佳,可以放在家中作为小夜灯。
主要材料:一个红色LED、两个黄色LED以及220欧电阻。在这个实验中,有个函数会比较好用——random()。random()可是产生一定范围内的随机数。
提示:可以先设定LED灯亮度,在其值附近产生一个随机数,比如random(120)+135,让其值稳定在135附近,产生这种小幅变化,就更具有火焰跳跃感。不妨尝试一下。


下一篇教程:Arduino教程 Lesson 6 -- 炫彩RGB LED

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 03:49 , Processed in 0.071229 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表