搜尋程式碼

第98-5課:用Arduino撳掣嗰陣整暗啲燈光

第98-5課:用Arduino撳掣嗰陣整暗啲燈光

喺呢一課入面,你會整一個可以按指令淡出嘅燈:撳一下按鈕,LED就會由最光開始,然後平滑咁變暗到熄。呢個係Arduino其中一個最有用嘅初學者範式,因為佢結合咗數位輸入(按鈕)同PWM類比輸出(LED光暗),而且會教你點樣控制變化嘅速率平滑度,而唔係淨係開同閂。

LED with resistor on breadboard connected to Arduino with a push button
麵包板上嘅LED連電阻,駁住Arduino同一個按鈕

按需要淡出喺真實產品入面周圍都見到。以下係幾個你可以點樣運用喺呢度學到嘅嘢嘅實際方法:

  • 柔和熄滅指示燈 — 唔係盞燈啪一聲熄咗,而係撳一下按鈕就慢慢變暗,喺電器同3D打印外殼上面睇落高級好多。
  • 睡眠/待機模式 — 撳一下按鈕,一個光亮嘅狀態LED就會淡出到黑,咁夜晚就唔會騷擾你,而電路仍然通電。
  • 「淡出到黑」舞台或模型燈光 — 一個按鈕就可以令LED燈帶或者燈板平滑變暗,而唔係突然熄滅。
  • 慳電反饋 — 撳一下瞬時按鈕會畀你一個光亮嘅確認閃光,然後淡走,所以LED只會喺短時間內全亮。
  • 互動藝術同道具 — 一個由觸摸觸發嘅「呼氣」效果,非常適合cosplay、情景模型或者博物館展品。

核心概念好簡單:按鈕話畀Arduino知「而家開始淡出」,然後Arduino就會將LED光暗由255(全光)一步一步咁降到0(熄)。因為啲步驟好細而且發生得好快,你隻眼會見到平滑嘅淡出,而唔係跳變。

如果你以前從未試過令LED淡出,底層嘅亮度控制喺第98-4課:用Arduino令LED燈淡出:亮度控制入面有講。呢一課直接建基喺嗰個基礎上面,加一個按鈕做觸發。

硬件同組件

330_ohm_resistor
330歐姆電阻

呢個係一個成本好低嘅製作 — 呢度所有嘢都係標準入門套件材料:

  • Arduino板(Uno、Nano、Mega,或者任何兼容板)
  • 一個LED(5 mm或者3 mm,任何顏色)
  • 一個按鈕開關(瞬時、4腳輕觸式都幾好)
  • 一個俾LED用嘅電阻 — 由200 Ω到1000 Ω都得(經典嘅220 Ω或者330 Ω就最啱)
  • 麵包板同杜邦跳線
  • 用嚟編程嘅USB線(如果你想佢唔使插線咁行,就要電池或者5 V適配器)

關於LED電阻嘅快速提示:一個LED需要大約2 V跨過佢,同大約10 mA電流。用5 V供電,電阻就要降壓剩低嘅3 V,所以歐姆定律得出大約300 Ω。由300 Ω到1000 Ω都冇問題 — 數值越高,LED就越暗。用電阻唔係可選嘅;冇佢,LED就會扯太多電流然後燒咗。

接線指南

Arduino schematic for LED with a push button switch
LED連按鈕開關嘅Arduino電路圖
Arduino wiring for LED with a push button switch
LED連按鈕開關嘅Arduino接線

接線係刻意做到最精簡。LED嘅陽極(長腳)經電阻駁去數位腳3,而佢嘅陰極(短腳,外殼有平邊嗰邊)就去地。按鈕就駁喺數位腳2同地之間 — 唔需要外部上拉電阻,因為程式碼會啟用Arduino嘅內部上拉。

留意LED嘅極性:膠殼嘅平邊同短腳係陰極(負極)。如果你掉轉插,LED就唔會著 — 唔會整壞,反轉佢就得。

至於按鈕,如果你用4腳輕觸開關,記住啲腳係內部成對嘅:四隻腳入面有兩隻係永遠連埋一齊。用萬用錶嘅通斷模式搵一對撳落去會響嘅,然後每邊用一隻腳。一邊駁去腳2,另一邊去地。

程式碼解釋

呢個程式好短,而幾乎所有你可能想改嘅嘢都喺頂部嗰幾行。以下係用戶可以配置嘅部分:

const int pushButtonPin = 2;//按鈕開關連接嘅引腳
const int LEDPin = 3;//LED連接嘅引腳
const int fadeAmount = 10;    // LED每次漸暗幾多點
const int fadeSpeed = 5;//漸暗時間,以毫秒為單位。數值越細,漸暗越快

pushButtonPinLEDPin 只係話畀 Arduino 知你將啲嘢駁咗去邊個引腳。如果你將按鈕搬去引腳 4,或者將 LED 搬去引腳 9(一個支援 PWM 嘅引腳),只需要改呢兩個數字去配合你嘅接線就得。要注意 LED 引腳必須支援 PWM — 喺 Uno 上面即係引腳 3、5、6、9、10 或 11 — 因為漸暗需要用到 analogWrite()

fadeAmount 控制每一步嘅亮度變化有幾大。亮度範圍係 0 到 255,所以 fadeAmount 設做 10 即係 LED 大概分 25 步漸暗。數值越大,漸暗越粗糙同越快;數值越細,漸暗越順滑同越慢。

fadeSpeed 係每一步之間嘅延遲,以毫秒為單位。呢個係影響效果感覺最關鍵嘅一個設定。數值設做 5 ms 會有好快、好爽脆嘅漸暗;設做 30 ms 或以上就會有好慢、好奢華嘅漸暗。配合 fadeAmount 一齊用,呢兩個數值可以讓你將漸暗調校到啱你想要嘅性格。

另外仲有一個內部變數值得認識:

int brightness = 255;    // LED有幾光
int pushButtonStatus = 0; // 嚟自引腳2嘅按鈕數值

brightness 一開始係 255,即係每次你撳掣嗰陣,LED 都會由最光開始。如果你想漸暗由暗啲嘅位開始 — 例如半光 — 就將呢個改成 128。

邏輯本身係咁運作嘅:loop 會讀取按鈕。如果撳咗(LOW,因為用咗內部上拉電阻),一個 while 迴圈就會喺 brightness 大過零嘅時候一直行。喺嗰個迴圈入面,Arduino 會將目前嘅 brightness 寫入 LED,減去 fadeAmount,等 fadeSpeed 毫秒,然後重複。當按鈕冇撳嗰陣,LED 就只會寫入 0 並保持熄滅。

一個重要細節:內部上拉電阻代表引腳喺按鈕撳嗰陣讀到 HIGH,喺撳咗嗰陣讀到 LOW。呢個就係點解程式碼會檢查 LOW 嚟偵測撳掣。如果你第時轉用外部下拉電阻,就要將嗰個比較改成 HIGH

即時項目同示範

一上載之後,效果即刻見到而且好有滿足感。撳一下按鈕,LED 就會跳到最光,然後喺你控制嘅時間內明顯咁漸暗到冇。放開按鈕,LED 就會熄滅;再撳一次,漸暗就會由最光重新開始。

喺影片入面,漸暗會用幾個設定示範,等你可以聽到同睇到箇中差別。用 fadeAmount = 20 嗰陣,漸暗好快同好粗糙 — 幾步就見到佢到零。降到 fadeAmount = 10 就順滑好多,而再去到 fadeAmount = 3 就會令漸暗明顯耐好多,睇落幾乎係連續嘅。fadeSpeed 嘅數值都有同樣戲劇性嘅影響:設做 1 ms 會令漸暗幾乎即刻完成,而較大嘅數值就會將佢拉長。

試下呢個實驗:設定 fadeAmount = 5fadeSpeed = 30。你會得到一個緩慢、柔和嘅漸暗,睇落好似盞燈瞓覺咁。然後設定 fadeAmount = 50fadeSpeed = 1,就會得到一個硬淨、快速嘅切斷。兩個都冇話「錯」— 完全取決於你想要嘅氣氛。

同一個按鈕嘅切換行為會喺 第 98-3 課:如何用 Arduino 同按鈕開關一個切換式 LED 度另外講解,而更簡單嘅撳住著燈版本就喺 第 98-2 課:如何用 Arduino 同按鈕開關一個 LED

因為漸暗係由一個瞬時接點觸發,呢個同樣嘅電路好適合用嚟驅動繼電器或者 MOSFET 而唔係 LED — 你可以用嚟漸暗一盞 12 V 燈、摩打嘅軟啟動,或者發熱元件嘅預熱。按鈕只係觸發器;你想漸暗咩就由你話事。

呢條影片嘅相關項目

章節

  • [00:00] 十個 LED 項目概覽
  • [01:00] Arduino 逐步教學課程簡介
  • [02:29] LED 基礎:符號、極性同電流
  • [03:49] 用歐姆定律計算 LED 電阻
  • [05:53] 項目一:開關 LED
  • [12:43] 項目二:用按鈕控制 LED
  • [17:13] 項目三:用按鈕切換 LED
  • [20:12] 項目四:LED 漸暗漸亮
  • [23:20] 項目五:用按鈕控制 LED 漸暗漸亮
  • [27:32] 項目六:蹺蹺板 LED
  • [30:47] 項目七:走馬燈
  • [36:41] 項目八:用按鈕控制走馬燈
  • [42:25] 項目九:LED 電壓電平計
  • [49:25] 項目十:Arduino 交通燈

圖片

Arduino wiring for LED with a push button switch
Arduino wiring for LED with a push button switch
Arduino schematic for LED with a push button switch
Arduino schematic for LED with a push button switch
LED-5mm-green
LED-5mm-green
330_ohm_resistor
330_ohm_resistor
LED 連電阻喺麵包板上,連接到 Arduino 同一個按鈕
LED 連電阻喺麵包板上,連接到 Arduino 同一個按鈕
937-Lessson 98-LED-5: Arduino code to fade the LED when push button is pressed
語言: C++
This code has not been parsed yet. Please return to the admin panel to parse it.

文件📁

Arduino 函式庫 (zip)

用户手册