第2课 让多个 LED 闪烁

你已经了解Arduino 的基本工作原理,并且学会了控制一个灯,但觉得不够酷?Arduino Uno 有13个 DIGITAL I/O 端口,可以同时控制13个 LED。而且 Arduino 还可以通过 I2C、SPI 等协议扩展,控制几百个 LED 都不成问题,但扩展我们后面再讲,现在先演示一下怎样控制多个 LED 。

电路是这样设计的:从第 8 个 DIGITAL I/O 开始到第 13 个,每个端口串联一个220欧姆的电阻和 LED。其中,LED 正极(长的一端)接电阻,电阻再接I/O,LED 负极接地(Arduino 上的 GND 端口)

我们选用红黄绿 3 种 LED,但每种颜色的 LED 压降都不一样,红色约 2.1V,黄色2.4V、绿色2.7V,而 Arduino DIGITAL I/O 输出高电平为 5V ,这意味着串联的电阻压降不一样,三种 LED 通过电流大小不等,因此别奇怪它们的亮度不同。

现在要让 LED 按顺序轮流点亮,就是传说中的跑马灯效果,程序如下:

看看效果:

这程序很容易理解,端口 8~13 设置为输出模式,然后点亮一个就灭掉一个,而且也能很好工作。只是重复代码太多,6 个 LED 好处理,但如果有几百个 LED 呢?

Arduino Uno 只有 32KB  程序空间,因此必须精简以节约空间,这样才能在以后容纳更复杂的系统。我们将上述程序改成 for 循环:

IDE显示,没有优化前,程序占用1,270 字节,优化后为 1,122 字节,总空间的3%。现在对于动辄几 TB 存储空间的个人电脑来讲,1KB 根本不足道,但对 Arduino ,每一个字节都要精打细算。

现在我们让它有更多的变化,加入一个随机函数 random(),让跑马灯循环 3 遍后,随机点亮 3 个。

random(x) 函数,能够在 0 ~ x(不包含最大值 x)的范围内随机生成一个整数,比如 random(256),随机生成 0 ~ 255 中的一个整数,再如 random(10, 20),随机生成 10 ~ 19 中的一个整数。

void loop(),本身已经是个循环,我们要在里面嵌套一个小循环:

p 是一个变量,用 random() 给它赋值前,要声明它的类型为整数 int:

但为了节省空间,我们把它写成上面的形式。

灯光不仅是我们塑造环境氛围的一种基本需求,而且是一种艺术表现形式。后面你会发现通过 Arduino  ,往往只需简单几段代码,就可以创造出千变万化的效果。

Leave a Reply

Your email address will not be published. Required fields are marked *