Semorphe

按鈕

讓板子知道有人按了。 · ⏱ 約 30 分鐘

你會學到三件事

  1. digitalRead 讀一支腳現在是高還是低
  2. 為什麼沒接東西的腳會亂跳(浮接)
  3. INPUT_PULLUP 一行解決它,而按下去是 LOW

開始之前

前三課的板子都在「說」。這一課它要開始「聽」。

接線:按鈕一腳接 2 號腳,另一腳接 GND。 只要兩條線,不用電阻,理由在第二段。

🟢 先把編輯器打開,跟著下面一起做:跟著做

一、讀一支腳

讀一支腳的狀態,用 digitalRead:

🔎 這一段是試一下——打了看結果就好,不要留在程式裡。

1pinMode(2, INPUT);2int v = digitalRead(2);      // HIGH 或 LOW
2INPUT2讀取腳位宣告int(整數)變數v=設定腳位為12

digitalRead 和 digitalWrite 是一對:一個寫、一個讀。

積木盤上它寫著「讀取腳位 …」。

二、⚠️ 浮接:沒接東西的腳會亂跳

問題來了:按鈕沒按下去的時候,那支腳接到什麼?

答案是什麼都沒接。而一支什麼都沒接的腳, 會被空氣中的電磁雜訊推來推去,digitalRead 讀到的是隨機的。

這叫浮接(floating)。它的症狀是「沒按也會觸發」, 而且很難查,因為它時好時壞。

「沒接 = 0」是一個直覺,而它是錯的。 沒接就是沒接,不是低電位。

三、INPUT_PULLUP 一行解決

板子裡面內建了一顆電阻,可以把那支腳「默默拉到高電位」:

1pinMode(2, INPUT_PULLUP);
2INPUT_PULLUP設定腳位為1

這樣一來:

讀到
沒按 被內部電阻拉到 HIGH
按下去 接通了 GND → LOW

⚠️ 注意它是反過來的:按下去是 LOW,不是 HIGH。

這件事違反直覺,而它是 Arduino 最常見的一個困惑點。 記法:按鈕接的是 GND,所以按下去就通到「低」的那一邊。

四、接起來

照著打上這一段,按著燈亮,放開燈滅:

1void loop() {2    if (digitalRead(2) == LOW) {3        digitalWrite(LED_BUILTIN, HIGH);4    } else {5        digitalWrite(LED_BUILTIN, LOW);6    }7}
2讀取腳位LOW=變數LED_BUILTINHIGH把腳位設成變數LED_BUILTINLOW把腳位設成如果則否則定義函式 回傳型別void(無回傳)loop1235

if / else 和 C++ 那邊學的完全一樣。

只是這次的條件不是變數,是現實世界。

完成的樣子

這一課的參考做法——程式碼每一行的號碼,就印在對應的那塊積木上。

1void setup() {2    pinMode(2, INPUT_PULLUP);3    pinMode(LED_BUILTIN, OUTPUT);4}5 6void loop() {7    if (digitalRead(2) == LOW) {8        digitalWrite(LED_BUILTIN, HIGH);9    } else {10        digitalWrite(LED_BUILTIN, LOW);11    }12}
2INPUT_PULLUP變數LED_BUILTINOUTPUT設定腳位為設定腳位為2讀取腳位LOW=變數LED_BUILTINHIGH把腳位設成變數LED_BUILTINLOW把腳位設成如果則否則定義函式 回傳型別void(無回傳)loop定義函式 回傳型別void(無回傳)setup12637810

換你了

改成「按一下切換」:按下去燈亮,再按一下燈滅。

⚠️ 這比想像的難。直接寫的話,按住一秒 = loop 跑了幾萬次 = 切換了幾萬次。你需要記住「上一次的狀態」,只在它從沒按變成按的 那一瞬間切換。

(做不出來沒關係,第 10 課會再處理「狀態」這件事。)

到編輯器做這一題:練習:按一下切換(⚠️ 比想像的難)

做一個

按按鈕的次數記起來,放開三秒之後,讓燈閃那麼多下。

🔴 這一題把「按一下切換」那個坑再踩一次:你需要偵測邊緣,不是偵測狀態。 ⚠️ 而「放開三秒」不能用 delay,那三秒裡你還要繼續看按鈕。

到編輯器做這一題:做一個:按幾下,閃幾下

這一課你做了什麼

如果卡住了

你看到 多半是因為
沒按也會亮 用了 INPUT 而不是 INPUT_PULLUP——那是浮接
反了:不按才亮 INPUT_PULLUP 下按下去是 LOW。條件要用 == LOW
完全沒反應 按鈕另一腳沒接到 GND
有時候會抖一下 那是彈跳——機械接點在接通瞬間會抖好幾次
在編輯器打開這一課 →