搜尋程式碼

第98-4課:用Arduino令LED燈漸變:亮度控制

第98-4課:用Arduino令LED燈漸變:亮度控制

LED 周圍都係 — 指示燈、顯示屏、裝飾燈光 — 但大部分初學者都係止步於簡單咁開同閂。呢個項目會行多一步:用 Arduino 內置嘅 PWM(脈衝寬度調變)功能,令 LED 平滑咁漸光漸暗。唔係硬梆梆咁閃,而係亮度慢慢升起同落下,模仿自然嘅調光、呼吸效果,同埋由一個純數位引腳做出類似類比嘅控制。呢個係最令人滿足嘅入門項目之一,因為你可以即刻見到結果,而且同樣嘅技術係真實產品入面支撐住摩打速度控制、音量同背光調光。

LED-5mm-green

一旦你明白咗漸變,你就可以將佢應用喺各式各樣嘅實用製作上面:

  • 喺裝置上面整一個「呼吸」狀態指示燈,溫柔咁脈動,而唔係刺眼咁閃
  • 根據環境光或者一日嘅時間,自動調暗 LED 夜燈
  • 控制 LCD 或者 OLED 顯示屏背光嘅亮度
  • 整氣氛燈或者裝飾燈,喺唔同亮度之間平滑過渡
  • 模擬一個慢速日出鬧鐘,逐漸變光咁自然喚醒你
  • 為小型直流摩打或者風扇加入速度控制(同樣嘅 PWM 原理適用)

呢個教學係 Robojax Arduino 一步一步課程嘅一部分,專門涵蓋 10 個項目入面嘅第 4 個:用 Arduino 令 LED 燈漸變。完整程式可以喺文章下面下載。

硬件同組件

330_ohm_resistor
330 ohm 0.25 watt 電阻

呢個項目嘅零件清單好簡單 — 如果你之前做過任何 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 就越暗。對於漸變嚟講,呢個其實冇所謂,因為你點都係喺度改變亮度。

接線指南

Arduino schematic for two LEDs see saw
兩個 LED 翹翹板嘅 Arduino 電路圖
Arduino wiring for two LEDs see saw
兩個 LED 翹翹板嘅 Arduino 接線

接線簡單到不能再簡單。LED 嘅陽極透過電阻連接到 Arduino 上面一個支援 PWM 嘅引腳 — 喺呢個項目入面係引腳 3。陰極就連接到地。

點解特別係引腳 3?因為唔係所有 Arduino 引腳都支援 PWM。喺大部分 Arduino 板上面,支援 PWM 嘅引腳會用波浪號符號(~)標示 — Uno 上面通常係引腳 3、5、6、9、10 同 11。如果你用一個唔支援 PWM 嘅引腳,analogWrite() 就唔會產生可變輸出;LED 只會係開或者閂。

跟住以下步驟連接電路:

  1. 將 LED 插入麵包板,留意邊隻腳係陽極(長啲)同邊隻係陰極(短啲/平邊嗰邊)。
  2. 將 LED 嘅陽極透過電阻連接到 Arduino 引腳 3。
  3. 將 LED 嘅陰極連接到 Arduino 嘅 GND 引腳。
  4. 用 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 by
  • led — 呢個定義咗 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,然後亮度就會加 fadeAmountanalogWrite() 函數用 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 同時間控制點互動嘅直覺嘅絕佳方法。

如果你想進一步用按鈕嚟觸發淡出淡入,而唔係俾佢不斷咁行,呢個喺另一個教學入面有講 — 睇吓下面嘅相關專案部分。

呢條影片嘅相關專案

章節

  • [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 交通燈

圖片

Arduino wiring for LED  with resistor
Arduino wiring for LED with resistor
Arduino schematic for LED
Arduino schematic for LED
Arduino wiring for two LEDs see saw
Arduino wiring for two LEDs see saw
Arduino schematic for two LEDs see saw
Arduino schematic for two LEDs see saw
LED-5mm-green
LED-5mm-green
330_ohm_resistor
330_ohm_resistor
936-Lessson 98-LED-4: Arduino code to fade the LED light
語言: C++
This code has not been parsed yet. Please return to the admin panel to parse it.

文件📁

Arduino 函式庫 (zip)

用户手册