前面介紹了Arduino數(shù)字I/O扶踊,通過控制數(shù)字引腳輸出來控制LED燈亮滅。本篇將介紹數(shù)字I/O的輸入功能郎任,通過檢測按鍵狀態(tài)來控制LED燈亮滅秧耗,把LED的亮滅變成人為可控制的。
1. 實驗材料
- Uno R3開發(fā)板
- 配套USB數(shù)據(jù)線
- 面包板及配套連接線
- 1個LED燈
- 1個220Ω電阻
- 1個輕觸按鍵
實驗中我們用到了輕觸按鍵舶治,常見的有2腳按鍵和4腳按鍵分井,其內(nèi)部結(jié)構(gòu)如下圖所示:
按鍵內(nèi)部結(jié)構(gòu)
當(dāng)按下按鍵時,按鍵兩端接通霉猛,當(dāng)放開時尺锚,兩端再次斷開。
2. 實驗步驟
-
根據(jù)原理圖搭建電路
直插式LED燈負(fù)極接開發(fā)板GND惜浅,正極接220Ω限流電阻瘫辩,電阻另一端接開發(fā)板數(shù)字9引腳。按鍵一端接開發(fā)板GND坛悉,另一端接數(shù)字引腳2伐厌。
實驗原理圖如下圖所示:
實驗原理圖實物連接圖如下圖所示:
實物連接圖 新建sketch,拷貝如下代碼替換自動生成的代碼并進(jìn)行保存裸影。
/*
* Digital_Button
* 通過按鍵控制LED燈亮滅
*/
int buttonPin = 2; // 按鍵的管腳定義
int ledPin = 9; // LED燈管腳定義
void setup() {
pinMode(ledPin, OUTPUT); //設(shè)置LED管腳輸出模式
pinMode(buttonPin, INPUT_PULLUP); //設(shè)置按鍵管腳上拉輸入模式
}
void loop() {
if (digitalRead(buttonPin) == LOW) { // 若按鍵被按下
delay(80); //等待跳過按鍵抖動的不穩(wěn)定過程
if (digitalRead(buttonPin) == LOW) // 若按鍵被按下
{
digitalWrite(ledPin, HIGH); // 點亮LED燈
}
}
else {
digitalWrite(ledPin, LOW); // 熄滅LED燈
}
}
- 連接開發(fā)板挣轨,設(shè)置好對應(yīng)端口號和開發(fā)板類型,進(jìn)行程序下載轩猩。
程序下載
3. 實驗現(xiàn)象
按下按鍵卷扮,LED燈點亮。放開按鍵界轩,LED燈熄滅画饥。
實驗現(xiàn)象
4. 函數(shù)介紹
digitalRead()
- 描述:讀取指定數(shù)字引腳的值
- 函數(shù)原型:digitalRead(pin)
- 參數(shù):要讀取的數(shù)字引腳編號
- 返回值:HIGH(1)或LOW(0)
5. 總結(jié)分析
通過digitalRead()函數(shù)來讀取數(shù)字I/O引腳狀態(tài),然后根據(jù)狀態(tài)去點亮或者熄滅LED燈浊猾。需要注意:
- 由于Arduino上電后抖甘,數(shù)字I/O管腳處于懸空狀態(tài),此時通過digitalRead()讀到的是一個不穩(wěn)定的值(可能是高葫慎,也可能是低)衔彻。所以通過pinMode()函數(shù)設(shè)置按鍵引腳為上拉輸入模式薇宠。即使用內(nèi)部上拉電阻,按鍵未按下時艰额,引腳將為高電平澄港,按鍵按下為低電平。
- 按鍵在按下的過程中柄沮,有一段接觸未接觸的不穩(wěn)定過程回梧,即按鍵的抖動。在判斷按鍵狀態(tài)時祖搓,通過delay()延時跳過抖動的不穩(wěn)定狀態(tài)狱意,即軟件上進(jìn)行消抖。
- 可以不使用內(nèi)部上拉電阻拯欧,在電路上添加按鍵的上拉電阻或下拉電阻详囤,可達(dá)到相同效果。