1. 程式人生 > >手把手教你智慧硬體開發(三) 控制LED燈

手把手教你智慧硬體開發(三) 控制LED燈

第3節 控制LED燈

現在我們開始嘗試用程式碼控制一個真正的直觀的硬體裝置。

第一個例子:讓Arduino開發板上的一個LED小燈週期性的開啟、關閉。
第二個例子:讓LED燈亮度逐漸的變亮變暗。

3.1 LED燈的開關

3.1.1 原理介紹

Arduino開發板上,都會有兩個LED指示燈。不同的開發板,LED指示燈的位置、顏色略有不同。

  1. 電源指示燈。當開發板連線上電源(或者通過USB線供電)後,用來指示電源是否接通。這個LED燈旁邊肯定有一個“On”標記;

  2. 測試用指示燈。這是一個用來做內部測試的指示燈,也正是本示例要使用到的指示燈。在這個LED燈旁看到個‘L’標記;

前面的章節中,我們介紹了Arduino開發板提供了3類引腳。其中數字引腳D13就控制著這個測試用指示燈。因此我們只需要在程式碼中控制好這個引腳就好了。
沒有可外接的LED模組時,就用D13引腳來做測試。

3.1.2 程式碼設計

通過選單欄建立一個叫做LEDTest.ino的檔案,啟動這個示例。

  1. 任何引腳在使用之前,都要在setup()中對它進行初始化,告知這個引腳用來輸出-OUTPUT,還是用來輸入-INPUT。這裡是要初始化D13引腳,讓它作為輸出。

    //定義引腳的編號,這裡使用的是數字引腳13。
    int pin = 13;
    
    void setup()
    {
        //設定該引腳型別為輸出
    pinMode(pin, OUTPUT); }
  2. 通過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檔案。

  1. setup()中對它進行初始化,告知這個引腳用來輸出-OUTPUT,或者用來輸入-INPUT。這裡是要初始化D13引腳,讓它作為輸出。

    //定義引腳的編號,這裡使用的是數字引腳13
    int pin = 13;
    
    void setup()
    {
        //設定該引腳為輸出
        pinMode(pin, OUTPUT);
    }
  2. 通過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燈模組,

  1. 標註字元R的是控制紅色燈光強度的引腳;
  2. 字元G的是控制綠色燈光強度的引腳;
  3. 字元B的是控制藍色燈光強度的引腳;
  4. 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程式設計中購買,這些相關硬體都由我們為您把關購買,為大家節省選擇的精力與時間。同時也感謝大家對我們這些碼農的支援。

最後再次感謝各位讀者對安豆的支援,謝謝:)

/*******************************************************************/