學習筆記 03|第一個 Arduino 專案

從內建 LED 呼吸燈到 PWM 控制,逐步迭代的學習記錄

在真正寫出第一個有趣的專案之前,我卻誤碰了一個 Arduino IDE 的「硬規定」——它要求每個專案(在 Arduino 世界裡叫做 sketch)必須放在一個與主程式檔同名的資料夾裡。雖然聽起來有點囉嗦,但這是 IDE 識別專案的方式,絕對不能偷懶把不同專案的檔案混在一起,否則 IDE 會把它們全部一起燒進板子裡。

對於大型或模組化的專案,推薦的結構是:主 .ino 檔只放最精簡的入口(#includesetup()loop()),實際的函式和類別分別寫在 .h(宣告)和 .cpp(實作)裡。這篇筆記的練習還用不到這個層次,但先建立這個概念對之後會很有幫助。


從內建 LED 開始:最基本的呼吸燈

第一個目標很單純:讓板子內建的 LED 像呼吸一樣緩慢亮起、再慢慢熄滅。

這裡用到的是 PWM(Pulse Width Modulation,脈衝寬度調變)——簡單說,就是透過快速切換開關來模擬「介於全亮和全暗之間」的亮度。analogWrite() 這個函式就是在控制這個數值,NodeMCU(ESP8266)上的 PWM 範圍預設是 0 到 1023。

第一版程式碼很直觀:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
const int LEDU = 2; // GPIO 02 = D4 = 板子上的內建 LED
// NodeMCU 內建 LED 是低電位觸發,也就是 0 是最亮,寫 1023 才是最暗。
void setup() {
  Serial.begin(115200);
  pinMode(LEDU, OUTPUT);
}

void loop() {
  for (int i = 1023; i > 0; i -= 5) { 
    analogWrite(LEDU, i); // 往 0 會越來越亮
    delay(30);
  }
  for (int i = 1023; i > 0; i -= 5) {
    analogWrite(LEDU, i);// 往 1023 則會越來越暗
    delay(30);
  }
}

但是跑起來之後,第一個感覺是:呼吸太慢了。問了 AI 後算一下原因:

  • 一次運行(0 → 1023,每次跳 5):約 205 步
  • 每步延遲 30ms
  • 總耗時 205 × 30ms ≈ 6.15 秒

後來也注意到另一個問題:方向寫錯了,全亮後不會變暗,反而又暗回去。經過修正後,實現平滑呼吸:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
const int LEDU = 2;

void setup() {
  Serial.begin(115200);
  pinMode(LEDU, OUTPUT);
}

void loop() {
  // 由暗到亮
  for (int i = 1023; i >= 0; i -= 5) {
    analogWrite(LEDU, i);
    delay(30);
  }
  // 由亮到暗
  for (int i = 0; i <= 1023; i += 5) {
    analogWrite(LEDU, i);
    delay(30);
  }
}

關鍵修正

寫入值越低,LED 越亮(因為 NodeMCU 是低電位觸發)。0 是最亮,1023 是最暗。

為了讓呼吸燈看起來更自然,可以調整每次增減的步長:步長越小,呼吸越平滑但週期越長。

comments powered by Disqus