1.2. 呼吸灯

前一节中我们已经掌握利用控制led属性及状态的程序代码块,分别实现红色LED和白色LED的亮/灭控制,或者利用切换led状态程序代码块分 别控制红色LED和白色LED的状态切换,也能达到指示灯闪烁的目的。

如果我们能够改变LED指示灯的亮度,使用LED指示灯输出更多种计算机系统状态,譬如工作状态、空闲状态、故障状态等。这一节我们来学习 控制LED亮度的方法。

我们首先以BlueFi的白色LED为例,实现其亮度控制。BlueFi的白色LED主要作用是为集成光学传感器提供辅助光,根据不同的光照环境, 能够调节辅助光的亮度是基本的需求。

1.2.1. 白色LED的亮度控制

首先看一个示例:

../../_static/images/basics/ledpwm1.png

将这个示例下载到Bluefi中你会发现白色led灯并没有亮起来,那么接下来试验一下,将占空比分别改为100,1000,10000,65535, 然后将程序分别下载到Bluefi中,观察白色led的亮度改变。

如果你真的动手试验过,相信你会得到这样的结论:赋予白色led占空比的值越大白色LED灯越亮。当占空比为0时,白色LED灯完全灭掉, 当占空比为65535时,灯光最亮。

显然,我们能够用程序来控制白色LED灯的亮度,只要将led的占空比设置为不同的值,亮度随着值的大小变化。这种控制LED亮度的 原理是什么?


1.2.2. PWM

PWM, 脉冲宽度调制(Pulse-Width Modulation)的英文缩写。这是一种计算机系统内常用的特殊数字信号,这种信号的形式是方波, 频率是固定不变的,但是高电平的宽度与周期的比值是可调节的,俗称“脉冲(高电平)宽度(可)调变”信号。根据前一节的所知道的, led.white=1时白色LED灯亮,为0时灭。PWM方法调节LED亮度的原理是,以固定的周期,如1000ns,其中500ns让LED亮,500ns让 LED灭,LED的实际亮度为最大亮度的1/2;其中250ns亮,750ns灭,LED的实际亮度为最大亮度的1/4;如果0ns亮,1000ns灭,实际 上LED是灭掉的;如果1000ns亮,0ns灭,实际上LED处于最亮状态;..。

由此,我们可以推断出:PWM控制LED亮度的数学计算如下:

  • 亮度 = (高电平的宽度)/(PWM周期) * 最大亮度

当高电平的宽度刚好等于PWM周期时,LED最亮;当高电平的宽度为0时,LED灭;当高电平宽度为PWM周期的1/4时,LED亮度就是最大亮度的 1/4。

1.2.3. 红色LED的亮度

在Bluefi在线图形化编程软件中将下方程序编辑完成,并保存到/CIRCUITPY/code.py文件,让BlueFi执行这个示例的程序,观察红色LED 亮度的变化规律:

../../_static/images/basics/huxideng1.png

仔细观察本示例程序的执行效果,感觉到BlueFi在给你眨眼了吗?红色LED灯的亮度逐渐编导最亮,然后立即熄灭,再逐渐变为最大,如此往复。 为什么有这种效果?下面我们逐行来分析每行脚本程序的效果。

示例代码分析:

  • 第1行,初始化程序,相当与程序下载进Bluefi之后告知Bluefi从此开始执行程序
  • 第2行,声明一个变量“b”,并赋值0
  • 第3行,重复执行,也就是无穷循环的程序块
  • 第4行(无穷循环程序块的第1行),led对象的red属性(led.red)设置为变量b的值
  • 第5行(无穷循环程序块的第2行),将变量b的值增加655
  • 第6行(无穷循环程序块的第3行),判断变量b的值是否大于65535
  • 第7行((无穷循环程序块的第4行),如果b>65535,则b=0
  • 第8行(无穷循环程序块的第5行),执行time的sleep方法,参数为0.01秒(即10ms)

这个示例中,我们在无穷循环的程序块中不停地将变量b增加655,一直增加到b>65535之后再把b重新赋值为0,如此重复,而且每重复一次就 把led的占空比设置成b的值。

变量,允许在程序中改变的量!在本示例中,变量b的值不停顺序取{0, 655, 1310, .., 41920}数据集中的一个值,并把这个数值当作 红色LED的占空比。红色LED亮度的变化规律正好与数据集中的数值变化规律一致。

1.2.4. 呼吸灯

以下示例的程序执行结果具有特殊的医学效果:催眠。运行本示例程序时,切勿直视BlueFi的白色LED,直视白色LED太久,你可能会被催眠。

../../_static/images/basics/huxideng2.png

你被催眠了吗?这个示例程序的执行效果俗称“呼吸灯”。白色LED的亮度从灭逐渐变为最亮,然后又逐渐灭掉,如此重复。这样的周期如果正好与 你的呼气-吸气的周期一致,据说很容易把你催眠。

这段程序能够让白色LED亮度随着我们呼吸节奏改变亮度,其中的关键之处是变量b的变化规律。第8~14行程序都是在增加或减少b变量的值。

你能用一句既贴切又合适的话来概括变量b的变化规律?

总结:

  • 输出类代码块抽屉中的LED(PWM控制)积木块
  • 设置红色/白色led的占空比数值改变led灯的亮度
  • 变量
  • 变量赋值
  • 变量自增/自减
  • 本节中,你总计完成了22行代码的编写工作

重要

出现的代码积木块

  • 设置红色/白色led的占空比数值,设置红色/白色led的灯光亮度
  • 将变量的数值设为,变量赋值