第98-4課:用Arduino令LED燈漸變:亮度控制
LED 周圍都係 — 指示燈、顯示屏、裝飾燈光 — 但大部分初學者都係止步於簡單咁開同閂。呢個項目會行多一步:用 Arduino 內置嘅 PWM(脈衝寬度調變)功能,令 LED 平滑咁漸光漸暗。唔係硬梆梆咁閃,而係亮度慢慢升起同落下,模仿自然嘅調光、呼吸效果,同埋由一個純數位引腳做出類似類比嘅控制。呢個係最令人滿足嘅入門項目之一,因為你可以即刻見到結果,而且同樣嘅技術係真實產品入面支撐住摩打速度控制、音量同背光調光。
一旦你明白咗漸變,你就可以將佢應用喺各式各樣嘅實用製作上面:
- 喺裝置上面整一個「呼吸」狀態指示燈,溫柔咁脈動,而唔係刺眼咁閃
- 根據環境光或者一日嘅時間,自動調暗 LED 夜燈
- 控制 LCD 或者 OLED 顯示屏背光嘅亮度
- 整氣氛燈或者裝飾燈,喺唔同亮度之間平滑過渡
- 模擬一個慢速日出鬧鐘,逐漸變光咁自然喚醒你
- 為小型直流摩打或者風扇加入速度控制(同樣嘅 PWM 原理適用)
呢個教學係 Robojax Arduino 一步一步課程嘅一部分,專門涵蓋 10 個項目入面嘅第 4 個:用 Arduino 令 LED 燈漸變。完整程式可以喺文章下面下載。
硬件同組件
呢個項目嘅零件清單好簡單 — 如果你之前做過任何 Arduino 嘢,你大概已經有齊所有需要嘅嘢:
- 1× Arduino 板(Uno、Nano、Mega,或者任何兼容板)
- 1× LED(5mm 或者 3mm,任何顏色)
- 1× 電阻(200Ω 到 1000Ω — 300Ω 到 1kΩ 範圍都好好用)
- 麵包板同杜邦跳線
- 用嚟編程同供電嘅 USB 線
關於 LED 有一個重要提示:長腳係陽極(正極),短腳 — 或者塑膠外殼有平邊嗰邊 — 係陰極(負極)。掉轉咗嘅話,LED 就唔會著,所以通電之前要再檢查一次。
至於電阻值,影片喺 (影片 03:49 位置) 度計咗條數:一粒典型 LED 大約降 2V,需要大概 10mA 電流。用 5V 供電,剩低嘅 3V 就要降喺電阻上面,得出 R = V/I = 3V / 0.01A = 300Ω。實際上,300Ω 到 1000Ω 都冇問題 — 數值越高,LED 就越暗。對於漸變嚟講,呢個其實冇所謂,因為你點都係喺度改變亮度。
接線指南
接線簡單到不能再簡單。LED 嘅陽極透過電阻連接到 Arduino 上面一個支援 PWM 嘅引腳 — 喺呢個項目入面係引腳 3。陰極就連接到地。
點解特別係引腳 3?因為唔係所有 Arduino 引腳都支援 PWM。喺大部分 Arduino 板上面,支援 PWM 嘅引腳會用波浪號符號(~)標示 — Uno 上面通常係引腳 3、5、6、9、10 同 11。如果你用一個唔支援 PWM 嘅引腳,analogWrite() 就唔會產生可變輸出;LED 只會係開或者閂。
跟住以下步驟連接電路:
- 將 LED 插入麵包板,留意邊隻腳係陽極(長啲)同邊隻係陰極(短啲/平邊嗰邊)。
- 將 LED 嘅陽極透過電阻連接到 Arduino 引腳 3。
- 將 LED 嘅陰極連接到 Arduino 嘅 GND 引腳。
- 用 USB 將 Arduino 插落你部電腦。
程式碼解釋
呢個項目嘅 sketch 係基於經典嘅 Arduino「Fade」範例,加咗少少調整。與其逐行解釋,不如集中講吓你自己做實驗嗰陣想調整嘅部分。
用家可配置變數
喺程式碼頂部,有三個變數控制住成個行為:
int led = 3; // the PWM pin the LED is attached to
int brightness = 0; // how bright the LED is
int fadeAmount = 3; // how many points to fade the LED byled— 呢個定義咗 LED 連喺邊個引腳。預設係引腳 3,但你可以改做任何支援 PWM 嘅引腳(喺你塊板上面有 ~ 標記嗰啲)。如果你將 LED 搬去第二個引腳,就要更新呢個值嚟配合。brightness— 呢個係目前嘅亮度等級,由 0(熄咗)到 255(最光)。程式碼由 0 開始,但你可以由呢個範圍入面任何一個值開始。fadeAmount— 呢個係最有趣嘅一個。佢控制每個循環會行幾多個亮度「級」。好似 3 咁細嘅值會產生緩慢、漸進嘅淡出淡入。好似 20 咁大嘅值就會令 LED 好快咁淡入淡出。影片喺 (影片 22:37) 示範咗呢個 — 由 5 改到 20 會大幅加快個效果。
淡出淡入係點運作嘅
淡出淡入嘅核心係喺 loop() 入面兩行:
analogWrite(led, brightness);
brightness = brightness + fadeAmount;
每次行過個循環,目前嘅亮度值就會用 analogWrite() 寫入 LED,然後亮度就會加 fadeAmount。analogWrite() 函數用 PWM 嚟模擬類比電壓 — 佢會快速咁開關個引腳,而開同關嘅時間比例就決定咗感受到嘅亮度。
當亮度去到 0 或者 255,程式碼就會透過反轉 fadeAmount 嘅正負號嚟改變方向:
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
呢個就係令 LED 淡入、然後淡出、然後再淡入嘅原因 — 一個連續嘅呼吸循環。循環尾嘅 delay(30) 控制咗成個動畫嘅速度。延遲越短,淡出淡入越快;延遲越長,就越慢。
試吓唔同嘅值
有兩個變數可以令你最大程度咁控制視覺效果:
- 增加
fadeAmount就會有更快、更戲劇性嘅淡出淡入。試吓 10 或者 20。 - 減少
fadeAmount就會有緩慢、柔和嘅呼吸效果。試吓 1 或者 2。 - 調整
delay()嘅值 嚟改變節奏。延遲越短,成個循環越快;延遲越長,就拉得越長。
將細嘅 fadeAmount 同短嘅延遲結合,會產生極之順滑、幾乎好似有機咁嘅淡出淡入 — 非常適合環境照明。大嘅 fadeAmount 同短嘅延遲就會產生快速脈衝效果。
即時專案示範
程式碼上傳之後,你就會見到 LED 由熄咗慢慢變光到最光,然後再變暗,不斷重複。影片喺 (影片 22:25) 展示咗預設行為 — 一個順滑、中等速度嘅淡出淡入。
當 fadeAmount 改到 20,LED 就會好快咁淡入淡出 — 幾乎好似閃爍咁。當設定到 3,淡出淡入就會明顯耐啲,產生一個放鬆、漸進嘅過渡。影片喺 (影片 23:02) 清楚示範咗呢個。
呢個專案嘅美妙之處係你可以即時見到程式碼改動嘅效果 — 唔需要改接線,只需要編輯變數再重新上傳。呢個緊密嘅反饋循環令佢成為建立 PWM 同時間控制點互動嘅直覺嘅絕佳方法。
如果你想進一步用按鈕嚟觸發淡出淡入,而唔係俾佢不斷咁行,呢個喺另一個教學入面有講 — 睇吓下面嘅相關專案部分。
呢條影片嘅相關專案
- 第 98-1 課:點樣用 Arduino 開關 LED
- 第 98-2 課:點樣用按鈕同 Arduino 開關 LED
- 第 98-3 課:點樣用按鈕同 Arduino 開關一個切換式 LED
- 第 98-5 課:用 Arduino 喺撳掣時淡出淡入燈光
- 第 98-6 課:用 Arduino 玩蹺蹺板 LED 遊戲
- 第 98-7 課:用 Arduino 同 5 粒 LED 整走馬燈
- 第 98-8 課:用按鈕同 LED 同 Arduino 整走馬燈
- 第 98-9 課:用 Arduino 整 LED 電壓電平錶或者用電位器整走馬燈
- 第 98-10 課:Arduino 交通燈
章節
- [00:00] 10 個 Arduino LED 專案概覽
- [01:22] 課程同所需零件介紹
- [02:29] 認識 LED:符號、極性同類型
- [03:49] 用歐姆定律計算 LED 電阻值
- [05:53] 專案 1:開關 LED
- [12:43] 專案 2:用按鈕控制 LED
- [17:13] 專案 3:用按鈕切換 LED
- [20:12] 專案 4:LED 淡出淡入 — 程式碼講解
- [22:25] 淡出淡入示範同調整淡出淡入速度
- [23:20] 專案 5:用按鈕觸發 LED 淡出淡入
- [27:32] 專案 6:蹺蹺板 LED 效果
- [30:47] 專案 7:用 5 粒 LED 整走馬燈
- [36:41] 專案 8:用按鈕控制走馬燈
- [42:25] 專案 9:用電位器整 LED 電壓電平錶
- [49:25] 專案 10:Arduino 交通燈
This code has not been parsed yet. Please return to the admin panel to parse it.
你可能需要嘅嘢
-
亞馬遜SunFounder Arduino Learning Kit on AliExpresss.click.aliexpress.com
-
亞馬遜
-
亞馬遜
資源與參考資料
-
文件记录Documentation for SunFounder 3 in 1 IoT/Smart Car/Learning Kitdocs.sunfounder.com
文件📁
Arduino 函式庫 (zip)
-
SunFounder 3合1智能車學習套件原始碼
3in1-kit-main-v2.zip12.80 MB
用户手册
-
SunFounder 3合1 Arduino 智能車組裝手冊呢份文件逐步展示 SunFounder 3合1 Arduino 智能車嘅組裝過程
SunFounder_car_assembly_manual.pdf1.20 MB