第六章 進階專題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 的小程式模擬我們要匯出圖案。這樣會讓我們撰寫程式更方便。

  1. 大愛心圖繪製

  2. 小愛心繪製

完整程式碼

載入標頭檔

因為 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); } } }

實驗結果

隨堂作業

  1. 試著利用LED 矩陣顯示不一樣圖案。

  2. 試試看利用按鈕開關控制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]的內容。

請利用隨堂練習試試看吧!

隨堂練習

  1. 有五人的成績分別是,80、73、86、62、76,請用一維陣列儲存,並分別印出。

  2. 有五人的成績分別是,80、73、86、62、76,請用一維陣列儲存,並幫他們各加5分後分別印出。

  3. 有五人的成績分別是,80、73、86、62、76,請用一維陣列儲存,並分別印出第1、3、5人的成績。

results matching ""

    No results matching ""