在上篇教程中我们了解了如何使用Arduino来控制LED灯,在这篇教程中我们会在上篇的基础上,添加一个按钮,来使用按钮控制LED灯。为此,我们需要:
- 一个按键开关
- 一个10K欧姆电阻
- 一些跳线
- 面包版
若是要使用外接LED的话,还需要上篇教程(教程2)中所提及的材料。
现在,将这些元件以以下方式连接到面包版上:
这个电路的工作原理如下:
当这个开关没有闭合时,也就是没有被按下时,5V的电路与Arduino的2接口间是断开的,此时2接口与地线想接,所以Arduino从2接口所获的输入为LOW。
当开关闭合时,2接口与5V相接,从而导致Arduino接收到HIGH的输入。通过代码编程,我们可以通过这个Arduino所接收的输入变化,来控制LED灯。
代码如下:
const int buttonPin = 2;
const int ledPin = 13;
int buttonState = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
digitalWrite(ledPin, HIGH);
} else {
digitalWrite(ledPin, LOW);
}
}
逐行分解,这段代码的功能如下:
将这个代码所要使用的两个接口数值保存在常量内
const int buttonPin = 2;
const int ledPin = 13;
将开关的状态保存在buttonState值内
int buttonState = 0;
将LED接口设置为输出口;将开关接口设置为输入口
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
使用digitalRead功能检查开关状态
buttonState = digitalRead(buttonPin);
如果开关被按,那么。。。
if (buttonState == HIGH) {
将LED灯打开
digitalWrite(ledPin, HIGH);
如果是其他状态(开关没有被按)。。。
} else {
将LED灯熄灭
digitalWrite(ledPin, LOW);
学习过电子电路的小伙伴们应该都会了解,当一个物理开关被打开或闭合的时候,都会出现一种叫做开关抖动的效果。每当一个开关有状态转换时,这个电路都会有一个数十毫秒的不稳定状态。如下图所示,这种状态体现在这个电路会反复在开与关这两种状态间“抖动”。当一个电路信息被数字化系统所接收时,就像我们现在运用Arduino这种情况,这种抖动很可能被解读为按钮在短时间内有大量的开关,从而导致程序的错误运行。
为了避免这种情况,我们可以在代码里编入一个去抖动开关(debouncer)。这个去抖动开关会在短时间内两次,或多次检查开关状态,以确认开关是否真的处于开或者关的状态。
这段代码如下:
const int buttonPin = 2;
const int ledPin = 13;
int ledState = HIGH;
int buttonState;
int lastButtonState = LOW;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, ledState);
}
void loop() {
int reading = digitalRead(buttonPin);
if (reading != lastButtonState) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (reading != buttonState) {
buttonState = reading;
if (buttonState == HIGH) {
ledState = !ledState;
}
}
}
digitalWrite(ledPin, ledState);
lastButtonState = reading;
}
逐行分解,这段代码的功能如下:
将LED初始状态设置为打开,并将开关状态设置为不闭合
int ledState = HIGH;
int buttonState;
int lastButtonState = LOW;
初始化一个去抖动初始时间
unsigned long lastDebounceTime = 0;
将重复检查的间隔设置为50毫秒
unsigned long debounceDelay = 50;
将开关状态保存在reading内
int reading = digitalRead(buttonPin);
如果现在读取的开关状态不符合上一次读取的状态的话。。。
if (reading != lastButtonState) {
将当前时间保存为去抖动的初始时间
lastDebounceTime = millis();
如果现在时间减去去抖动初始时间超过了检测间隔。。。
if ((millis() - lastDebounceTime) > debounceDelay) {
并如果开关状态发生了变化。。。
if (reading != buttonState) {
将检测到的新开关状态保存
buttonState = reading;
如果开关被按了的话。。。
if (buttonState == HIGH) {
改变LED的状态(开改为关/关改为开)
ledState = !ledState;
将这个变化写入LED灯内
digitalWrite(ledPin, ledState);
将读取的开关状态保存,以便下次运行loop命令时做判定
lastButtonState = reading;
至此,我们可以通过Arduino来制作一个非常简易的灯。有了这段代码,每当我们按下开关时,LED便会亮起,直到我们再次按下时,LED灯则会熄灭。