Basic Tutorial for Arduino, 入門篇

【Arduino入門教學課程】第九篇:經典 3 人搶答器設計與 GPIO 多路控制實作

people holding assorted-color LED lights

在電視綜藝節目或知識競賽中,我們經常看到選手面前各有一個搶答按鈕——誰先按下,對應的指示燈就會亮起。這種互動機制不僅趣味十足,更是學習單晶片(Microcontroller)控制非常經典的入門專案。

本章節將帶您將上一篇的「單一按鍵控制 LED」概念延伸,升級為 3 組按鍵控制 3 組 LED 的搶答器專案,共計使用 Arduino 的 6 個數位 I/O Pin(腳位)。

🛠️ 實驗所需材料清單

進行本實驗前,請先準備以下電子零件與開發板:

  • Arduino Uno R3
  • USB 傳輸線
  • 直插LED
  • 按鍵開關
  • 220Ω直插電阻
  • 10kΩ直插電阻
  • 麵包板
  • 麵包板跳線

 

🛒 熱門推薦:想一次購足所有實驗零件嗎?歡迎選購 米羅科技-Arduino 程式學習入門套件組

👍爆款推薦:程式學習套件組 

購買網址:shop.mirotek.com.tw

 

 

🔌 電路接線說明與腳位對照表

本實驗需要同時處理 3 個輸入訊號(按鍵)與 3 個輸出訊號(LED)。為了讓電路清晰易讀,建議依照顏色的對應進行接線:

1. 按鍵與 LED 腳位分配表

  • 按鍵(數位輸入 Pin)

    • 紅色按鍵 (Red Key) ➡️ Pin 10

    • 黃色按鍵 (Yellow Key) ➡️ Pin 9

    • 綠色按鍵 (Green Key) ➡️ Pin 8

  • LED 燈(數位輸出 Pin)

    • 紅色 LED (Red LED) ➡️ Pin 7

    • 黃色 LED (Yellow LED) ➡️ Pin 6

    • 綠色 LED (Green LED) ➡️ Pin 5

2. 接線細節注意事項

  • LED 接法:LED 長腳(正極 Anode)連接至對應的 Arduino Pin(5, 6, 7),短腳(負極 Cathode)經由 220Ω 限流電阻連接至 Arduino 的 GND

  • 按鍵接法:按鍵一端接 Arduino 5V,另一端接 Arduino 對應輸入 Pin(8, 9, 10),同時該端需接一支 10kΩ 下拉電阻連至 GND,以確保按鍵未按下時維持穩定的低電位(LOW)。

3. 接線說明

 

 

💻 Arduino 完整程式碼範例

將以下範例程式碼複製並貼上至 Arduino IDE 中,然後燒錄至您的 Arduino Uno 開發板:

/*
 * 專案名稱:Arduino 3 人搶答器專案
 * 發佈單位:米羅科技文創學院
 * 功能說明:讀取 3 組按鍵狀態,並即時控制對應顏色的 LED 燈亮滅
 */

// 1. 定義按鍵與 LED 腳位
const int redkey = 10;
const int yellowkey = 9;
const int greenkey = 8;

const int redled = 7;
const int yellowled = 6;
const int greenled = 5;

// 2. 宣告儲存按鍵狀態的變數
int redkey_val = 0;
int yellowkey_val = 0;
int greenkey_val = 0;

void setup() {
  // 設定 LED 腳位為輸出模式 (OUTPUT)
  pinMode(redled, OUTPUT);
  pinMode(yellowled, OUTPUT);
  pinMode(greenled, OUTPUT);

  // 設定按鍵腳位為輸入模式 (INPUT)
  pinMode(redkey, INPUT);
  pinMode(yellowkey, INPUT);
  pinMode(greenkey, INPUT);
}

void loop() {
  // --- 紅色選手通道 ---
  redkey_val = digitalRead(redkey);      // 讀取 Pin 10 的電位
  if (redkey_val == HIGH) {              // 當按鍵按下時 (高電位)
    digitalWrite(redled, HIGH);          // 點亮紅色 LED
  } else {
    digitalWrite(redled, LOW);           // 放開時熄滅
  }

  // --- 黃色選手通道 ---
  yellowkey_val = digitalRead(yellowkey);  // 讀取 Pin 9 的電位
  if (yellowkey_val == HIGH) {
    digitalWrite(yellowled, HIGH);        // 點亮黃色 LED
  } else {
    digitalWrite(yellowled, LOW);         // 放開時熄滅
  }

  // --- 綠色選手通道 ---
  greenkey_val = digitalRead(greenkey);   // 讀取 Pin 8 的電位
  if (greenkey_val == HIGH) {
    digitalWrite(greenled, HIGH);         // 點亮綠色 LED
  } else {
    digitalWrite(greenled, LOW);          // 放開時熄滅
  }
}
 💡 程式 logic 優化說明:在下拉電阻(Pull-down)接法下,按鍵按下時輸入端會讀取到 HIGH(高電位),此時亮燈;放開時為 LOW(低電位),此時滅燈。

 

 

🔍 程式碼逐行重點解析

  1. 腳位與變數宣告 (const int)

    • 使用 redkeyyellowkey 等具意義的名稱代替直接寫死數字,提高程式碼的可讀性與日後維護彈性。

  2. 初始化設定 (setup())

    • 使用 pinMode(pin, OUTPUT) 將 Pin 5、6、7 宣告為數位輸出(驅動 LED)。

    • 使用 pinMode(pin, INPUT) 將 Pin 8、9、10 宣告為數位輸入(讀取按鍵狀態)。

  3. 主程式迴圈 (loop())

    • digitalRead(pin):持續輪詢(Polling)各按鍵腳位狀態。

    • if / else 邏輯判斷:當檢測到按鈕觸發時,透過 digitalWrite(pin, HIGH) 讓對應的 LED 燈亮起。

 

 

🚀 學習延伸與挑戰:如何做成「真正」的搶答器?

目前我們完成的簡易搶答器是「按著才亮燈、放開就熄滅」,且「多人同時按會同時亮」。若想升級為正式比賽用的搶答器,您可以嘗試以下進階邏輯:

  1. 第一按鎖定機制(First-press Lockout)

    • 加入一個標記變數(Flag),當第一位選手按下後,立即鎖定程式,此時其他選手再按按鈕將無效。

  2. 結合聲音提示(無源/有源蜂鳴器)

    • 結合上一篇或下一篇的 [Arduino 蜂鳴器教學],當有選手搶答成功時,發出「嗶——」聲音提示主持人。

  3. 主持人復位按鈕(Reset Button)

    • 增加第 4 個按鈕作為主持人的重置鍵,按下後才清除燈號與鎖定狀態,進入下一題搶答。

 

 

❓ 常見問題 FAQ

Q1:為什麼我的按鍵沒按,LED 燈卻會亂閃爍?

A:這通常是因為沒有接「下拉電阻 (Pull-down Resistor)」導致腳位處於「浮空(Floating)」狀態。如果不想接外接電阻,可以改用 Arduino 內建的 INPUT_PULLUP 模式(此時按鍵另一端改接 GND,邏輯反轉為 LOW 時按下)。

Q2:LED 燈如果不接 220Ω 電阻會怎樣?

A:直接將 LED 連接至 5V 腳位可能會導致過高電流通過,造成 LED 燒毀或損壞 Arduino 板子的 GPIO 腳位。

 

 

📚 相關教學與延伸閱讀

相關文章