第六章 進階專題1
在這個章節,你將會學會:
- 製作較大型的專題
陣列的程式語法
CH 6-1 [Project] 心心相印
實習清單
實驗名稱 | 心心相印(在LED矩陣上顯示影像) |
---|---|
預期實驗結果 | 透過Arduino 開發版點亮LED矩陣,排成心型的圖案,藉由不同時間顯示大小不同的心型圖案。 |
實驗目的 | Ø 熟悉LED矩陣的使用。 Ø 學著在LED顯示多的圖形,藉由在多個圖形快速切換產生動畫效果。 |
材料清單 | Ø 麵包版 X1 Ø LED 8X8矩陣 *1 Ø 杜邦線 X N Ø Arduino UNO R3 開發板 |
實習步驟與說明
Arduino的應用開發,分成電路實作與Arduino程式實作兩部分,因此接下來我們就針對這兩部分做介紹,請跟著一起練習看看。
電路實作
元件介紹
再穿越馬路時抬頭所望的交通號誌中的小綠人,其實是利用在前面章節所介紹介紹的LED元件以矩陣的方式排列組成的元件如圖 1。他可以以矩陣排列的方式有很多款式5x7,8x8 ….。唯一要注意的是它分成共陽極與共陰極。所謂『共陽極』是將每行的『陽極』接在一起成為『行』接腳,如圖 2所示。而所謂『共陰極』是將每行的『陰極』接在一起成為『行』接腳,如圖 3所示。因此,我們假如要點亮共陽極的LED陣列,我們必須在『行』接腳上『高電位』,『列』接腳上『接地』。有理可推欲點亮共陰極的LED陣列我們必須在『行』接腳上『接地』,『列』接腳上『高電位』。
圖 1 LED 8X8矩陣
圖 2 共陽極
圖 3 共陰極
佈線圖
以本實驗為例,是使用共陰極LED 矩陣,對所有LED來說,當行接腳是LOW且列的接腳是HiGH 則會點亮。相對應的LED,若行接腳是HiGH且列接腳是LOW,則沒有電流通過LED,LED也就不會亮。
LED PIN 腳 | Arduino PIN 腳 | 線的顏色 |
---|---|---|
1 | D10 | 紅 |
2 | D6 | 橙 |
3 | D4 | 綠 |
4 | A1 | 藍 |
5 | D9 | 白 |
6 | D11 | 黃 |
7 | D3 | 黑 |
8 | D2 | 紅 |
9 | A2 | 橙 |
10 | A4 | 綠 |
11 | D8 | 藍 |
12 | D7 | 白 |
13 | A5 | 黃 |
14 | D5 | 黑 |
15 | A3 | 紅 |
16 | D12 | 橙 |
Arduino程式實作
劃圖小工具
在撰寫程式碼之前,我們可以用JAVA 的小程式模擬我們要匯出圖案。這樣會讓我們撰寫程式更方便。
大愛心圖繪製
小愛心繪製
完整程式碼
載入標頭檔
因為 Arduino沒有LED 8X8函式庫的選項,因此,LiKiI建立一個Ledmatrixshow 的函式庫,方便學員使用。
Step1 找到 LIB 擺放的位置
Step2.
Step3 把Ledmatrixshow 哪個資料夾放入libraries裡面。
Step 4 最後關掉 Arduino IDE 再重新打開一次依照下列步驟。
主體程式
01 #include <Ledmatrixshow.h> 02 03 byte bigHeart[] = { 04 B01100110, 05 B11111111, 06 B11111111, 07 B11111111, 08 B01111110, 09 B00111100, 10 B00011000, 11 B00000000}; 12 13 byte smallHeart[] = { 14 B00000000, 15 B00000000, 16 B00010100, 17 B00111110, 18 B00111110, 19 B00011100, 20 B00001000, 21 B00000000}; 22 23 24 const int columnPins[] = { 2, 3, 4, 5, 6, 7, 8, 9}; 25 const int rowPins[] = { 10,11,12,15,16,17,18,19}; 26 27 void setup() { 28 for (int i = 0; i < 8; i++) 29 { 30 pinMode(rowPins[i], OUTPUT); 31 pinMode(columnPins[i], OUTPUT); 32 digitalWrite(columnPins[i], HIGH); 33 } 34 } 35 36 void loop() { 37 int pulseDelay = 800 ; 38 Ledmatrixshow(smallHeart,320); 39 Ledmatrixshow(bigHeart, 320); 40 delay(pulseDelay); 41 } |
---|
副程式碼 \/\/參考
\/* ledmatrixshow.cpp 顯示LED矩陣 *\/ #include"Arduino.h" #include"Ledmatrixshow.h" const int columnPins[] = { 2, 3, 4, 5, 6, 7, 8, 9}; const int rowPins[] = { 10,11,12,15,16,17,18,19}; void Ledmatrixshow( byte * image, unsigned long duration) { unsigned long start = millis(); while (start + duration > millis()) { for(int row = 0; row < 8; row++) { digitalWrite(rowPins[row], HIGH); for(int column = 0; column < 8; column++) { boolean pixel = bitRead(image[row],column); if(pixel == 1) { digitalWrite(columnPins[column], LOW); } delayMicroseconds(300); digitalWrite(columnPins[column], HIGH); } digitalWrite(rowPins[row], LOW); } } } |
---|
實驗結果
隨堂作業
試著利用LED 矩陣顯示不一樣圖案。
試試看利用按鈕開關控制LED 字形,在不同狀態下印出不一樣的圖案。
CH 6-2 程式語法之陣列
在這個章節,你將會學會:
Ø 陣列的使用
什麼是陣列
有時候,一次要宣告許多變數,例如全班的某科考試成績,可以一行一行各別宣告變數,儲存大家的成績,但如果想讓程式更簡潔易懂,那麼就可以使用陣列囉。
我們可以把陣列,想成排成一列的變數,也可以稱為,一維矩陣。舉例來說,如果班上有五個人,分別的數學段考成績是,50、72、84、90、23,如果使用一維陣列來儲存,就如圖1所示。
50 | 72 | 84 | 90 | 23 |
---|---|---|---|---|
圖1、以一維陣列儲存成績
如果要用arduino的語法表示,那該怎麼寫呢?請繼續看下一個章節。
陣列的使用
如果以剛剛的例子來說,Arduino宣告矩陣的語法如下
int score[5] = {50, 72, 84, 90, 23};
進一步解釋,我們宣告的陣列,是一個只能儲存整數(int)的陣列,這個陣列的長度有5格,我們將這五格依序填入了五個人的成績。
另外要特別注意的是,Arduino對陣列的編號規定,是從0開始,所以第0格裡面的分數是50,第1格裡面的分數是72,以此類推。
如果要印出特定的陣列內容,例如我們想印出第3格陣列的內容,完整程式碼如下:
001 int score[5] = {50, 72, 84, 90, 23};
002
003 void setup()
004 {
005 Serial.begin(9600);
006 }
007
008 void loop()
009 {
010 Serial.println(score[2]);
011 delay(1000);
012 }
這個程式碼,印出第三格的內容,就在第10行,特別注意到,編號是從0開始,所以要印出第三格的內容,其實是印出score[2]的內容。
請利用隨堂練習試試看吧!
隨堂練習
有五人的成績分別是,80、73、86、62、76,請用一維陣列儲存,並分別印出。
有五人的成績分別是,80、73、86、62、76,請用一維陣列儲存,並幫他們各加5分後分別印出。
有五人的成績分別是,80、73、86、62、76,請用一維陣列儲存,並分別印出第1、3、5人的成績。