2018年1月29日 星期一

Arduino (11) 紅外線收發器+MAX7219+8X8 LED點陣模組。

這次要玩的是用紅外線去控制8X8點陣LED模組。





















首先先看紅外線接收器和紅外線發射器

接收器看起來就像一個電晶體,三個PIN分別是DC+-和Vout。

發射器看起來就是一個普通的遙控器,可以用其他遙控器代替。






















再來就是8X8點陣模組,這模組有搭配MAX7219顯示驅動器

其實我學習套件裡的8X8LED沒有包含MAX7219,但看了佈線圖讓我卻步了,

於是我額外買了模組化的套件,複雜的腳位變成五根PIN。

分別是DC正負、DIN、CS、CLK。





















按下紅外線發射器任何鍵,序列阜解碼的資料都不一樣,Protocol屬NEC。

32 bits是解碼資料的單位大小,也是4 bytes。





影片中按0顯示0,按1顯示1,按8顯示8,按"CH-"燈跑馬全亮,按"CH"燈跑馬全暗。

我只設定五種按鍵而已,太多真的會寫到死。



程式如下:

#include <IRremote.h>
#include <LedControl.h>
//需要拉出紅外線和MAX7219的資料庫。

const int irReceiverPin = 2;
const int trigger =7;
IRrecv irrecv(irReceiverPin);
decode_results results; 
LedControl lc=LedControl(12,11,10,1); 
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(trigger, OUTPUT); 
  lc.shutdown(0,false);  
  lc.setIntensity(0,8);  
  lc.clearDisplay(0);     
}
//一些既定的宣告和定義。


void loop() 
{
  if (irrecv.decode(&results)){ 
            Serial.print("Protocol: ");   

            switch(results.decode_type) {
        case NEC:
          Serial.print("NEC");
          break;
        case SONY:
          Serial.print("SONY");
          break;
        case RC5:
          Serial.print("RC5");
          break;
        case RC6:
          Serial.print("RC6");
          break;
        default:
          Serial.print("Unknown encoding");  

//分類帽是確認你的遙控器的Protocol。
    }  

    Serial.print("  irCode: ");            
    Serial.print(results.value); 
//序列阜會顯示你用紅外線發射器按的解碼資料。

    if (results.value == 16753245) { 
//接收到解碼16753245,執行以下邏輯。

        digitalWrite(trigger, HIGH);
        
          for (int row=0; row<8; row++)
           {
            for (int col=0; col<8; col++)
             {
              lc.setLed(0,col,row,true); 
                delay(25);
          }
       }
    }  
//LED用跑馬燈方式全亮。

    if (results.value == 16736925) {  
        digitalWrite(trigger, LOW);
        
          for (int row=0; row<8; row++)
           {
            for (int col=0; col<8; col++)
             {
              lc.setLed(0,col,row,false);
                delay(25);
         }
      }
   }
//LED用跑馬燈方式全暗。


   if (results.value == 16738455){
    for (int row=2; row<6; row++){
        lc.setLed(0,2,row,true);
        lc.setLed(0,5,row,true);
      }
    for (int col=3; col<5; col++){
        lc.setLed(0,col,1,true);
        lc.setLed(0,col,6,true);
     }
   }
//顯示數字"0"。

      if (results.value == 16724175){
    for (int row=1; row<7; row++){
        lc.setLed(0,3,row,true);
      }
    for (int col=2; col<5; col++){
        lc.setLed(0,col,7,true);
     }
     lc.setLed(0,4,2,true);
   }
//顯示數字"1"。

      if (results.value == 16730805){
    for (int row=2; row<7; row++){
        lc.setLed(0,2,row,true);
        lc.setLed(0,5,row,true);
      }
    for (int col=3; col<5; col++){
        lc.setLed(0,col,1,true);
        lc.setLed(0,col,4,true);
        lc.setLed(0,col,7,true);      
     }
     lc.setLed(0,5,4,false);
     lc.setLed(0,2,4,false);
   }
//顯示數字"8"。

    Serial.print(",  bits: ");           
    Serial.println(results.bits);  
    delay(500);
    irrecv.resume();         
  }  
}

紅外線的應用很多很廣,下次再拿來結合其他模組來玩。




沒有留言:

張貼留言

8051 (6) 紅外線避障模組控制LED七段顯示器。

這篇要做的Project就是感測器測到訊號時,LED七段顯示器會開始計算偵測次數, 到第5次時會讓紅色LED燈發光。 程式如下: #include <reg52.h> unsigned char seg[5]={0xf9,...