aduio流水灯程序(aduio流水灯3个如何取接口)
导语:Arduino入门 第三节 流水灯(上)
在上一期课程中,我们经过了"点灯"仪式的"洗礼",基本认识了Arduino数字引脚输出控制的基本流程和方法,本期中我们将介绍几种流水灯的实现方法,更深入地了解数字引脚输出控制的方法。
在进入课程以前,我们应该先准备一个流水灯的灯板,灯的位数可以做到16位,以方便后面的"摇摇棒"课程使用。灯板我们可以用面包板来搭建,或者用万能的"洞洞板"自己动手焊一个,灯的连接方式可以选择"共阴极"或"共阳极"。本期课程使用的是一个16位的"摇摇棒"灯板,配套的Arduino板为NANO板,LED连接到板的引脚为D4-D13、A0-A5,共阴极连接,D2及D3是NANO的两个外部中断引脚,连接了两个水银开关,作为摇摇棒的方向控制。下面,我们先以D4-D13控制的10个LED为例,来学习流水灯控制。
流水灯,就是亮起的一个或几个灯在一个灯带上"流动",如同流水一样。最简单的一个灯流灯的效果就是灯带上的灯按顺序,逐个"点亮-熄灭",我们看到的就是一个亮起的灯在流动。所以,从本质上来说,我们的程序就是控制Arduino的数字引脚按顺序,输出一个高电平并维持一定的时间,再输出低电平,然后跳转下一个灯做同样的操作。注意:同样的操作,也就是一个重复的操作,其中改变的只是引脚的编号,而且引脚编号是连续的,那么我们可以用一个"for"循环来实现这个操作。在"setup"中,我们同样可以用"for"循环来实现所有输出引脚的模式设置。下面给出示例代码:
通过上面的代码示例,应该着重掌握"for"循环的使用方法。在"setup"中,我们需要将D4-D13这10个引脚"一个一个地"配置为输出模式,并且将其输出电平"强制"拉低,而这个操作实际上是一个"重复"的过程,并且引脚顺序是从4-13连续增加的,因此可以将4和13作为"for"循环的限制条件中的变量"i"的取值范围,即"i"从4开始,一直自加到13,那么i的取值范围就是大于等于4,小于等于13,也可以是小于14,因为小于14的前面一个整数就是13。在"loop"中出现了两个"for"循环,第一个"for"中,变量"i"是递增的,第二个"for"中则是递减的,它们分别控制了流水灯的"流动方向",这里要注意变量i的取值范围。另外,在给引脚写入电平状态时-digitalWrite(),状态关键字"HIGH/LOW"也可以用数字"1/0"代替。
上面的代码是基于"共阴极"连接的电路设计的,那么如果电路是以"共阳极"连接的如何简单快捷地修改代码呢?前面的课程提到:共阴和共阳的驱动正好是相反的,那么实际就是把上面代码中写"HIGH"的地方改成"LOW",而"LOW"的地方改成"HIGH"即可。下面给出一种方法:
以上代码使用了"宏"定义及"条件编译"的方法来实现"共阴""共阳"的快速切换。"//"在代码中可以用于"注释"一行代码,也就是跟在它后面的这一行代码作为一个注释(相当于一个说明),在编译时就不起作用,相当于没有这一行代码。我们可以这样通俗地解读上面的代码:宏可以理解为"关键字",定义两组"关键字":define COM_ANODE(共阳),然后用"//"来作为"选择开关",前面加"//"的则被"关闭",紧接着后面的"define COM_CATHODE是"选中"的状态,那么后面就会选择"endif"之间的"关键字"(宏)进行编译,即程序中所有出现的"ON"对应的就是"1","OFF"则对应的"0"。如果以"//"关闭define COM_ANODE前面的"//" 去掉,则程序中的"ON"则对应"0","OFF"则对应"1",这样在不改动程序的情况下,只需用"//"就可以实现共阴共阳的代码切换(切换之后必须编译-烧录代码)。大家也可以试验一下"共阴极"的代码运行在"共阳极"的电路中或"共阳极"的代码运行在"共阴极"的电路中是什么效果,以加深对电路及代码的理解。
接下来,我们对程序进行一些改进,让16个LED都用起来。在NANO板中,"A0"引脚的编号实际上就是第"14"号引脚,依次类推"A7"则是第"21"号引脚,UNO则只到"A5",即第"19"号引脚,而MEGA2560板的"A0-A15"则对应"54-69"号引脚,这个定义是在Arduino IDE的库函数中进行定义的。说到这里,也许大家会想到将"for"中的变量"i"的范围加大为"4-19"不就可以驱动16个LED了,没错,这是可以的,但我们要引入一种新的方法,让程序更具一般性和"可移植性"。
这里要介绍的方法就是将引脚编号放入一个数组中,那么"for"中变量"i"的范围就可以统一为"0-15",这个处理方法对于后面的很多试验是具有重要意义的,具体的会在后期的课程中提及。关于数组的一些定义及使用方法,大家可以参考C语言的相关书籍,在此不再赘述。
接下来要说一下digitalWrite()这个函数中的两个入口参数,两个参数都为"unit8_t"的类型,那么我们建立数组的类型也应该是"uint8_t",当然"int"也是可以的,但是"int"占用的存储空间是"uint8_t"的两倍,我们本着"不浪费"及规范的原则,使用"unit8_t"的类型来定义数组。数组中的元素就是16个引脚编号。下面给出示例代码:
在上述代码中,将所有引脚的编号按顺序放在了名为"led_pin"的数组中,引脚编号从13往后,即从"A0"开始,有两种定义方法,一种是保持"A0,A1…",另一种是从A0开始改为
"14,15..",两种方法都是可以的,这就是ArduinoIDE库的一个"强大"之处。
本期就讲到这里,在下一期中,我们还将循序渐进,介绍另一种流水灯的"玩法"。
本文内容由快快网络小余整理编辑!