【任务导航】

1.会连接多个LED灯电路。
2.能熟练使用pinMode(pin,val)、digitalWrite(pin,val)和delay(ms)函数,能熟练使用Mixly中的“输入/输出”模块库。
3.能知道LED的交替闪烁,理解程序执行的顺序性。
4.知道流水灯,能编写多种流水灯样式程序。

【知识加油站】

1.LED灯交替闪烁

“交替”一词在汉语中指轮流替换。比如甲代替乙,乙代替甲,可以循环往复。在此,我们让两个LED灯交替闪烁,意思就是让一个灯亮完,另一个灯再亮,不能出现两个LED灯同时点亮或者同时熄灭的情况。保证每个时刻只有一个灯亮一个灯灭。

2.流水灯

一组灯具在控制系统的控制下按照设定的顺序和时间来点亮和熄灭,形成一定的视觉效果,这样的一组灯就叫做流水灯。流水灯常用于室外灯光秀和店面招牌,通过流动的控制呈现出更加酷炫的视觉效果。
第二节 LED闪烁 - 图1
图2.2.1 流水灯效果图(图片来自网络)
在Arduino的创意设计中,通常采用多个LED灯连接到Arduino的I/O口上,通过不同的点亮顺序和点亮速度来实现一些不一样的灯光效果或传递不同的信息。

【自己动手】

任务1:让两个LED灯实现交替闪烁

1.任务要求
分别在Arduino的2号、3号数字引脚连接一个LED灯,编写程序让两个LED灯实现交替点亮,自行调整交替点亮的间隔时间以实现不同的效果。连接电路时可以考虑用Arduino扩展板来实现电路连接。

2.所需硬件
Arduino UNO/NANO主板一块、LED灯2个(不限颜色)、杜邦线4根、对应USB线数据1根。

3.参考电路
第二节 LED闪烁 - 图2
图 2.2.2 两个LED灯交替闪烁电路
4.参考程序

  1. void setup() {
  2. pinMode(2, OUTPUT); //设置LED引脚为输出模式
  3. pinMode(3, OUTPUT);
  4. }
  5. void loop() {
  6. digitalWrite(3, LOW); //2号灯亮3号灯灭
  7. digitalWrite(2, HIGH);
  8. delay(500);
  9. digitalWrite(2, LOW); //3号灯亮2号灯灭
  10. digitalWrite(3, HIGH);
  11. delay(500);
  12. }

第二节 LED闪烁 - 图3
图2.2.3 两个LED灯交替闪烁程序

任务2:实现多个LED灯的依次点亮

1.任务要求
①在Arduino扩展板上完成电路连接,关于Arduino扩展板的使用请参看第一章第二节相关内容。分别在Arduino的2、3、4、5、6数字引脚上连接一个LED灯,编写程序实现让LED灯以2号-6号的顺序依次点亮后保持1秒,然后全部熄灭,如此循环。
②编写自己喜欢的1-2种流水灯的样式。比如:依次点亮再依次熄灭,左右对撞点亮等等。

2.所需硬件
Arduino UNO/NANO主板一块,Arduino主板对应扩展板1块、LED灯5-8个(不限颜色)、杜邦线若干、对应USB线数据1根。

3.参考电路
第二节 LED闪烁 - 图4
图2.2.4 5个LED灯依次点亮电路图
4.参考程序

  1. void setup() {
  2. pinMode(2, OUTPUT); //设置LED引脚为输出模式
  3. pinMode(3, OUTPUT);
  4. pinMode(4, OUTPUT);
  5. pinMode(5, OUTPUT);
  6. pinMode(6, OUTPUT);
  7. }
  8. void loop() {
  9. digitalWrite(2, LOW); //所有灯灭
  10. digitalWrite(3, LOW);
  11. digitalWrite(4, LOW);
  12. digitalWrite(5, LOW);
  13. digitalWrite(6, LOW);
  14. delay(200);
  15. digitalWrite(2, HIGH); //2-6号灯以此点亮
  16. delay(200);
  17. digitalWrite(3, HIGH);
  18. delay(200);
  19. digitalWrite(4, HIGH);
  20. delay(200);
  21. digitalWrite(5, HIGH);
  22. delay(200);
  23. digitalWrite(6, HIGH);
  24. delay(1000);
  25. }

第二节 LED闪烁 - 图5
图2.2.5 5个LED灯依次点亮程序

【拓展学习】

通过任务2我们会发现,当我们连接了5个LED灯后就占用了Arduino的5个数字引脚接口,ArduinoUNO/NANO只有14个数字引脚接口和6-8个模拟接口。如果我们需要接很多个LED灯的时候(比如设计一个60个LED灯的旋转时钟,每个LED灯显示1秒),就会出现Arduino引脚不够用的情况。当出现引脚不够用的情况时,我们改如何解决呢?
首先想到的肯定是寻找更多的引脚,那就只能是更换Arduino主板型号,入门级的Arduino UNO/NANO就真的完成不了这样的任务了吗?此时我们换个思路考虑问题,就这么多的可用引脚,能否让一个引脚去控制更多的LED灯呢?想到这呢,答案是肯定的,直接控制会有些难度,但是借助一些专用的芯片的话,实现一个Arduino引脚控制多个LED灯那就会变得很简单了,接下来我们就介绍常见的两种方式。

1. 74HC595驱动芯片
74HC595是一个8位串行输入、并行输出的移位缓存器:并行输出为三态输出。在SCK 的上升沿,串行数据由SDL输入到内部的8位移位缓存器,并由Q7’输出,而并行输出则是在LCK的上升沿将在8位移位缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。74HC595是具有三态输出功能(即具有高电平、低电平和高阻抗三种输出状态)的门电路。输出寄存器可以直接清除。具有100MHz的移位频率。更为详细的资料可以自行网络上查找,在Arduino程序设计时可以直接使用shiftOut()函数来实现,具体的用法请参看Arduino语法手册相关函数部分。在Mixly编程中也有对应的程序模块来实现此芯片的驱动,在“输入/输出”程序模块库中有一个如图2.2.6所示的程序块,就可以用来驱动74HC595芯片。
第二节 LED闪烁 - 图6
图2.2.6 shiftOut()函数图形化程序块

2. WS2812集成型LED
WS2812B是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个5050LED灯珠相同,每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大驱动电路,还包含有高精度的内部振荡器和可编程定电流控制部分,有效保证了像素点光的颜色高度一致。
该LED灯珠数据通信协议采用单线归零码的通讯方式,像素点在上电复位以后,DIN端接受从控制器传输过来的数据,首先送过来的24bit数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit。像素点采用自动整形转发技术,使得该像素点的级联个数不受信号传送的限制,仅受限信号传输速度要求。高达 2KHz 的端口扫描频率,在高清摄像头的捕捉下都不会出现闪烁现象,非常适合高速移动产品的使用。280μs以上的RESET时间,出现中断也不会引起误复位,可以支持更低频率、价格便宜的MCU。该LED具有低电压驱动、环保节能、亮度高、散射角度大、一致性好超、低功率及超长寿命等优点。将控制电路集成于LED上面,电路变得更加简单,体积小,安装更加简便。如图2.2.7所示,就是市面上常见的WS2812环形灯板。
第二节 LED闪烁 - 图7
图2.2.7 WS2812环形灯板

【思考与讨论】

1.如何让LED灯的亮灭受人为控制,而不只是简单的程序控制?