DFEDU 发表于 2019-11-29 10:01:49

【呼吸灯】基于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灯               https://mc.dfrobot.com.cn/data/attachment/album/201911/27/112556atadq1l00tax0xt5.png■ 1×220欧电阻                   https://mc.dfrobot.com.cn/data/attachment/album/201911/27/112634pmz6osudzqs83umz.png


硬件连接
       这个项目的硬件连接与项目一、二是完全相同的。如有不明白,可以回看项目一,或参照图4-1。
https://mc.dfrobot.com.cn/data/attachment/album/201911/27/112557d77q4y7sqwib9jwb.png 图4-1 呼吸灯连接示意图


图形化编程

       连接主板和电脑,打开Mind+载入扩展库,输入样例程序4-1所示程序。本项目中将用到一个新的循环,指令学习和代码学习中会有详细的讲解。
样例程序4-1: https://mc.dfrobot.com.cn/data/attachment/album/201911/27/112558km7vfafda0zbgtgz.png
       代码下载完成后,我们可以看到LED会有个逐渐由亮到灭的一个缓慢过程,而不是直接的亮灭,如同呼吸一般,均匀变化。

图形化指令学习


https://mc.dfrobot.com.cn/data/attachment/album/201911/27/112558dznjnorrjzjvpzrr.png




代码学习
// 动态变量
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;
      }
}       大部分代码我们已经很熟悉了,比如初始化变量声明、引脚设置、以及函数调用。
       在主函数中,只有两个调用函数fadeOff和fadeOn。前者是让LED逐渐变暗,后者是逐渐变亮,以此来实现呼吸灯的效果。这两个函数的内容基本一致,在数值设置上存在一些差别,故先行学习其中一个。void DF_fadeOff() {
      mind_n_value = 255;
      while (!(mind_n_value<=0)) {
                analogWrite(10, mind_n_value);
                delay(20);
                mind_n_value -= 5;
      }
}       fadeOff函数中出现了一个新的语句while,while语句通常在程序用作条件循环。
While(){}
       函数格式如下:https://mc.dfrobot.com.cn/data/attachment/album/201911/27/114230gez33ssdm3isij0j.png        对应指令为:https://mc.dfrobot.com.cn/data/attachment/album/201911/27/112558a7to711nttt8zk47.png
       while语句中涉及了一个新函数:
■ analogWrite( 10 ,mind_n_value );
       如何发送一个模拟值到一个数字引脚呢?就要用到该函数,使用这个函数是要具备特定条件的——该数字引脚需具有PWM功能。观察一下Arduino板,查看数字引脚,你会发现其中6个引脚(3、5、6、9、10、11)旁标有“~”,这些引脚不同于其他引脚,因为它们可以输出PWM信号。       https://mc.dfrobot.com.cn/data/attachment/album/201911/27/112559tgx6m6bsogkva9ig.png
       analogWrite()函数用于给PWM口写入一个0~255的模拟值。特别注意的是,analogWrite()函数只能写入具有PWM功能的数字引脚。


PWM
       PWM是一项通过数字方法来获得模拟量的技术。数字控制来形成一个方波,方波信号只有开关两种状态(也就是我们数字引脚的高低)。通过控制开与关所持续时间的比值就能模拟到一个0到5V之间变化的电压。开(学术上称为高电平)所占用的时间就叫做脉冲宽度,所以PWM也叫做脉冲宽度调制。
       通过下面五个方波来更形象的了解一下PWM。
https://mc.dfrobot.com.cn/data/attachment/album/201911/27/112559rnrhqd5bzl6blq0g.png
       上图绿色竖线代表方波的一个周期。每个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+中对应的指令为https://mc.dfrobot.com.cn/data/attachment/album/201911/27/112600unemmyj5sfa536z7.png。它可以产生一定范围内的随机数。
       提示:可以先设定LED灯亮度,在其值附近产生一个随机数,比如random(120)+135,对应指令https://mc.dfrobot.com.cn/data/attachment/album/201911/27/112600la1o3oa2y1p2hok2.png,让其值稳定在135附近,产生这种小幅变化,就更具有火焰跳跃感。不妨尝试一下。
       random函数格式为:random(120)它能够从0-120随机取值。
       具体其他用法可以查看下面链接的编程参考手册,会详细介绍这个函数的用法。之后的讲解中,我们可能有对些函数不进行详细说明,你可以通过这种方法来学习某个新函数。
       可以登录:https://wiki.dfrobot.com.cn
https://mc.dfrobot.com.cn/data/attachment/album/201911/27/112601q2255effvmnp2bzm.png
       在“入门教程”中的“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

呼吸灯里用了延时函数,按键操作不响应呢?
页: [1]
查看完整版本: 【呼吸灯】基于Mind+ Ardunio入门教程04