這份筆記記錄的是我自己的學習歷程,不是教學文件——所以你不會在這裡看到完整的硬體規格說明或詳細的接線教學。因為我的背景偏軟體,對於線怎麼接、用了哪些器材筆記裡只會帶過,重心還是放在程式邏輯上。
從上一篇用內建 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,再到讓亮度完全由亂數決定——每一步都在降低「想改一個參數要動多少地方」的成本。