呼吸燈
燈不只有亮和暗,還有中間。 · ⏱ 約 25 分鐘
你會學到三件事
analogWrite 可以送出 0 到 255 之間的亮度
- 用迴圈掃過那 256 個值,就成了漸亮漸暗
- 為什麼它叫 PWM,而它其實還是在開開關關
開始之前
上一課只有兩種狀態:HIGH 和 LOW。
而現實裡你會想要「一半亮」。這一課做這件事。
⚠️ 不是每支腳都可以。 Arduino Uno 上只有 3, 5, 6, 9, 10, 11 這幾支
(板子上印著 ~ 的那些)。這一課用 9 號腳。
一、0 到 255
analogWrite(9, 128); // 大約一半亮
| 值 |
效果 |
0 |
全暗(等於 digitalWrite(9, LOW)) |
255 |
全亮(等於 digitalWrite(9, HIGH)) |
128 |
大約一半 |
為什麼是 255 不是 100? 因為它是用 8 個位元表示的——
2⁸ = 256 種值,從 0 數到 255。
⚠️ analogWrite 的腳位還是要 pinMode(..., OUTPUT)。
二、它其實還是在開開關關
板子送不出「一半的電壓」。它做的是極快地開開關關:
全亮 ████████████████
一半 ██ ██ ██ ██
四分之一 █ █ █ █
一秒鐘幾百次,眼睛平均起來就變成「比較暗」。
這叫 PWM(脈寬調變)——寬度在變,不是電壓在變。
所以它對 LED 有效(眼睛會平均),對馬達也有效(馬達有慣性),
而對需要真的類比電壓的東西無效。
三、掃過去
for (int v = 0; v <= 255; v++) {
analogWrite(9, v);
delay(5);
}
從 0 一路加到 255,每一步停 5 毫秒——共 256 × 5 ≈ 1.3 秒漸亮。
再倒過來一次就是漸暗:
for (int v = 255; v >= 0; v--) {
⚠️ 注意這個 for 的三樣東西全都反過來了:起點 255、條件 >= 0、
前進是 v--。三樣要一起反,反漏一樣就會變成無窮迴圈或一次都不跑。
完成的樣子
void setup() {
pinMode(9, OUTPUT);
}
void loop() {
for (int v = 0; v <= 255; v++) {
analogWrite(9, v);
delay(5);
}
for (int v = 255; v >= 0; v--) {
analogWrite(9, v);
delay(5);
}
}
換你了
把 delay(5) 改成 delay(1) 和 delay(20),感覺一下差別。
再試試:只留漸亮那一段,把漸暗刪掉。會看到什麼?
(會「漸亮 → 啪一下暗掉 → 漸亮」,因為 loop 跳回開頭時 v 回到 0。)
這一課你做了什麼
- 你用
analogWrite 送出了 0 到 255 之間的亮度
- 你用兩個方向相反的
for 做出了呼吸效果
- 你知道 PWM 是在快速開關,不是真的送出一半電壓
如果卡住了
| 你看到 |
多半是因為 |
| 只有全亮和全暗 |
那支腳不支援 PWM。換到有 ~ 記號的腳 |
| 完全不亮 |
pinMode(9, OUTPUT) 漏了 |
| 一閃一閃不順 |
delay 太大。改小一點 |
| 漸暗那段跑不動 |
for 的三樣東西沒有一起反過來 |
在編輯器打開這一課 →