数字输入

开关(switch)是一种基本的输入形式,它的作用是保持电路的连接或者断开。Arduino 从数字 I/O 管脚上只能读出高电平(5V)或者低电平(0V),通过上 /下拉电阻将开关的开/断状态转变成 Arduino 能够读取的高/低电平。按照电路的不同通常又可以分为正逻辑(Positive Logic)和负逻辑(Inverted Logic)两种。

正逻辑电路中,开关一端接电源,另一端则通过一个 10K 的下拉电阻接地,输入信号从开关和电阻间引出。当开关断开的时候,输入信号被电阻“拉”向地,形成低电平(0V);当开关接通的时候,输入信号直接与电源相连,形成高电平。对于经常用到的按压式开关来讲,就是按下为高,抬起为低。

下拉电阻

负逻辑电路中,开关一端接地,另一端则通过一个 10K 的上拉电阻接电源,输入信号同样也是从开关和电阻间引出。当开关断开时,输入信号被电阻“拉”向电源,形成高电平(5V);当开关接通的时候,输入信号直接与地相连,形成低电平。对于经常用到的按压式开关来讲,就是按下为低,抬起为高。

图片

范例:

验证 Arduino 数字 I/O 的输入功能:

将开关接在 Arduino的任意一个数字 I/O 管脚上(13 除外),并通过读取它的接通或者断开状态,来控制其它数字 I/O 管脚的高低。

本实验采用的原理图如下所示,其中开关接在数字 I/O 的 7 号管脚上,被控的发光二极管接在数字 I/O 的 13 号 管脚上:

按钮范例

代码(上拉电阻):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int ledPin = 13; //发光二极管
int switchPin = 7; //按钮开关
int value = 0;

void setup() {
pinMode(ledPin, OUTPUT);
pinMode(switchPin, INPUT);
}

void loop() {
value = digitalRead(switchPin);
if (HIGH == value) { // turn LED off 不按
digitalWrite(ledPin, LOW);
} else { // turn LED on 按
digitalWrite(ledPin, HIGH);
}
}

由于采用的是负逻辑电路,开关按下时用 digitalRead()函数读取到的值为 LOW,此时再用 digitalWrite()函数将发光二极管所在的管脚置为高,点亮发光二极管。同理,当开关抬起时,发光二极管将被熄灭,这样我们就实现了用开关来控制发光二极管的功能。

代码(下拉电阻):

1
2
3
4
5
6
7
8
9
10
11
12
13
void setup() {
pinMode(13,OUTPUT);
pinMode(7,INPUT);
}

void loop() {
if(digitalRead(7)==HIGH){ //按亮
digitalWrite(13,HIGH);
}
else{
digitalWrite(13,LOW); //不按灭
}
}