四时宝库

程序员的知识宝库

Arduino入门教程3:开关(arduino按键开关原理)

在上篇教程中我们了解了如何使用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灯则会熄灭。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接