Arduino基礎: 調節LED的亮度

Originally published by Feb 5, 2020

目錄

  1. 前言
  2. 數字不能調節亮度
  3. 使用數位輸出改變LED亮度
  4. 透過PWM調節亮度
  5. 讓LED逐漸閃爍
  6. 相關文章

前言

本文最初發佈在deviceplus.jp網站上,而後被翻譯成英語。

Device Plus網站中介紹了有關Arduino的各種應用和作品示例,但無論創作任何作品,基礎知識都很重要!
在本文中,我們將透過使Arduino能夠調節LED亮度,為您帶來“關鍵”的Arduino基礎知識。

我們曾介紹過,透過將LED連接到Arduino的數位輸出引腳,並設置HIGH (5V) 和LOW (0V) ,可以輕鬆地切換LED的開和關。但是,由於數位輸出只能輸出兩種狀態,因此無法進行亮度調節等控制。
要想解決這個問題,您可以使用“PWM”輸出。PWM可在HIGH和LOW狀態之間反覆切換輸出,所以可以用來調節LED的亮度。
在本文中,我們將學習如何使用PWM來調節LED的亮度。我們還將學習如何編寫使用PWM輸出逐漸點亮LED的程式。

數字不能調節亮度

正如我們上次介紹過的,LED的亮度會隨電流的變化而變化。比如,分別透過330Ω的電阻和10kΩ的電阻來調節連接到LED的電流量,並對它們的結果進行比較時,會發現連接330Ω小電阻時電流量更大,這會使LED更亮。或者,改變連接到LED的電源電壓,也會使流過的電流量發生變化。

如果分別施加5V和3.3V的電壓,施加5V電壓時LED燈更亮。根據上一次介紹過的電阻和流過LED的電流之間的關係式,要想讓LED更亮,需要“降低電阻”,或“提高電壓”。

logic behind creating larger current

然而,Arduino的數位輸出只有HIGH (5V)或 LOW (0V)兩種狀態,這意味著直接連接並不能改變電壓和電阻值,也就是說,無法調節LED的亮度。但是,雖然只有HIGH和LOW兩種輸出狀態,透過一些努力還是可以改變LED亮度的。

使用數位輸出改變LED亮度

讓我們嘗試一下只用數字輸出來改變LED的亮度吧。亮度可以透過讓LED閃爍來調節。我們按照步驟一步一步來實際操作,看看LED的亮度是如何變化的。將LED連接到Arduino的數位引腳5,如下圖所示:

LED circuit

接下來,創建如下所示的程式並將其傳送給Arduino。此時,LED應該會每隔1秒閃爍1次。

 

在程式中,透過第11行的“digitalWrite( LED_PIN, HIGH )”輸出HIGH,使LED亮起,然後透過第12行的“delay (ON_TIME)”在指定的時間內保持亮燈。持續時間以毫秒為單位,如果指定1000,則LED將保持點亮1秒鐘。

接下來,透過第14行的“digitalWrite( LED_PIN, LOW )”輸出LOW,使LED熄滅,然後透過第15行的“delay( OFF_TIME )”在指定的時間內保持熄滅狀態。透過反復執行該程式即可實現LED的閃爍。

下面,讓我們嘗試一下縮短點亮和熄滅的持續時間。可以使用第3行的“const int ON_TIME”來更改點亮狀態的持續時間,使用第4行的“const int OFF_TIME”來更改熄滅狀態的持續時間。將這兩個值都更改為“500”並反射程式,然後確認LED的狀態。可以看到閃爍速度增加。接著,當將值逐漸減小到“250”、“100”、“75”、“50”等數位時,閃爍速度變得更快。當值為“10”左右時,LED看起來像在保持點亮狀態。這是因為如果它閃爍得太快,人眼就跟不上它的速度,從而使燈看起來就像一直亮著。

接下來,我們試著改變點亮和熄滅的持續時間。將“ON_TIME”和“OFF_TIME”都設置為“10”。然後,依次將“ON_TIME”的值更改為“9”、“8”、“7”……“1”,並確認LED的點亮狀態。可以看到當減小該值時,LED會逐漸變暗。

high duration and brightness

這是因為持續亮燈時間縮短,發光量減少,從而使LED看起來變暗。也就是說,透過改變“點亮持續時間”也可以調節LED的亮度。使用該方法,可以實現用僅能控制開/關的Arduino數位輸出功能來控制LED的亮度。

透過PWM調節亮度

如上所述,透過調整HIGH和LOW的比例,使LED以較短的週期閃爍,即可調節LED的亮度。但是,自己創建程式來控制閃爍持續時間並不現實。因為處理其他程式需要時間,而這會使閃爍間隔出現偏差,從而會使亮度發生變化。

Arduino可以使用PWM(Pulse Width Modulation,脈衝寬度調製)功能來週期性地輸出HIGH和LOW。PWM是以指定的速率週期性地在HIGH和LOW之間切換的一種功能,可用於上述的LED亮度調節。

但是,需要注意的是,可用於PWM功能的引腳在Arduino中是固定的。只有數位旁邊帶有“〜”標記的引腳(即引腳3、5、6、9、10和11)可使用PWM功能,其他引腳不支援PWM輸出。

pins that support PWM output

另外,由於PWM是透過Arduino的微控制器產生的功能,因此具有輸出穩定、不影響程式運行的優點。
在這裡,我們將LED連接到引腳5來試一下。用與前述電路相同的方式連接LED。
接下來,創建如下所示的程式並將其發送給Arduino,LED將會亮起,但是較暗。

 

透過PWM功能輸出時,需要透過第6行的“pinMode()”將物件引腳設置為輸出模式。實際輸出時,使用第10行的“analogWrite()”。指定物件引腳編號,然後在0到255的範圍內設置保持HIGH的比率。如果設置為“0”,將始終輸出LOW,如果設置為“255”,則始終輸出HIGH。如果設置為“127”,將會以各一半的比率輸出HIGH和LOW。

在這個程式中,可以透過第3行的“const int DUTY”來指定PWM比率。更改該值可以確認亮度的變化情況。

讓LED逐漸閃爍

我們使用PWM輸出拓展了LED點亮的方法。現在,讓我們逐漸改變PWM來嘗試實現LED逐漸變亮的效果。

編寫如下程式:

 

在上述程式中,將PWM比率存儲在loop()函數中使用的“i”變數中,以使其可以逐漸增加該值,從而使LED逐漸變亮。

第14行的while處理以STEP指定的增量增加值,直到i達到 255。增加的值由第15行的analogWrite()輸出,以使LED的亮度改變。此外,每次第16行的PWM輸出改變時,將等待由WAITTIME指定的持續時間。

當PWM比率達到255時,它會逐漸減小該值直到0,以使LED逐漸變暗(第21到25行)。可以透過更改第3行的WAITTIME或第4行的STEP的值來調節閃爍速度。

此次我們學習了如何控制LED的亮度。下篇再見!

想瞭解更多關於Arduino的知識嗎?歡迎查看相關的文章:

  1. 如何使用Arduino創建摩爾斯電碼生成器
  2. 如何使用環境光感測器控制燈光
  3. 使用Arduino進行USB音量控制