Semorphe

呼吸燈

燈不只有亮和暗,還有中間。 · ⏱ 約 25 分鐘

你會學到三件事

  1. analogWrite 可以送出 0 到 255 之間的亮度
  2. 迴圈掃過那 256 個值,就成了漸亮漸暗
  3. 為什麼它叫 PWM,而它其實還是在開開關關

開始之前

上一課只有兩種狀態:HIGHLOW

而現實裡你會想要「一半亮」。這一課做這件事。

⚠️ 不是每支腳都可以。 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。)

這一課你做了什麼

如果卡住了

你看到 多半是因為
只有全亮和全暗 那支腳不支援 PWM。換到有 ~ 記號的腳
完全不亮 pinMode(9, OUTPUT) 漏了
一閃一閃不順 delay 太大。改小一點
漸暗那段跑不動 for 的三樣東西沒有一起反過來
在編輯器打開這一課 →