基礎教程2 Arduino 讓多個LED 炫酷地閃

我是潘,曾經是個工程師。這是為Ardui.Co 寫的專欄。上一課,你已經瞭解Arduino 的基本工作原理,並且學會了控制一個燈,但覺得不夠酷?Arduino Uno 有13個 DIGITAL I/O 端口,可以同時控制13個 LED。而且 Arduino 還可以通過 I2C、SPI 等協議擴展,控制幾百個 LED 都不成問題,但擴展我們後面再講,現在先演示一下怎樣控制多個 LED 。

電路是這樣設計的:從第 8 個 DIGITAL I/O 開始到第 13 個,每個端口串聯一個220歐姆的電阻和 LED。其中,LED 正極(長的一端)接電阻,電阻再接I/O,LED 負極接地(Arduino 上的 GND 端口)

基礎教程2 Arduino 讓多個LED 炫酷地閃

我們選用紅黃綠 3 種 LED,但每種顏色的 LED 壓降都不一樣,紅色約 2.1V,黃色2.4V、綠色2.7V,而 Arduino DIGITAL I/O 輸出高電平為 5V ,這意味著串聯的電阻壓降不一樣,三種 LED 通過電流大小不等,因此別奇怪它們的亮度不同。

現在要讓 LED 按順序輪流點亮,就是傳說中的跑馬燈效果,程序如下:

int del = 100; // 設置延時,100毫秒

void setup()

{

pinMode(8, OUTPUT);

pinMode(9, OUTPUT);

pinMode(10, OUTPUT);

pinMode(11, OUTPUT);

pinMode(12, OUTPUT);

pinMode(13, OUTPUT);

}

void loop()

{

digitalWrite(8, HIGH);

delay(del);

digitalWrite(8, LOW);

digitalWrite(9, HIGH);

delay(del);

digitalWrite(9, LOW);

digitalWrite(10, HIGH);

delay(del);

digitalWrite(10, LOW);

digitalWrite(11, HIGH);

delay(del);

digitalWrite(11, LOW);

digitalWrite(12, HIGH);

delay(del);

digitalWrite(12, LOW);

digitalWrite(13, HIGH);

delay(del);

digitalWrite(13, LOW);

}

看看效果:

基礎教程2 Arduino 讓多個LED 炫酷地閃

這程序很容易理解,端口 8~13 設置為輸出模式,然後點亮一個就滅掉一個,而且也能很好工作。只是重複代碼太多,6 個 LED 好處理,但如果有幾百個 LED 呢?

Arduino Uno 只有 32KB 程序空間,因此必須精簡以節約空間,這樣才能在以後容納更復雜的系統。我們將上述程序改成 for 循環:

int del = 100; // 延時默認為100毫秒

void setup()

{

// 初始化端口的模式為 OUTPUT

for (int i = 8; i <= 13 ; i++)

{

pinMode(i, OUTPUT);

}

}

void loop()

{

for (int i = 8; i <= 13; i++)

{

digitalWrite(i, HIGH);

delay(del);

digitalWrite(i, LOW);

}

for (int i = 13; i >= 8; i--)

{

digitalWrite(i, HIGH);

delay(del);

digitalWrite(i, LOW);

}

}

IDE顯示,沒有優化前,程序佔用1,270 字節,優化後為 1,122 字節,總空間的3%。現在對於動輒幾 TB 存儲空間的個人電腦來講,1KB 根本不足道,但對 Arduino ,每一個字節都要精打細算。

現在我們讓它有更多的變化,加入一個隨機函數 random(),讓跑馬燈循環 3 遍後,隨機點亮 3 個。

random(x) 函數,能夠在 0 ~ x(不包含最大值 x)的範圍內隨機生成一個整數,比如 random(256),隨機生成 0 ~ 255 中的一個整數,再如 random(10, 20),隨機生成 10 ~ 19 中的一個整數。

void loop(),本身已經是個循環,我們要在裡面嵌套一個小循環:

int del = 100; // 延時默認為100毫秒

void setup()

{

// 初始化端口的模式為 OUTPUT

for (int i = 8; i <= 13 ; i++)

{

pinMode(i, OUTPUT);

}

}

void loop()

{

for (int j = 1; j <= 3; j++ )

{

for (int i = 8; i <= 13; i++)

{

digitalWrite(i, HIGH);

delay(del);

digitalWrite(i, LOW);

}

for (int i = 13; i >= 8; i--)

{

digitalWrite(i, HIGH);

delay(del);

digitalWrite(i, LOW);

}

}

for (int k = 1; k <= 3; k++ )

{

int p = random(8, 14);

digitalWrite(p, HIGH);

delay(del);

digitalWrite(p, LOW);

}

}

int p;

p = random(8, 14);

但為了節省空間,我們把它寫成上面的形式。

燈光不僅是我們塑造環境氛圍的一種基本需求,而且是一種藝術表現形式。後面你會發現通過 Arduino ,往往只需簡單幾段代碼,就可以創造出千變萬化的效果。


分享到:


相關文章: