Arduino 学习(一): 简单的 LED 程序
Arduino 学习(一): 简单的 LED 程序
LED 闪烁
Arduino 的 LED 闪烁和其他语言开始的 Hello, world! 类似,是开始 Arduino 之旅的第一段程序。
电路接法
LED 长脚(+)接在 13 号引脚,短脚(-)接在 GND。
LED 闪烁代码
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
长按亮代码
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 是一直在被重新赋值的。
一直按着显然不符合常理,正常操作应该是按下时点亮,再按熄灭。
按下时点亮,再按熄灭
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 进行改变。
改进后的按下时点亮,再按熄灭
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。
去抖后的按下时点亮,再按熄灭
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。