🎯 第一個Arduino挑戰

學會用按鈕控制RGB LED,體驗硬體與軟體的完美結合!

🔌 本功課所需杜邦線

接麵包板與 Arduino 請依下表準備杜邦線(直接對照右側「收納位置」欄到收納盒取線即可)。上方為數量表,下方為接線圖

顏色長度規格數量收納位置
10 cm公公3C1
15 cm公公2C1
15 cm公公1C1
15 cm公公1C1
功課一彩色按鈕燈:電路接線圖

圖:功課一(彩色按鈕燈/RGB)接線圖

🎪 挑戰任務

製作一個按鈕控制的RGB燈,每按一次按鈕,燈光會依序變換:

🔴 紅色 → 🔵 藍色 → 🟢 綠色 → ⚫ 熄滅 → 🔴 紅色...

🤖

與ChatGPT協作

你可以試著問ChatGPT這些問題來獲得幫助和完整程式碼:

我想用Arduino控制一個RGB LED燈,需要一個按鈕來切換顏色。 功能需求: 1. 按一次按鈕 → 紅色 2. 再按一次 → 藍色 3. 再按一次 → 綠色 4. 再按一次 → 熄滅 5. 循環重複 硬體接線: - 按鈕接在接腳2(使用內建上拉電阻) - 紅色LED接在接腳3 - 藍色LED接在接腳4 - 綠色LED接在接腳5 請幫我寫Arduino程式碼,並且加上詳細的註解說明每一行在做什麼。

💡 提問技巧

  • 具體描述你想要的功能行為
  • 告訴ChatGPT你的硬體接線方式
  • 要求程式碼加上詳細註解
  • 如果不懂某段程式碼,可以請ChatGPT用簡單的方式解釋

📝 程式碼詳細解說

讓我們一步步了解這個程式是怎麼運作的!

🎯 第一部分:告訴Arduino我們用了哪些接腳

就像在房間裡貼標籤,告訴我們每個開關和燈在哪裡

// 腳位定義(告訴Arduino:按鈕和燈接在哪裡) const int buttonPin = 2; // 按鈕接在2號接腳 const int redPin = 3; // 紅燈接在3號接腳 const int bluePin = 4; // 藍燈接在4號接腳 const int greenPin = 5; // 綠燈接在5號接腳

📊 第二部分:建立記憶盒子(變數)

程式需要記住:按鈕現在按下了嗎?上一次是什麼狀態?現在要亮什麼顏色?

int buttonState = HIGH; // 現在按鈕的狀態(HIGH=沒按,LOW=按下) int lastButtonState = HIGH; // 上一次按鈕的狀態 int ledMode = 0; // 現在要亮什麼顏色(0=全關,1=紅,2=藍,3=綠)

⚙️ 第三部分:開機設定(setup函數)

Arduino一開機只會執行一次,用來做初始設定

void setup() { // 告訴Arduino:2號腳位是「輸入」,用來讀取按鈕 pinMode(buttonPin, INPUT_PULLUP); // INPUT_PULLUP = 使用內建上拉電阻 // 告訴Arduino:3、4、5號腳位是「輸出」,用來控制LED pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); // 一開始先把所有燈都關掉 digitalWrite(redPin, LOW); // LOW = 關閉 digitalWrite(greenPin, LOW); digitalWrite(bluePin, LOW); // 打開序列監視器,可以在電腦上看到訊息 Serial.begin(9600); Serial.println("RGB Button Controller Ready!"); }

🔄 第四部分:主要工作迴圈(loop函數)

Arduino會一直重複執行這段程式,不停地檢查按鈕有沒有被按下

void loop() { // 讀取按鈕現在的狀態 buttonState = digitalRead(buttonPin); // 偵測按鈕「從沒按 → 變成按下」的那一瞬間 if (buttonState == LOW && lastButtonState == HIGH) { // 按鈕被按了!切換到下一個模式 ledMode++; // 模式加1 if (ledMode > 3) ledMode = 0; // 如果超過3,就回到0(循環) // 在電腦上顯示現在是哪個模式 Serial.print("Button pressed! LED mode = "); Serial.println(ledMode); // 根據模式決定要亮哪個燈 switch (ledMode) { case 1: // 模式1:紅燈亮 digitalWrite(redPin, HIGH); // HIGH = 打開 digitalWrite(greenPin, LOW); digitalWrite(bluePin, LOW); break; case 2: // 模式2:藍燈亮 digitalWrite(redPin, LOW); digitalWrite(greenPin, LOW); digitalWrite(bluePin, HIGH); break; case 3: // 模式3:綠燈亮 digitalWrite(redPin, LOW); digitalWrite(greenPin, HIGH); digitalWrite(bluePin, LOW); break; default: // 模式0:全部關掉 digitalWrite(redPin, LOW); digitalWrite(greenPin, LOW); digitalWrite(bluePin, LOW); break; } // 等待200毫秒,防止按鈕彈跳造成誤判 delay(200); } // 記住這次的按鈕狀態,下次用來比較 lastButtonState = buttonState; }

🧠 程式運作原理(用故事來理解)

想像你在玩一個遊戲:

  1. 🎮 遊戲規則:每按一次按鈕,燈會換一個顏色
  2. 📝 記分板:用 ledMode 記住現在是第幾種顏色(0、1、2、3)
  3. 👀 偵測動作:程式一直看著按鈕,發現「從沒按變成按下」時才動作
  4. 計數器:按一次就讓 ledMode 加1,超過3就回到0
  5. 💡 開關燈:根據 ledMode 的數字決定要亮哪個燈

為什麼要記住「上一次的狀態」?
就像看電影,我們要知道「上一幕」和「這一幕」的差異,才知道劇情有沒有變化。程式也是一樣,要比較「上次按鈕狀態」和「這次按鈕狀態」,才知道按鈕有沒有被按下!

📋 完整程式碼

點擊展開完整程式碼
// 腳位定義 const int buttonPin = 2; // 按鈕 const int redPin = 3; const int bluePin = 4; const int greenPin = 5; int buttonState = HIGH; // 現在的按鈕狀態 int lastButtonState = HIGH; // 上一次的按鈕狀態 int ledMode = 0; // 紀錄現在亮的顏色模式(0~3) void setup() { pinMode(buttonPin, INPUT_PULLUP); // 使用內建上拉電阻 pinMode(redPin, OUTPUT); pinMode(greenPin, OUTPUT); pinMode(bluePin, OUTPUT); // 全部先關燈 digitalWrite(redPin, LOW); digitalWrite(greenPin, LOW); digitalWrite(bluePin, LOW); Serial.begin(9600); Serial.println("RGB Button Controller Ready!"); } void loop() { buttonState = digitalRead(buttonPin); // 偵測從「未按下 → 按下」的瞬間 if (buttonState == LOW && lastButtonState == HIGH) { ledMode++; if (ledMode > 3) ledMode = 0; // 循環 Serial.print("Button pressed! LED mode = "); Serial.println(ledMode); // 根據模式亮燈 switch (ledMode) { case 1: // 紅 digitalWrite(redPin, HIGH); digitalWrite(greenPin, LOW); digitalWrite(bluePin, LOW); break; case 2: // 藍 digitalWrite(redPin, LOW); digitalWrite(greenPin, LOW); digitalWrite(bluePin, HIGH); break; case 3: // 綠 digitalWrite(redPin, LOW); digitalWrite(greenPin, HIGH); digitalWrite(bluePin, LOW); break; default: // 全關 digitalWrite(redPin, LOW); digitalWrite(greenPin, LOW); digitalWrite(bluePin, LOW); break; } delay(200); // 防止按鈕彈跳(debounce) } lastButtonState = buttonState; }

🎉 完成挑戰後

恭喜你完成第一個Arduino專案!現在你學會了: