2019-11-29 10:01:49 [显示全部楼层]
12133浏览
查看: 12133|回复: 3

[入门] 【呼吸灯】基于Mind+ Ardunio入门教程04

[复制链接]
本帖最后由 DFEDU 于 2019-11-29 10:01 编辑

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



所需元件

1×  5mm LED灯               
1×  220欧电阻                  



硬件连接

       这个项目的硬件连接与项目一、二是完全相同的。如有不明白,可以回看项目一,或参照图4-1。

4-1 呼吸灯连接示意图



图形化编程

       连接主板和电脑,打开Mind+载入扩展库,输入样例程序4-1所示程序。本项目中将用到一个新的循环,指令学习和代码学习中会有详细的讲解。

样例程序4-1:

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


图形化指令学习








代码学习

[mw_shl_code=c,true]// 动态变量
volatile float mind_n_value;
// 函数声明
void DF_fadeOff();
void DF_fadeOn();


// 主程序开始
void setup() {

}
void loop() {
        DF_fadeOff();
        DF_fadeOn();
}


// 自定义函数
void DF_fadeOff() {
        mind_n_value = 255;
        while (!(mind_n_value<=0)) {
                analogWrite(10, mind_n_value);
                delay(20);
                mind_n_value -= 5;
        }
}
void DF_fadeOn() {
        mind_n_value = 0;
        while (!(mind_n_value>=255)) {
                analogWrite(10, mind_n_value);
                delay(20);
                mind_n_value += 5;
        }
}[/mw_shl_code]
       大部分代码我们已经很熟悉了,比如初始化变量声明、引脚设置、以及函数调用。

       在主函数中,只有两个调用函数fadeOff和fadeOn。前者是让LED逐渐变暗,后者是逐渐变亮,以此来实现呼吸灯的效果。这两个函数的内容基本一致,在数值设置上存在一些差别,故先行学习其中一个。
[mw_shl_code=applescript,true]void DF_fadeOff() {
        mind_n_value = 255;
        while (!(mind_n_value<=0)) {
                analogWrite(10, mind_n_value);
                delay(20);
                mind_n_value -= 5;
        }
}[/mw_shl_code]
       fadeOff函数中出现了一个新的语句while,while语句通常在程序用作条件循环。

While(){}

       函数格式如下:
       对应指令为:

       while语句中涉及了一个新函数:

■ analogWrite( 10 ,mind_n_value );

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

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



PWM

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

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


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

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




课后作业

1. 同前两个项目,本课的第一条作业依旧是手动输入项目的代码,旨在养成这一习惯、勤加操练,为之后的项目打好必要的输入代码、编译后自行纠错debug能力的基础。
*如果遇到其他的编译报错可以登录DF创客社区查看或发帖询问。

2. LED能否做个火焰的效果,通过PWM使LED产生随机的亮度变化,来模拟一个火焰闪烁的效果。找个浅色罩子盖住效果更佳,可以放在家中作为小夜灯。

       主要材料:一个红色LED、两个黄色LED以及220欧电阻。在这个实验中,有个函数会比较好用——random(),Mind+中对应的指令为。它可以产生一定范围内的随机数。

       提示:可以先设定LED灯亮度,在其值附近产生一个随机数,比如random(120)+135,对应指令,让其值稳定在135附近,产生这种小幅变化,就更具有火焰跳跃感。不妨尝试一下。

       random函数格式为:random(120)它能够从0-120随机取值。

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

       可以登录:https://wiki.dfrobot.com.cn


       在“入门教程”中的“Arduino编程参考手册”可以学习更多的函数。

3. 尝试一个稍微有点难度的,通过两个按键,一个按键控制LED逐次变亮,另一个按键控制LED逐次变暗。



gada888  版主

发表于 2019-12-1 12:55:17

支持一下
回复

使用道具 举报

优迪超人  学徒

发表于 2024-6-3 11:05:44

尝试一个稍微有点难度的,通过两个按键,一个按键控制LED逐次变亮,另一个按键控制LED逐次变暗。   这个怎么实现?
回复

使用道具 举报

优迪超人  学徒

发表于 2024-6-3 11:07:16

呼吸灯里用了延时函数,按键操作不响应呢?
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail