學習筆記04|LED 控制練習

從單向流動燈到隨機星星閃爍,四個遞進的 ESP8266 LED 控制練習

這份筆記記錄的是我自己的學習歷程,不是教學文件——所以你不會在這裡看到完整的硬體規格說明或詳細的接線教學。因為我的背景偏軟體,對於線怎麼接、用了哪些器材筆記裡只會帶過,重心還是放在程式邏輯上。

從上一篇用內建 LED 練習呼吸燈開始,這次進一步用麵包板接出 4 顆外接 LED,透過三個遞進的練習,把 LED 控制從最基本的「亮滅」玩到「隨機閃爍」,逐步熟悉用程式操作 ESP8266 的感覺。

硬體部分簡單帶一下:每顆 LED 串聯一顆 220Ω 限流電阻(色碼:紅紅棕金),陽極(長腳)接 GPIO、陰極(短腳)經電阻接 GND。腳位用 D1、D2、D5、D6,建議避開 D0——它在開機時有特殊行為,容易造成不預期的現象。


Ex02:單向流動燈

讓 4 顆 LED 依序亮起再熄滅,形成單向流動的視覺效果,每顆間隔 500ms。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
const int leds[] = {5, 4, 12, 14};  // D1, D2, D5, D6

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(leds[i], OUTPUT);
    digitalWrite(leds[i], LOW);
  }
}

void loop() {
  for (int i = 0; i < 4; i++) {
    digitalWrite(leds[i], HIGH);
    delay(500);
    digitalWrite(leds[i], LOW);
  }
}

邏輯很直接:用 for 迴圈依序點亮每顆 LED、等 500ms、再熄滅,進入下一顆。







Ex03:來回跑馬燈

在單向的基礎上,讓燈光來回跑——從左到右、再從右回左。這個練習還有一個進階要求:把延遲時間存成變數,想改速度只需要動一個地方,不用在程式裡到處搜尋 delay()

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
const int ledPins[] = {5, 4, 12, 14};  // D1, D2, D5, D6
const int numLeds = 4;
int delayTime = 100;

void setup() {
  for (int i = 0; i < numLeds; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
}

void loop() {
  // 往右跑(1 → 4)
  for (int i = 0; i < numLeds; i++) {
    digitalWrite(ledPins[i], HIGH);
    delay(delayTime);
    digitalWrite(ledPins[i], LOW);
  }

  // 往左跑(3 → 2,跳過頭尾避免重複亮)
  for (int i = numLeds - 2; i > 0; i--) {
    digitalWrite(ledPins[i], HIGH);
    delay(delayTime);
    digitalWrite(ledPins[i], LOW);
  }
}

往回跑的迴圈從 numLeds - 2(index 2,第三顆)跑到 i > 0(index 1,第二顆)就停,頭尾兩顆刻意跳過。原因是它們已經分別在「往右」的末尾和「往左」的起頭各亮過一次——不跳過的話這兩顆會連亮兩次,視覺上會頓一下。













Ex04:星星閃爍效果

這個練習加入 random() 亂數函數,讓每顆 LED 每次拿到不同的 PWM 亮度值,模擬夜空星星隨機閃爍的效果。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
const int ledPins[] = {5, 4, 12, 14};  // D1, D2, D5, D6
const int numLeds = 4;

void setup() {
  analogWriteRange(1023);  // 明確設定 PWM 範圍為 0~1023
  for (int i = 0; i < numLeds; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
}

void loop() {
  for (int i = 0; i < numLeds; i++) {
    int randomBrightness = random(0, 1024);  // 產生 0~1023 的隨機亮度
    analogWrite(ledPins[i], randomBrightness);
  }
  delay(100);  // 更新頻率,數字越小閃爍越快
}

delay(100) 控制亮度更新的頻率,可以改成 50 或 200 感受一下視覺差異。


這三個練習的核心是同一件事:用迴圈和變數讓程式碼更容易修改和擴充。從寫死的數值,到抽出 delayTime,再到讓亮度完全由亂數決定——每一步都在降低「想改一個參數要動多少地方」的成本。

comments powered by Disqus