/

Arduino專案:讀取數位輸入

Arduino專案:讀取數位輸入

在這個專案中,您將學習使用digitalRead()函數從數位I/O腳位讀取數據。

Arduino Uno板上的數位I/O腳位通常位於USB連接埠一側並可能在腳位上有標示為數位的標籤,就像我的情況一樣:

這些腳位的編號從0到13,但除非沒有足夠的腳位,否則您幾乎不會使用腳位0和1,因為它們用於串列通信(請參閱印刷在腳位上的rx和tx標籤)。

首先,我們將建立電路,然後轉到電腦上的Arduino IDE。

這個電路非常簡單。我們將使用一個按鈕,其中一個引腳連接到Arduino的GND,另一個引腳連接到數位腳位#3(任何其他數位腳位均可)。

我們將每秒檢測腳位#3的電壓水平。我們將定義腳位號碼為常數以避免在代碼中使用神奇數字

1
#define BUTTON_PIN 3

setup()函數中,我們呼叫pinMode()將此腳位設置為輸入腳位,並使用INPUT_PULLUP選項:

1
pinMode(BUTTON_PIN, INPUT_PULLUP);

需要使用INPUT_PULLUP選項,因為默認情況下,如果沒有任何東西連接到腳位上(如果按鈕未點擊,電路是斷開的,就像沒有任何東西連接到腳位上),輸入腳位是浮動的,這意味著它容易受到干擾,可能會隨機選擇0或1。

在電路中,我們可以添加上拉電阻或下拉電阻,但更簡單的方法是將INPUT_PULLUP標誌傳遞給Arduino。如果沒有連接任何東西,它將默認為1。

然後,在loop()函數中,我們使用digitalRead()函數獲取輸入腳位的值:

1
int value = digitalRead(BUTTON_PIN);

這個值可以是0或1,取決於輸入。

如果按下按鈕,Arduino將檢測到0。

如果未按下按鈕,Arduino將檢測到1。

您也可以使用常數LOW(對應0)和HIGH(對應1)。

這個值可以打印到串行輸出上,就像在這個程式中一樣:

1
2
3
4
5
6
7
8
9
10
11
12
#define BUTTON_PIN 3

void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
Serial.begin(9600);
}

void loop() {
int value = digitalRead(BUTTON_PIN);
Serial.print(value);
delay(1000);
}

保存並上傳程式到Arduino,然後在Arduino IDE中點擊右上角的“Serial Monitor”按鈕:

它將顯示串行接口監視器。請確保底部調整到9600波特率,您應該會看到一堆1,直到您按下按鈕一秒鐘,此時您應該會得到一個0

我们还可以点亮一个LED。我们可以将LED添加到电路中,但我们也可以使用Arduino Uno板上的內建LED,它映射到数字I/O腳位#13。我们可以这样编写程序:

1
2
3
4
5
6
7
8
9
10
11
12
#define BUTTON_PIN 3

void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
}

void loop() {
int value = digitalRead(BUTTON_PIN);
digitalWrite(13, value);
}

实时反映按钮输入值,无需等待1秒。之前我们这样做是为了避免向串行接口写入过多的值,使其难以管理。

看到了吗?当程序启动时,内建LED(靠近顶部的腳位#13 / GND)亮起,当我们按下按鈕时它会变暗

您也可以相反地做(保持其关闭,只有在我们按下按钮时才打开):

1
digitalWrite(13, !value);

而且,您可以使用內建常數LED_BUILTIN代替神奇數字13

1
2
3
4
5
6
7
8
9
10
11
12
#define BUTTON_PIN 3

void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
}

void loop() {
int value = digitalRead(BUTTON_PIN);
digitalWrite(LED_BUILTIN, !value);
}

tags: [“Arduino”, “digital input”, “digitalRead()”, “INPUT_PULLUP”, “LED”]