一、 實驗說明:什麼是數位訊號輸入(Digital Input)?
在上一篇我們學會了用 GPIO 控制外部 LED 的「輸出」,這一篇我們要讓 ESP32 具備感應外界訊號的能力!
數位輸入(Digital Input)是指讓 ESP32 去偵測某個腳位目前的電壓狀態:
偵測到 3.3V 高電位:程式會讀取到
HIGH(1)。偵測到 0V 低電位:程式會讀取到
LOW(0)。
本實驗我們將使用最常見的「按鈕開關」作為輸入訊號源。當我們按下按鈕時,改變輸入腳位的電位狀態,進而控制 LED 燈的明暗。這是所有感測器開關、防盜偵測與硬體互動的底層核心邏輯!
二、 實驗材料準備清單
本篇實作專案所需的硬體元件如下:
ESP32 開發板
麵包板 (Breadboard)
按鈕開關 (Push Button)
直插LED
220Ω 或 330Ω 電阻
10kΩ 電阻
杜邦跳線
USB傳輸線
🛒 還沒有材料嗎? 歡迎直接購買米羅為您搭配好的 ESP32 物聯網應用學習套件,新手零基礎也能輕鬆上手!
三、 核心知識:為什麼需要上拉或下拉電阻?
初學者在做按鈕實驗時,常會遇到「沒按按鈕,LED 卻自己亂閃」的靈異現象。這是因為當按鈕沒有按下時,該 GPIO 腳位處於懸空狀態(Floating),容易受到環境中的電磁雜訊干擾,導致電位在 0 與 1 之間隨機跳動。
為了解決這個問題,我們必須使用電阻將腳位「強行固定」在已知狀態:
下拉電阻(Pull-down):將腳位透過電阻接地(GND),平時維持
LOW。按鈕按下時導通 3.3V,電位變成HIGH。上拉電阻(Pull-up):將腳位透過電阻接 VCC(3.3V),平時維持
HIGH。按鈕按下時接地,電位變成LOW。
按鍵開關大家都應該比較了解,只有開與關兩種簡單的狀態,屬於數位訊號輸入元件,按下時為閉合(導通)狀態。
四、 實作實驗程式碼與測試
線路確認無誤後,請將以下程式碼複製到 Arduino IDE 中並上傳:
1. 範例程式碼
int ledpin=16;
int inpin=15;
int val;
void setup()
{
pinMode(ledpin,OUTPUT);
pinMode(inpin,INPUT);
}
void loop()
{
val=digitalRead(inpin);
if(val==LOW)
{
digitalWrite(ledpin,LOW);
}
else
{
digitalWrite(ledpin,HIGH);
}
}
程式說明:
- 第 1 列定義數位接口GPIO16 Pin 。
- 第 2 列定義數位接口GPIO15 Pin 。
- 第 3 列定義變數val。
- 第 6 列定義LED Pin為輸出Pin。
- 第 7 列定義按鍵 Pin為輸入Pin。
- 第 11 列讀取數位接口GPIO15 Pin電位值賦給val。
- 第 12~19 列檢測按鍵是否按下,按鍵按下時LED亮起。
2. 燒錄與操作測試
點擊 Arduino IDE 的 [上傳 (Upload)] 按鈕。
上傳完畢後,用手指按下麵包板上的按鈕,外接的 LED 燈便會立刻同步點亮;放開按鈕,LED 燈隨即熄滅!
五、 初學者常見卡關問題與排錯指南(Troubleshooting)
Q:按下按鈕,LED 卻完全沒有反應?
按鈕腳位接錯:四腳輕觸按鈕內部是兩兩導通的,請確認您杜邦線接的是「按下才會導通」的那一組對角腳位,若接錯了可能會變成恆亮或恆滅。
Q:什麼是按鍵彈跳(Debounce)?
在實際應用中,機械按鈕在按下的瞬間,金屬片會產生微小的物理彈跳,導致晶片在百萬分之一秒內誤以為按鈕被「快速狂按了數次」。如果您的專案需要按一下切換一次狀態,使用
delay()或計時器來進行「軟體除彈跳(Debounce)」,讓按鈕偵測更精準!
六、 結語與下一篇教學
恭喜你!到這一篇為止,你已經完整掌握了 ESP32 GPIO 最核心的「數位輸出」與「數位輸入」技術。有了這兩大基石,你就能自由發揮創意控制各種開關了!下一篇教學,我們將進入更精采的單元,學習如何讀取連續變化的環境數值——「類比輸入(Analog Input)」!
👉 上一篇回顧:【ESP32教學】第四篇:GPIO數位輸出與LED燈程式控制實作
👉 下一篇預告:【ESP32教學】第六篇:蜂鳴器控制與音調頻率播放實作

