友情提示:380元/半年,儿童学编程,就上码丁实验室。
简单回顾下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,输入下面这段代码。
- 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));
- }
- }
复制代码
代码下载完成后,我们可以看到LED会有个逐渐由亮到灭的一个缓慢过程,而不是直接的亮灭,如同呼吸一般,均匀变化。
STEP 3:代码回顾
大部分代码我们已经很熟悉了,比如初始化变量声明、引脚设置、for循环、以及函数调用。
在主函数中,只有两个调用函数,先看其中一个就能明白了。
- void fadeOn(unsigned int time,int increament){
- for (byte value = 0 ; value < 255; value+=increament){
- analogWrite(ledPin, value);
- delay(time/(255/increament));
- }
- }
复制代码
fadeOn()函数有两个传递参数,从参数名称中就可以简单看出,int time指的是时间,int increament指的是增量。函数中包含了一个for循环,循环条件是value<255,变量的增量由 increament决定。
for语句中涉及了一个新函数
- analogWrite(ledPin, value);
复制代码
如何发送一个模拟值到一个数字引脚呢?就要用到该函数,使用这个函数是要具备特定条件的——该数字引脚需具有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。
你可以试下设置0~255之间不同的值,看看LED的亮度是不是有变化。
可以做些其他的事
用LED能否做个火焰的效果,通过PWM使LED产生随机的亮度变化,来模拟一个火焰闪烁的效果。找个用个浅色罩子盖住效果更佳,可以放在家中作为小夜灯。
主要材料:一个红色LED、两个黄色LED以及220欧电阻。在这个实验中,有个函数会比较好用——random()。random()可是产生一定范围内的随机数。
提示:可以先设定LED灯亮度,在其值附近产生一个随机数,比如random(120)+135,让其值稳定在135附近,产生这种小幅变化,就更具有火焰跳跃感。不妨尝试一下。