# 讀取數字引腳
> 這個例子展示了在通過USB,將Arduino或Genuino和電腦之間建立串口通信連接后,如何監測一個開關的狀態。
### 所需硬件
* Arduino板Genuino板
* 記憶開關、按鍵或撥動開關
* 10kΩ電阻
* 面包板連接線
* **面包板**
### 電路

用到三根線。紅色和黑色的線分別連接到面包板兩側豎直的兩排接口,以此擴展多個5V和GND的接口(紅色一排->紅色線->5V 藍色一排->黑色線->GND)。第三根線從2號引腳連接到按鍵右上側,按鍵右下側引腳連接到一個**下拉電阻**(這里用10kΩ電阻),然后將下拉電阻接到GND。按鍵左下側接到5V。
按鍵或者開關將在被按下時連通兩側。當按鍵處于**開路**時(未按下),按鍵兩側并不會有連接。Arduino引腳這時連接的是GND(通過下拉電阻),代碼中讀出來就是**LOW**(數值0)。當按鍵處在**閉路**時(按下),兩端連通,因而Arduino引腳就會被連接到5V,代碼中讀出來就是**HIGH**(數值1)。
如果你將數字引腳**懸空**(沒接下拉電阻),LED可能會不規律的閃爍。這是因為此時Arduino引腳的輸入一直在”漂移”。就是說,程序不能判定它是高電壓還是低電壓,故而只會隨機的返回HIGH或LOW。這解釋了這里我們為何需要下拉電阻。
### 原理圖

### 代碼
在下列程序中,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