Arduino 学习(一): 简单的 LED 程序

Arduino 学习(一): 简单的 LED 程序

LED 闪烁

Arduino 的 LED 闪烁和其他语言开始的 Hello, world! 类似,是开始 Arduino 之旅的第一段程序。

电路接法

LED 长脚(+)接在 13 号引脚,短脚(-)接在 GND。

LED 闪烁代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const int LED = 13;  // Arduino 默认板上的 LED 就是连接 13 端口 

void setup() {
// 初始化,只有在程序开始的时候会执行
pinMode(LED, OUTPUT); // 设置引脚,并且引脚用来输出
}

void loop() {
// 重复执行的主程序
// digitalWrite 打开或关闭任何设置为输出的引脚
digitalWrite(LED, HIGH); // 将电位置为高电位
delay(1000); // 单位为 ms
digitalWrite(LED, LOW);
delay(1000);
}

在这里用到了三个函数

用来控制特定引脚输入输出情况

pinMode(引脚号, 输入/输出)

用来改变特定引脚的电位高低

digitalWrite(引脚号, 高/低电位)

用来延时

delay(毫秒数)

按钮控制 LED

光闪烁当然没意思,这次用一个按钮来控制 LED。

电路接法

  • LED 同上
  • 按钮一边接到 7 号引脚另一边是 GND

长按亮代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const int LED = 13;  
const int BUTTOM = 7;
int val = 0;

void setup() {
pinMode(LED, OUTPUT);
pinMode(BUTTOM, INPUT); // 按钮作为输入部分接在 7 号引脚
}

void loop() {
val = digitalRead(BUTTOM); // 按钮被按下的时候为高,否则为低

if (val == HIGH) {
digitalWrite(LED, HIGH);
}
else {
digitalWrite(LED, LOW);
}
}

这里用到了一个新函数

查看特定引脚处的电位状态,返回值为 HIGH 或 LOW

digitalRead(引脚号)

注意由于开关默认情况是按下之后立刻弹起,所以如果只按一下是看不到灯的变化的,只有一直按着灯才会亮起来。而由于 Arduino 运行得很快(相对于人手),因此 val 是一直在被重新赋值的。

一直按着显然不符合常理,正常操作应该是按下时点亮,再按熄灭。

按下时点亮,再按熄灭

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const int LED = 13;  
const int BUTTOM = 7;
int val = 0;
int state = 0;

void setup() {
pinMode(LED, OUTPUT);
pinMode(BUTTOM, INPUT); // 按钮作为输入部分接在 7 号引脚
}

void loop() {
val = digitalRead(BUTTOM); // 按钮被按下的时候为高,否则为低

if (val == HIGH) {
state = !state;
}

if (state) {
digitalWrite(LED, HIGH);
}
else {
digitalWrite(LED, LOW);
}
}

这里增加了一个状态位 state,只有当 val 变为 HIGH 的时候才会改变原来的状态,也就是按下时点亮,再按熄灭。

但是这样又有点问题,那就是因为程序运行得太快,因此在我们按下去的“一瞬间”,对 Arduino 已经循环了好多次了,state 的值在多次变化,最终的 state 的值是无法确定的,因此程序要继续改进。

改进的方法就是只有当 val 为 HIGH 且 val 前一次的值为 LOW 的时候才对 state 进行改变。

改进后的按下时点亮,再按熄灭

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
const int LED = 13;  
const int BUTTOM = 7;
int val = 0;
int old_val = 0;
int state = 0;

void setup() {
pinMode(LED, OUTPUT);
pinMode(BUTTOM, INPUT); // 按钮作为输入部分接在 7 号引脚
}

void loop() {
val = digitalRead(BUTTOM); // 按钮被按下的时候为高,否则为低

if (val == HIGH && old_val == LOW) {
state = !state;
}

old_val = val;

if (state) {
digitalWrite(LED, HIGH);
}
else {
digitalWrite(LED, LOW);
}
}

这样一来理论上就可以比较好地运行程序了,但是因为按键开关的机械特性,在按下的时候触点之间会发生弹跳,也就是开关在一定时间会在开和关之间抖动,虽然时间很短,但是对于 Arduino 来说完全可以检测到了,这时候就要进行“去抖”——也就是在改变状态之后延时一段时间,通常这里只需要 10~15ms。

去抖后的按下时点亮,再按熄灭

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
const int LED = 13;  
const int BUTTOM = 7;
int val = 0;
int old_val = 0;
int state = 0;

void setup() {
pinMode(LED, OUTPUT);
pinMode(BUTTOM, INPUT); // 按钮作为输入部分接在 7 号引脚
}

void loop() {
val = digitalRead(BUTTOM); // 按钮被按下的时候为高,否则为低

if (val == HIGH && old_val == LOW) {
state = !state;
delay(10);
}

if (val == LOW && old_val == HIGH)
delay(10);

old_val = val;

if (state) {
digitalWrite(LED, HIGH);
}
else {
digitalWrite(LED, LOW);
}
}

到这里,LED 程序就结束了。

Arduino 还是很有趣的,不过对于我这种手残党可能就要走一些弯路了 orz。