查看: 67676|回复: 51

[入门教程] Arduino教程 05 呼吸灯「DFR0100」

[复制链接]

项目四 呼吸灯

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

所需元件

1.png

硬件连接

这个项目的硬件连接与项目二是完全相同的。如有不明白,可以回看项目一。
2.png

输入代码

样例代码4-1:

//项目四 – 呼吸灯
    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/5));
        } 
}

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

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

代码回顾

大部分代码我们已经很熟悉了,比如初始化变量声明、引脚设置、for循环、以及函数调用。

在主函数中,只有两个调用函数,先看其中一个就能明白了。

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

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

for语句中涉及了一个新函数

analogWrite(ledPin, value);

如何发送一个模拟值到一个数字引脚呢?就要用到该函数,使用这个函数是要具备特定条件的——该数字引脚需具有PWM功能。观察一下Arduino板,查看数字引脚,你会发现其中6个引脚(3、5、6、9、10、11)旁标有“~”,这些引脚不同于其他引脚,因为它们可以输出PWM信号。

函数格式如下:
3.png
analogWrite(pin,value)

analogWrite()函数用于给PWM口写入一个0~255的模拟值。特别注意的是,analogWrite()函数只能写入具有PWM功能的数字引脚。

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

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

4.png
图 4-2 PWM示意图

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

PWM比较多的用于调节LED灯的亮度。或者是电机的转动速度,电机带动的车轮速度也就能很容易控制了,在玩一些Arduino小车时,更能体现PWM的好处。

这一章介绍结束了!同样的硬件连接,通过软件的变化,可以呈现出完全不一样的效果,是不是觉得Arduino很神奇!                                                                                                                                                                                                                                                                                                                             

课后作业

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

具体用法可以查看下面链接的编程参考手册,会详细介绍这个函数的用法。之后的讲解中,我们可能有对些函数不 进行详细说明,你可以通过这种方法来学习某个新函数。

点击查看: DFRobot 中文版 Arduino编程参考手册(位置:入门教程 - Arduino编程参考手册) https://wiki.dfrobot.com.cn/Arduino%E7%BC%96%E7%A8%8B%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C
点击查看: Arduino 官方编程参考手册
https://www.arduino.cc/reference/en/

  1. 再尝试一个稍微有点难度的,通过两个按键,一个按键控制LED逐次变亮,另一个按键控制LED逐次变暗。 可以参考程序: http://www.geek-workshop.com/thread-1054-1-1.html

DF创客社区版权所有,欢迎转载。
转载请务必标注来源: DF创客社区+作者姓名+原文网址。

DFBypd0DaNN  学徒

发表于 2019-2-10 17:36:50

老师,请问

void loop(){
      fadeOn(1000,5);
这句fadeOn后括号里的内容

和下句
void fadeOn(unsigned int time,int increament){
中fadeOn后括号里的内容

为什么不一样?为什么要这么写呢?
回复

使用道具 举报

救救我  学徒 来自手机

发表于 2019-4-11 14:40:39

midpoint 发表于 2014-12-20 11:03
多谢分享!!!

请问现在要制作两个呼吸灯。如何使一个灯亮的时候另一个灯灭。就是两盏灯状态完全相反
回复

使用道具 举报

非人哉  学徒

发表于 2019-3-26 12:10:01

求教,fadeon和fadeoff是两个内置函数,为什么前面需要加void呢,都什么时候需要加void呢。
回复

使用道具 举报

midpoint  见习技师

发表于 2014-12-20 11:03:49

多谢分享!!!
回复

使用道具 举报

ZeroPoint  初级技师

发表于 2015-1-10 10:39:53

占空比是一个周期内高电平持续时间占一个周期的百分比。
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2015-1-12 10:23:26

ZeroPoint 发表于 2015-1-10 10:39
占空比是一个周期内高电平持续时间占一个周期的百分比。

恩 可以这么理解
回复

使用道具 举报

Mr.why  见习技师

发表于 2015-2-1 17:20:00

应该写成delay(time/(255/increment))
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2015-2-2 10:13:39

Mr.why 发表于 2015-2-1 17:20
应该写成delay(time/(255/increment))

哈哈 慧眼~
回复

使用道具 举报

a920496044  见习技师

发表于 2015-2-7 16:34:26

大神,怎么我改不了亮度,无论改哪个都不行
回复

使用道具 举报

大连林海  初级技神

发表于 2015-2-7 20:12:52

学习 跟着老师学习一下:lol
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2015-2-9 10:02:47

大连林海 发表于 2015-2-7 20:12
学习 跟着老师学习一下

欢迎欢迎~
回复

使用道具 举报

a920496044  见习技师

发表于 2015-2-12 11:02:30

老师,为什么我好像改不了亮度  +.+   是改哪个参数
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2015-2-13 10:12:23

a920496044 发表于 2015-2-12 11:02
老师,为什么我好像改不了亮度  +.+   是改哪个参数

analogWrite()函数是用于改亮度的,你试试看(老师喊得我太不好意思了:$)
回复

使用道具 举报

a920496044  见习技师

发表于 2015-2-14 12:32:06

重新认真看,终于搞懂了,谢谢了老师  XD
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2015-2-15 09:54:45

a920496044 发表于 2015-2-14 12:32
重新认真看,终于搞懂了,谢谢了老师  XD

赞一个~哈哈
回复

使用道具 举报

siska  初级技师

发表于 2015-7-14 14:39:39

void loop(){
      fadeOn(1000,5);
      fadeOff(1000,5);
}
这句是什么意思:'(
回复

使用道具 举报

siska  初级技师

发表于 2015-7-14 15:25:56

time/(255/increament)
不是很理解是什么意思
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2015-7-14 16:06:17

siska 发表于 2015-7-14 14:39
void loop(){
      fadeOn(1000,5);
      fadeOff(1000,5);

这里是调用了两个外部函数 fade on和fade off
回复

使用道具 举报

1522631876  见习技师

发表于 2015-8-2 09:38:29

for (byte value = 0 ; value < 255; value+=increament) 老师想问一下  这句里这个byte 有什么用啊
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2015-8-3 10:57:24

1522631876 发表于 2015-8-2 09:38
for (byte value = 0 ; value < 255; value+=increament) 老师想问一下  这句里这个byte 有什么用啊 ...

定义一个变量类型的,你也可以用int
回复

使用道具 举报

1522631876  见习技师

发表于 2015-8-3 16:26:19

Jane 发表于 2015-8-3 10:57
定义一个变量类型的,你也可以用int

哦哦 好的 谢谢老师啦
回复

使用道具 举报

joyyazi  初级技师

发表于 2015-8-8 18:16:43

本帖最后由 joyyazi 于 2015-8-9 08:10 编辑

上面的代码
fadeOn(1000,5);
       fadeOff(1000,5);
其中的1000,5什么意思啊。
回复

使用道具 举报

Nolan0501  见习技师

发表于 2015-11-6 21:04:46

fadeOn(1000,5);
       fadeOff(1000,5);
其中的1000,5什么意思?

还有random(120)+135加在哪里???
谢谢楼主!!!
回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2021 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail