手把手教你智慧硬體開發(三) 控制LED燈
第3節 控制LED燈
現在我們開始嘗試用程式碼控制一個真正的直觀的硬體裝置。
第一個例子:讓Arduino開發板上的一個LED小燈週期性的開啟、關閉。
第二個例子:讓LED燈亮度逐漸的變亮變暗。
3.1 LED燈的開關
3.1.1 原理介紹
Arduino開發板上,都會有兩個LED指示燈。不同的開發板,LED指示燈的位置、顏色略有不同。
電源指示燈。當開發板連線上電源(或者通過USB線供電)後,用來指示電源是否接通。這個LED燈旁邊肯定有一個“On”標記;
測試用指示燈。這是一個用來做內部測試的指示燈,也正是本示例要使用到的指示燈。在這個LED燈旁看到個‘L’標記;
前面的章節中,我們介紹了Arduino開發板提供了3類引腳。其中數字引腳D13就控制著這個測試用指示燈。因此我們只需要在程式碼中控制好這個引腳就好了。
沒有可外接的LED模組時,就用D13引腳來做測試。
3.1.2 程式碼設計
通過選單欄建立一個叫做LEDTest.ino
的檔案,啟動這個示例。
任何引腳在使用之前,都要在
setup()
中對它進行初始化,告知這個引腳用來輸出-OUTPUT
,還是用來輸入-INPUT
。這裡是要初始化D13引腳,讓它作為輸出。//定義引腳的編號,這裡使用的是數字引腳13。 int pin = 13; void setup() { //設定該引腳型別為輸出
通過
digitalWrite()
函式,讓指示燈變亮一秒,然後變暗一秒,如此往復,void loop() { //將該引腳設定成高電平,也就是通電,開啟指示燈 digitalWrite(pin, HIGH); //延時1秒,在這1秒鐘,LED燈狀態不變,即點亮狀態 delay(1000); //將該引腳設定成低電平,也就是斷電,關閉指示燈 digitalWrite(pin, LOW); //延時1秒,在這1秒鐘,LED燈狀態不變,即熄滅狀態 delay(1000); }
loop()
執行之後,會被迴圈再次執行,我們設計的效果就是LED燈一秒亮、一秒暗的不停的迴圈。digitalWrite()
函式專門用來為數字引腳設定高低電平,//將該引腳設定成高電平 digitalWrite(pin, HIGH); //將該引腳設定成低電平 digitalWrite(pin, LOW);
3.1.3 結果觀察
將工程編譯部署到開發板上,就能看到D13連線到LED指示燈,一秒亮、一秒暗的不停閃爍。
3.2 LED燈明暗調節
3.2.1 原理介紹
數字引腳只能輸出高電平HIGH或低電平LOW兩種,但是通過脈衝寬度調製(Pulse Width Modulation簡稱PWM)就能讓數字埠模擬輸出多級的電壓(通常是0級~255級,0級代表沒有,255級代表最高電壓)。
數字引腳上的電壓,可以看成是一個個脈衝方波,當引腳一直處於高電平的時候,輸出為V,
當引腳電壓的脈衝方波週期中,有50%的時間中處於高電平的時候,平均輸出就為V/2;
當引腳電壓的脈衝方波週期中,有33.3%的時間中處於高電平的時候,平均輸出就為V/3;
以此類推。
*更官方的表述請參考官網。
Arduino開發板提供的數字引腳中,有的引腳就具備了PWM的能力:能夠設定這些數字引腳的電壓輸出級數。
int pin = 13;
pinMode(pin, OUTPUT);
......
//設定成輸出10級電壓,電壓強度從0~255
analogWrite(pin, 10);
通過官網給出的規格,可以看出Arduino MEGA開發板的D13引腳,是具備PWM功能的。所以我們可以讓測試指示燈漸變明暗。
不過Arduino UNO開發板上的D13引腳並不具備PWM功能,因此要在它上面進行燈光強弱調整的實驗,必須要在其他的引腳上,外接一個LED燈硬體。這部分內容,我們將在後面介紹。
3.2.2 程式碼設計
改造前面的LEDTest.ino
檔案。
在
setup()
中對它進行初始化,告知這個引腳用來輸出-OUTPUT
,或者用來輸入-INPUT
。這裡是要初始化D13引腳,讓它作為輸出。//定義引腳的編號,這裡使用的是數字引腳13 int pin = 13; void setup() { //設定該引腳為輸出 pinMode(pin, OUTPUT); }
通過
analogWrite()
函式,讓指示燈逐級變亮,然後逐級變暗,如此往復,void loop() { //將該引腳從0級逐步設定到255級,指示燈逐漸變亮 for(int level = 0; level < 256; level++) { analogWrite(pin, level); //延時100毫秒,LED燈狀態不變 delay(10); } //將該引腳從255級逐步設定到0級,指示燈逐漸變暗 for(int level = 255; level >= 0; level--) { analogWrite(pin, level); //延時100毫秒,LED燈狀態不變 delay(10); } }
loop()
執行之後,會被迴圈再次執行,我們設計的效果就是LED燈逐漸變亮,再逐漸變暗。這裡使用了
analogWrite()
函式向數字引腳設定電壓0級~255級
中的任何一級,//將該PWM引腳設定成0~255級中的任何一級 analogWrite(pin, level);
可見
analogWrite()
函式並不像它的名字那樣只是模擬引腳的專利,它對支援PWM的引腳同樣適用。
3.2.3 結果觀察
將工程編譯部署到開發板上,就能看到D13連線到LED指示燈,一會兒亮一會兒暗的逐漸變化。
3.3 其他LED燈的使用
除了使用Arduino MEGA開發板的D13引腳,我們也可以使用任何其他帶PWM功能的數字引腳。例如Arduino MEGA開發板的D2~D13
D44
D46
;Arduino UNO開發板的3 5 6 9 10 11
。將LED燈接到這些引腳上面,就能同樣的實現對LED燈的控制。
3.3.1 LED模組
你的LED模組可能是單色的:只能發出一種顏色的光,這種模組有3個引腳,標註字元S的是控制燈光強度的引腳、VCC或者+是電源引腳、GND或者G是接地引腳,例如跟我學Arduino開發中提供的單色LED燈模組,
LED燈也可能支援3種基礎顏色-紅綠藍,這種模組有4個引腳,例如跟我學Arduino開發中提供的三色LED燈模組,
- 標註字元R的是控制紅色燈光強度的引腳;
- 字元G的是控制綠色燈光強度的引腳;
- 字元B的是控制藍色燈光強度的引腳;
- GND是接地引腳,
3.3.2 連線模組
這裡我們先用單色的LED燈模組舉例。
MEGA開發板,2-13引腳都支援PWM,隨便選一個都可以。
UNO開發板,3,5,6,9,10,11引腳支援PWM,可以在開發板上看到引腳數字邊上有個’~’。
這裡我們選擇D9
引腳來連線LED燈。
LED燈的S引腳連線到MEGA D9引腳;VCC接到MEGA 5V引腳;GND接到MEGA GND引腳。
早期的開發板,為了防止電壓不穩定擊穿電子器件,需要連線個電阻。
現在的開發板,只在接馬達時才需要增加電阻,慣常的做法是增加一塊擴充套件板。
在實際的硬體連線當中,我們通常用擴充套件板來連線LED模組和開發板。
這裡我們使用感測器擴充套件板,
可以看到擴充套件板上已經印製出了每個引腳的含義,
對於數字引腳擴充套件槽來說,
GND或者G:接地引腳
VCC或者V:供電引腳
D或者S:被擴展出的引腳,其下方的數字代表該引腳的編號
對於模擬引腳擴充套件槽來說,
GND或者G:接地引腳
V或者+:供電引腳,
S:被擴展出的引腳,其下方的數字代表該引腳的編號
所以,對於這裡的情況,我們選擇標註了9
的數字引腳擴充套件插槽。
擴充套件板引腳 | 連線 | 單色LED燈模組引腳 |
---|---|---|
9組V | <—> | + |
9組G | <—> | G |
9組S | <—> | S |
3.3.3 修改程式碼
因為這次我們使用了D9引腳,所以需要修改前面使用的D13引腳為D9,
//定義引腳的編號,這裡使用的是數字引腳9
int pin = 9;
void setup()
{
//設定該引腳為輸出
pinMode(pin, OUTPUT);
}
void loop()
{
//將該引腳從0級逐步設定到255級,指示燈逐漸變亮
for(int level = 0; level < 256; level++)
{
analogWrite(pin, level);
//延時100毫秒,LED燈狀態不變
delay(10);
}
//將該引腳從255級逐步設定到0級,指示燈逐漸變暗
for(int level = 255; level >= 0; level--)
{
analogWrite(pin, level);
//延時100毫秒,LED燈狀態不變
delay(10);
}
}
3.3.4 結果觀察
將工程編譯部署到開發板上,就能看到D9連線到LED指示燈,一會兒亮一會兒暗的逐漸變化。
3.3.5 使用三色LED燈
使用三色的LED燈模組,與使用單色的LED燈模組一樣。在硬體連線時,要同時把紅R、綠G、藍B三種顏色對應的引腳連線到PWM介面上。例如使用數字引腳D9、D10、D11,分別對應紅、綠、藍三種顏色,就要多使用幾個擴充套件板的插槽,將對應的R G B引腳插在標註了9
10
11
編號的數字擴充套件口上,
在程式碼中要初始化三個PWM介面。
//定義引腳的編號,這裡使用的是數字引腳D9、D10、D11,
//分別對應紅、綠、藍三種顏色
int RED_LED_PIN = 9;
int GREEN_LED_PIN = 10;
int BLUE_LED_PIN = 11;
void setup()
{
//設定該引腳為輸出
pinMode(RED_LED_PIN, OUTPUT);
pinMode(GREEN_LED_PIN, OUTPUT);
pinMode(BLUE_LED_PIN, OUTPUT);
}
void loop()
{
//將該引腳從0級逐步設定到255級,指示燈逐漸變亮
for(int level = 0; level < 256; level++)
{
analogWrite(RED_LED_PIN, level);
analogWrite(GREEN_LED_PIN, level);
analogWrite(BLUE_LED_PIN, level);
//延時100毫秒,LED燈狀態不變
delay(10);
}
//將該引腳從255級逐步設定到0級,指示燈逐漸變暗
for(int level = 255; level >= 0; level--)
{
analogWrite(RED_LED_PIN, level);
analogWrite(GREEN_LED_PIN, level);
analogWrite(BLUE_LED_PIN, level);
//延時100毫秒,LED燈狀態不變
delay(10);
}
}
/*******************************************************************/
本系列課程使用到的Arduino開發板、擴充套件板以及其他相關的感測器,各位可以根據我們文章中介紹的硬體在淘寶網選購。
您也可以在我們的網店跟我學Arduino程式設計中購買,這些相關硬體都由我們為您把關購買,為大家節省選擇的精力與時間。同時也感謝大家對我們這些碼農的支援。
最後再次感謝各位讀者對安豆
的支援,謝謝:)
/*******************************************************************/