版權聲明:本文爲博主 **單片機菜鳥** 一心一血敲出來的原創作品,未經博主允許不得轉載,多謝支持。
-
本系列博客僅僅做個人技術交流分享,不做任何商業用途。如有不對之處,請留言,本人及時更改。
-
如何和博主一起學習:
博主建立了ESP8266開發之旅學習羣,需要的同學請加 869920142
1.前言
紅外通信是一種利用紅外光編碼進行數據傳輸的無線通信方式,在目前來說是使用非常廣泛的。生活中常見電視遙控器,空調遙控器,DVD遙控器(現在估計是老古董了),均使用紅外線遙控。使用紅外線遙控,主要有一體化紅外接收頭和紅外遙控器。
1.1 一體化紅外接收頭
一體化接收頭內部集成了紅外接收電路。它可以接收紅外信號並還原發射端的波形信號。通常使用的一體化接收頭都是38KHz的紅外信號。
1.2 紅外遙控器
實驗中採取以下遙控器
每個按鍵都有各自的編碼,按下按鍵後,就會發送對應編碼的紅外波。大多使用NEC編碼。
要想使用紅外遙控功能,我們使用第三方紅外遙控庫——IRremote(如果是8266請使用 IRremoteESP8266 庫)。
2.常用方法
下面介紹一下IRremote類庫
1)IRrecv類 用於接收紅外信號並對其解碼。在使用前需要實例化一個該類對象。
- IRrecv(recvpin) 構造函數 recvpin爲連接到接收頭的引腳
- enableIRIn()初始化紅外解碼
- decode() 檢查是否接收到編碼
- resume() 接收下一個編碼
3.實驗
實驗內容: 根據遙控器輸入的紅外信號,顯示對應的符號;
實驗代碼:
/**
* @Desc 測試紅外通信
* @author 單片機菜鳥
* @Date 2016/12/29
*
*/
#include <IRremote.h>
#define MAX 22
int RECV_PIN = 7; //定義紅外接收模塊輸出口接arduino數字引腳11
IRrecv irrecv(RECV_PIN);
decode_results results;
//Car mp3編碼
unsigned long rremote_code[MAX] = {
0xFFA25D,0xFF629D,0xFFE21D,//CH- CH CH+
0xFF22DD,0xFF02FD,0xFFC23D,//PREV NEXT PLAY
0xFFE01F,0xFFA857,0xFF906F,//VOL- VOL+ EQ
0xFF6897,0xFF9867,0xFFB04F,// 0 100+ 200+
0xFF30CF,0xFF18E7,0xFF7A85,// 1 2 3
0xFF10EF,0xFF38C7,0xFF5AA5,// 4 5 6
0xFF42BD,0xFF4AB5,0xFF52AD, // 7 8 9
0xFFFFFFFF//長按
};
//Car mp3對應的字符串
String rremote_string[MAX] = {
"CH-","CH","CH+",
"PREV","NEXT","PLAY/PAUSE",
"VOL-","VOL+","EQ",
"0","100+","200+",
"1","2","3",
"4","5","6",
"7","8","9",
"longPress"
};
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); //初始化紅外遙控
}
void loop() {
if (irrecv.decode(&results)) {
//打印字符串
String codeString = getRremoteString(results.value);
if(codeString.length()!=0)
Serial.println(codeString);
irrecv.resume(); // 接收下一個值
}
}
/**
* 解析紅外編碼並返回對應的字符串
*/
String getRremoteString(unsigned long code){
String rremotestring = "";
int i = 0;
for(i = 0;i<MAX-1;i++){
if(code == rremote_code){
break;
}
}
//過濾掉長按
if(i==MAX-1) return "";
else return rremote_string;
}
實驗結果:
4.總結
通過使用這個類庫 我們可以解析到具體的鍵碼,這樣我們就可以基於這個去做一些我們想做的紅外遙控功能(各位可以看看我寫的藍牙七彩燈帖子)。