友情提示:380元/半年,儿童学编程,就上码丁实验室。
你已经了解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 按顺序轮流点亮,就是传说中的跑马灯效果,程序如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
intdel=100;// 设置延时,100毫秒
voidsetup()
{
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
}
voidloop()
{
digitalWrite(8,HIGH);
delay(del);
digitalWrite(8,LOW);
digitalWrite(9,HIGH);
delay(del);
digitalWrite(9,LOW);
digitalWrite(10,HIGH);
delay(del);
digitalWrite(10,LOW);
digitalWrite(11,HIGH);
delay(del);
digitalWrite(11,LOW);
digitalWrite(12,HIGH);
delay(del);
digitalWrite(12,LOW);
digitalWrite(13,HIGH);
delay(del);
digitalWrite(13,LOW);
}
|
看看效果:
这程序很容易理解,端口 8~13 设置为输出模式,然后点亮一个就灭掉一个,而且也能很好工作。只是重复代码太多,6 个 LED 好处理,但如果有几百个 LED 呢?
Arduino Uno 只有 32KB 程序空间,因此必须精简以节约空间,这样才能在以后容纳更复杂的系统。我们将上述程序改成 for 循环:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
intdel=100;// 延时默认为100毫秒
voidsetup()
{
// 初始化端口的模式为 OUTPUT
for(inti=8;i<=13;i++)
{
pinMode(i,OUTPUT);
}
}
voidloop()
{
for(inti=8;i<=13;i++)
{
digitalWrite(i,HIGH);
delay(del);
digitalWrite(i,LOW);
}
for(inti=13;i>=8;i–)
{
digitalWrite(i,HIGH);
delay(del);
digitalWrite(i,LOW);
}
}
|
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(),本身已经是个循环,我们要在里面嵌套一个小循环:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
intdel=100;// 延时默认为100毫秒
voidsetup()
{
// 初始化端口的模式为 OUTPUT
for(inti=8;i<=13;i++)
{
pinMode(i,OUTPUT);
}
}
voidloop()
{
for(intj=1;j<=3;j++)
{
for(inti=8;i<=13;i++)
{
digitalWrite(i,HIGH);
delay(del);
digitalWrite(i,LOW);
}
for(inti=13;i>=8;i–)
{
digitalWrite(i,HIGH);
delay(del);
digitalWrite(i,LOW);
}
}
for(intk=1;k<=3;k++)
{
intp=random(8,14);
digitalWrite(p,HIGH);
delay(del);
digitalWrite(p,LOW);
}
}
|
p 是一个变量,用 random() 给它赋值前,要声明它的类型为整数 int:
1
2
|
intp;
p=random(8,14);
|
但为了节省空间,我们把它写成上面的形式。
灯光不仅是我们塑造环境氛围的一种基本需求,而且是一种艺术表现形式。后面你会发现通过 Arduino ,往往只需简单几段代码,就可以创造出千变万化的效果。