2016-1-27 14:19:53 [显示全部楼层]
35057浏览
查看: 35057|回复: 9

[中级教程] Arduino教程中级 项目五 呼吸灯

[复制链接]

项目五 呼吸灯

本系列教程为DF创客社区版权所有,配套硬件套件:新版Arduino中级套件

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

所需元件

1×  数字食人鱼红色LED发光模块
Arduino教程中级 项目五 呼吸灯图1

硬件连接

数字食人鱼红色 LED发光模块
连接数字引脚10
Arduino教程中级 项目五 呼吸灯图2

硬件分析(模拟输出)

和项目一(点亮一盏灯)类似的装置,同样没有输入设备,只有一个输出设备,但又有所不同。项目一LED是作为数字输出,而这里我们是作为模拟输出。代码部分会说明。
Arduino教程中级 项目五 呼吸灯图3

输入代码

样例代码5-1:

//项目五 – 呼吸灯
int ledPin = 10;

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

void loop(){
  for (intvalue = 0 ; value < 255; value=value+1){
    analogWrite(ledPin, value);
    delay(5);
  }
  for (intvalue = 255; value >0; value=value-1){
    analogWrite(ledPin, value);
    delay(5);
  }  
}    

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

代码分析

当我们需要重复执行某句话时,我们可以使用for语句。
for语句格式如下:
Arduino教程中级 项目五 呼吸灯图4

for循环顺序如下:

第一轮:1 → 2 → 3 → 4
第二轮:2 → 3 → 4
…

直到2不成立,for循环结束。
知道了这么个顺序之后,回到代码中:

for (int value = 0; value < 255; value=value+1){
        ...
}
for (int value = 255; value >0; value=value-1){
       ...
}

这两个for语句实现了value的值不断由0增加到255,随之在从255减到0,在增加到255……,无限循环下去。

再看下for里面,涉及一个新函数analogWrite()。

我们知道数字口只有0和1两个状态,那如何发送一个模拟值到一个数字引脚呢?就要用到该函数。观察一下Arduino板,查看数字引脚,你会发现其中6个引脚旁标有“~”,这些引脚不同于其他引脚,它们可以输出PWM信号。

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

analogWrite()函数用于给PWM口写入一个0~255的模拟值。所以,value是在0~255之间的值。特别注意的是,analogWrite()函数只能写入具有PWM功能的数字引脚,也就是3,5,6,9,10,11引脚。

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

通过下面五个方波来更形象的了解一下PWM。
Arduino教程中级 项目五 呼吸灯图5
图 4-2 PWM示意图

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

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

※ 在之后的Arduino学习之旅中,不管你遇到奇奇怪怪的问题,都希望你与我们交流,欢迎登陆我们的DFRobot创客社区!mc.dfrobot.com.cn

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

Lesson5_1.ino

322 Bytes, 下载次数: 7070

jiashe2011  见习技师

发表于 2017-2-22 00:52:20

学习5!!!
回复

使用道具 举报

guo418852325  学徒

发表于 2017-4-27 21:58:53

错误了吧不能
回复

使用道具 举报

sdzxqgh  见习技师

发表于 2017-5-8 21:36:34

我也不能,语句有问题
回复

使用道具 举报

凌逆战  学徒

发表于 2018-1-7 14:50:32

intvalue=0;
int value=0;只是少了一个空格而已
回复

使用道具 举报

杨明  学徒

发表于 2018-6-21 23:38:35

我成功了,应该使用9号引脚而不是10号!
回复

使用道具 举报

暮雪朝阳  见习技师

发表于 2019-4-16 20:58:31

杨明 发表于 2018-6-21 23:38
我成功了,应该使用9号引脚而不是10号!


intvalue=0;
int value=0;
改成这样
回复

使用道具 举报

twfolove  见习技师

发表于 2020-7-11 17:57:53

呼吸灯效果不是均匀增加或减小吧,有快慢效果更明显
回复

使用道具 举报

mao1  学徒

发表于 2021-3-9 11:53:51

怎么不Value++,--?
回复

使用道具 举报

阿斯蒂芬一条狗  学徒

发表于 2021-4-8 10:29:59


没错的
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail