# 读取数字引脚
> 这个例子展示了在通过USB,将Arduino或Genuino和电脑之间建立串口通信连接后,如何监测一个开关的状态。
### 所需硬件
* Arduino板Genuino板
* 记忆开关、按键或拨动开关
* 10kΩ电阻
* 面包板连接线
* **面包板**
### 电路
![](https://box.kancloud.cn/b5f9c43c4cf23104bb2163dba6766d55_729x283.png)
用到三根线。红色和黑色的线分别连接到面包板两侧竖直的两排接口,以此扩展多个5V和GND的接口(红色一排->红色线->5V 蓝色一排->黑色线->GND)。第三根线从2号引脚连接到按键右上侧,按键右下侧引脚连接到一个**下拉电阻**(这里用10kΩ电阻),然后将下拉电阻接到GND。按键左下侧接到5V。
按键或者开关将在被按下时连通两侧。当按键处于**开路**时(未按下),按键两侧并不会有连接。Arduino引脚这时连接的是GND(通过下拉电阻),代码中读出来就是**LOW**(数值0)。当按键处在**闭路**时(按下),两端连通,因而Arduino引脚就会被连接到5V,代码中读出来就是**HIGH**(数值1)。
如果你将数字引脚**悬空**(没接下拉电阻),LED可能会不规律的闪烁。这是因为此时Arduino引脚的输入一直在”漂移”。就是说,程序不能判定它是高电压还是低电压,故而只会随机的返回HIGH或LOW。这解释了这里我们为何需要下拉电阻。
### 原理图
![](https://box.kancloud.cn/aafb0fe8e7d65b70ba9431eb5c2d0ba5_568x674.png)
### 代码
在下列程序中,setup()所执行的第一件事情就是用以下代码打开板子和电脑的串口连接,波特率为9600:
~~~
Serial.begin(9600);
~~~
接着,初始化2号数字引脚,这个引脚将会从按键获取**输出**来作为**输入**:
~~~
pinMode(2,INPUT);
~~~
现在setup函数已经执行完成,开始执行loop函数。
当按键被按下,5V电压会让电流自由的流动在电路中。若松开,输入引脚将与10kΩ的下拉电阻相连。你需要了解:在Arduino眼里,这个引脚的状态要么是高电平(对应HIGH或数值1),要么是低电平(对应LOW或数值0)。并没有任何中间状态。这就是所谓的**数字输入**(digital input)大法。
loop函数中应做的第一件事情就是建立一个变量以保存从开关的状态。由于连接开关的引脚只会读出数值1或数值0,因而使用int类型较合适。我们把这个变量命名为**sensorValue**,并且让它与2号引脚的状态之间关联。使用以下代码就可轻松实现:
~~~
int sensorValue = digitalRead(2);
~~~
一旦板子读到了输入,就会将这个信息以十进制数的格式输出到电脑。你可以用这行代码解决:
~~~
Serial.println(sensorValue);
~~~
现在,当你打开Arduino IDE上的串口监视器,你就会看到一列0或1。0代表开关断开,1代表开关连接。
~~~
/*
读取数字引脚
读取引脚2上的值并且将结果输出到串口监视器。
本例程公开。
*/
// 2号引脚有一个按键,给他命名:
int pushButton = 2;
// setup函数在上电或复位后运行一次:
void setup() {
// 初始化串口,波特率9600:
Serial.begin(9600);
// 将2号引脚设置为输入模式:
pinMode(pushButton, INPUT);
}
// loop函数持续不断的运行:
void loop() {
// 读取输入引脚:
int buttonState = digitalRead(pushButton);
// 将按键状态输出到串口监视器:
Serial.println(buttonState);
delay(1); // 在读取操作前延时,以保证稳定
}
~~~
## 相关资料
[setup()](http://www.arduino.cc/en/Reference/Setup)
[loop()](http://www.arduino.cc/en/Reference/Loop)
[pinMode()](http://www.arduino.cc/en/Reference/PinMode)
[digitalRead()](http://www.arduino.cc/en/Reference/DigitalRead)
[delay()](http://www.arduino.cc/en/Reference/Delay)
[int](http://www.arduino.cc/en/Reference/Int)
[serial](http://www.arduino.cc/en/Reference/Serial)
[DigitalPins](http://www.arduino.cc/en/Tutorial/DigitalPins)
[读取模拟信号、串口操作
Arduino工程的最小单元
点亮LED
LED亮度渐隐
读取模拟电压值]( )
- 说明
- 系统示例文件目录结构及说明
- 01.Basics
- AnalogReadSerial
- BareMinimum
- Blink
- DigitalReadSerial
- Fade
- ReadAnalogVoltage
- 02.Digital
- BlinkWithoutDelay
- Button
- Debounce
- DigitalInputPullup
- StateChangeDetection
- toneKeyboard
- toneMelody
- toneMultiple
- tonePitchFollower
- 03.Analog
- AnalogInOutSerial
- AnalogInput
- AnalogWriteMega
- Calibration
- Fading
- Smoothing
- 04.Communication
- ASCIITable
- Dimmer
- Graph
- Midi
- MultiSerial
- PhysicalPixel
- ReadASCIIString
- SerialCallResponse
- SerialCallResponseASCII
- SerialEvent
- SerialPassthrough
- VirtualColorMixer
- 05.Control
- Arrays
- ForLoopIteration
- IfStatementConditional
- switchCase
- switchCase2
- WhileStatementConditional
- 06.Sensors
- ADXL3xx
- Knock
- Memsic2125
- Ping
- 07.Display
- barGraph
- RowColumnScanning
- 08.Strings
- CharacterAnalysis
- StringAdditionOperator
- StringAppendOperator
- StringCaseChanges
- StringCharacters
- StringComparisonOperators
- StringConstructors
- StringIndexOf
- StringLength
- StringLengthTrim
- StringReplace
- StringStartsWithEndsWith
- StringSubstring
- StringToInt
- 09.USB
- Keyboard
- KeyboardLogout
- KeyboardMessage
- KeyboardReprogram
- KeyboardSerial
- KeyboardAndMouseControl
- Mouse
- ButtonMouseControl
- JoystickMouseControl
- 10.StarterKit_BasicKit (与特定硬件相关,暂无)
- p02_SpaceshipInterface
- p03_LoveOMeter
- p04_ColorMixingLamp
- p05_ServoMoodIndicator
- p06_LightTheremin
- p07_Keyboard
- p08_DigitalHourglass
- p09_MotorizedPinwheel
- p10_Zoetrope
- p11_CrystalBall
- p12_KnockLock
- p13_TouchSensorLamp
- p14_TweakTheArduinoLogo
- p15_HackingButtons
- 11.ArduinoISP(暂无)
- ArduinoISP