設備與材料
個人電腦 × 1
arduino Uno × 1
麵包板 × 1
8x8x4 LED Matrix MAX7219 模組 × 1
連接線 若干
實體接線圖
硬體介紹
8x8x4 LED Matrix MAX7219 模組 有4顆 8×8 LED陣列,如果接線端口在左方,由左至右依序分別為第0個、第1個、第2個及第3個 8×8 LED陣列(如下圖)。
每個 8×8 LED陣列 原點(0,0)在右下角,行0(Column 0)是由右下方往上,列0(Row 0)是由右下方往左(如下圖)。
因為跟我們之前 8×8 LED Matrix MAX7219 模組,行0(Column 0),列0(Row 0) 不同,因此把 8x8x4 LED Matrix MAX7219 模組 旋轉180°使用(如下圖)
小綠人動畫圖
注意事項
請參考 8*8 LED Matrix MAX7219 實習 來完成此實習,但是 8*8 LED Matrix MAX7219 只有 1 個 8*8 LED ,此次實習有 4 個,所以宣告 LedControl 物件的程式要修改
LedControl lc=LedControl(12,11,10,4); //宣告 LedControl 物件 有 4 個 8*8 LED
8*8 LED Matrix MAX7219 實習 中的 setup() 函式,只有初始化第 0 個 8*8 LED,這次實習有 4 個 8*8 LED ,因此每個都要初始化,你可以用 for() 迴圈,也可以打 4 次。
void setup() {
//這裡只有初始化第0個,你必需要增加第 1、2、3 個 8*8LED 的初始化
lc.shutdown(0,false); // 關閉省電模式
lc.setIntensity(0,0); // 設定亮度為 0 (介於0~15之間)
lc.clearDisplay(0); // 清除螢幕
}
小綠人圖檔
byte gMan[]={
B00000000,B11010001,B11110111,B00111100,B00011000,B00000101,B00000011,B00000000, //動作1
. //動作2
. //動作3
. //動作4
. //動作5
. //動作6
. //動作7
. //動作8
B00000000,B00011001,B00100011,B11111110,B11111110,B00100011,B00011001,B00000000 //停止
};
/////////////////////////////////////////////////
// 自定函式 顯示 小綠人 //
// num 那個小綠人圖檔,d 顯示在那個顯示器 //
// dMan(8,1); //在第1個顯示器顯示小綠人第8個圖檔 //
/////////////////////////////////////////////////
void dMan(int num,int d){
for (int j = 0; j < 8; j++) {
lc.setColumn(d, j, gMan[num*8+j]);
}
}
功能
- 請在第 1 個 8*8 LED 顯示 小綠人停止圖
- 請在第 3 個 8*8 LED 顯示 小綠人動作1~8 重複 10次
- 請在第 3 個 8*8 LED 顯示 小綠人停止圖
- 請在第 1 個 8*8 LED 顯示 小綠人動作1~8 重複 10次
- 回到動作1
小綠人倒數程式
//引用 MAX7219 函式庫
#include <LedControl.h>
//宣告 LedControl 物件
LedControl lc = LedControl(12, 11, 10, 4); //設定接腳
//每個數字 4 byte
byte font[] = {
B01111100, B10000010, B10000010, B01111100, //0
B00000000, B01000010, B11111110, B00000010, //1
B01000110, B10001010, B10010010, B01100010, //2
B01000100, B10010010, B10010010, B01101100, //3
B00111000, B01001000, B11111110, B00001000, //4
B11110100, B10010010, B10010010, B10001100, //5
B01111100, B10010010, B10010010, B01001100, //6
B11000000, B10000000, B10000000, B11111110, //7
B01101100, B10010010, B10010010, B01101100, //8
B01100100, B10010010, B10010010, B01111100 //9
};
// 小綠人圖檔
// gMan[0]~[7] 小綠人跑
// gMan[8] 小綠人停
byte gMan[]={
// 1 2 3 4 5 6 7 8
B00000000,B11010001,B11110111,B00111100,B00011000,B00000101,B00000011,B00000000, //動作1
B00000000,B11011011,B11110110,B00111100,B00011000,B00010100,B00001011,B00000000, //動作2
B00001000,B11010010,B11111010,B00111100,B00010100,B00010010,B00001011,B00000000, //動作3
B11001010,B11110010,B00111100,B00101000,B00100100,B00010010,B00000011,B00000000, //動作4
B11001001,B11110001,B00111111,B00011100,B00010100,B00001010,B00000111,B00000000, //動作5
B11001001,B11110011,B00111100,B00011100,B00010010,B00001011,B00000100,B00000000, //動作6
B11000000,B11111010,B00111101,B00011110,B00010011,B00001000,B00000000,B00000000, //動作7
B00000000,B11000000,B11110000,B00111110,B00011010,B00000111,B00000000,B00000000, //動作8
B00000000,B00011001,B00100011,B11111110,B11111110,B00100011,B00011001,B00000000 //停止
};
void setup() {
//8x8 MAX7219 初始化
for (int i = 0; i < 4; i++) {
lc.shutdown(i, false); // 關閉省電模式
lc.setIntensity(i, 0); // 設定亮度為 1 (介於0~15之間)
lc.clearDisplay(i); // 清除螢幕
}
}
void loop() {
// put your main code here, to run repeatedly:
int delayTime;
lc.clearDisplay(0); // 清除螢幕
dMan(8,1); //小綠人停
for(int i=30;i>=0;i--){
displayNum(i,2);
if(i<=5){
delayTime=10;
gManRun(3,delayTime);
gManRun(3,delayTime);
gManRun(3,delayTime);
}else{
delayTime=70;
gManRun(3,delayTime);
}
}
lc.clearDisplay(2); // 清除螢幕
dMan(8,3);//小綠人停
for(int i=30;i>=0;i--){
displayNum(i,0);
if(i<=5){
delayTime=10;
gManRun(1,delayTime);
gManRun(1,delayTime);
gManRun(1,delayTime);
}else{
delayTime=70;
gManRun(1,delayTime);
}
}
}
//小綠人跑
void gManRun(int d,int dTime){
dMan(0,d);
delay(dTime);
dMan(1,d);
delay(dTime);
dMan(2,d);
delay(dTime);
dMan(3,d);
delay(dTime);
dMan(4,d);
delay(dTime);
dMan(5,d);
delay(dTime);
dMan(6,d);
delay(dTime);
dMan(7,d);
delay(dTime);
}
/////////////////////////////////////
//自定函式 顯示 小綠人 /
//num 那個小綠人圖檔,d 顯示在那個顯示器 /
/////////////////////////////////////
void dMan(int num,int d){
for (int j = 0; j < 8; j++) {
lc.setColumn(d, j, gMan[num*8+j]);
}
}
//自定函式 顯示數字
void displayNum(int code,int d){
int code1;
int code2;
code1 = code % 10; //取個位數 % =>求餘數
code2 = code / 10; //取拾位數 / =>求拾位數
for (int j = 0; j < 4; j++) {
//顯示 拾位數
lc.setColumn(d, j, font[j+code2*4]);
//顯示 個位數
lc.setColumn(d, j+4, font[j+code1*4]);
}
}
相關知識
匯入zip程式庫
8*8*4 LED Matrix MAX7219
進制表示
自定函數
if 判斷式
if else 判斷式
digitalRead 函式
boolean
陣列
for 迴圈
Arduino 複合運算子
const
Arduino Uno 硬體
int
void
setup 函數
loop 函數
pinMode 函數
digitalWrite 函數
delay 函數
Arduino 輸出實習(單燈閃爍)
Arduino 輸出實習(跑馬燈-愚公移山)
Arduino 輸出實習(跑馬燈-for迴圈)
Arduino 數位輸入實習
Arduino 數位輸入實習(INPUT_PULLUP)
Arduino 類比輸入實習
Arduino PWM 實習 (呼吸燈)
Arduino PWM 實習 (光感應調光燈)
Arduino 8×8 LED Matrix MAX7219 實習
Arduino 紅綠燈小綠人 實習
Arduino 計時器 實習
Arduino 音樂盒
Arduino 電子琴(鍵盤掃描)
Arduino DHT11 溫濕度感應器
Arduino OLED 顯示
Arduino 超音波測距模組 HC-SR04
Arduino 執行時間實習
Arduino 電容測試器
Arduino 紅外線接收實習
Arduino 紅外線發射實習 EPSON 投影機控制
ESP-12F 網路智慧開關(MQTT)
ESP-12F 雲端記錄型 K-Type 溫度計(MQTT ThingSpeak)
ESP-12F 手機雲端紅外線控制
ESP-12F 網路電台收音機
ESP-12F 電子鼓