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