Arduino 紅綠燈小綠人實習

學習如何學習!

設備與材料

個人電腦 × 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°使用(如下圖)

小綠人動畫圖

動作1
動作2
動作3
動作4
動作5
動作6
動作7
動作8
動作1~8
停止

注意事項

請參考 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. 請在第 1 個 8*8 LED 顯示 小綠人停止圖
  2. 請在第 3 個 8*8 LED 顯示 小綠人動作1~8 重複 10次
  3. 請在第 3 個 8*8 LED 顯示 小綠人停止圖
  4. 請在第 1 個 8*8 LED 顯示 小綠人動作1~8 重複 10次
  5. 回到動作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 函數

入門
知識
語法
流程
函式
實習

發佈留言