首先先看紅外線接收器和紅外線發射器。
接收器看起來就像一個電晶體,三個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();
}
}
紅外線的應用很多很廣,下次再拿來結合其他模組來玩。
沒有留言:
張貼留言