我們家里的空調、電視等,它們的遙控器都是通過紅外信號來控制的。 其實,我們可以自己用紅外發射模塊來做一個遙控器。
關于紅外的知識,大家可以參考我之前的文章,這里就不再贅述了。
要自己實現紅外遙控器的功能,思路其實很簡單,首先,我們需要知道原來遙控器發射的信號是怎么樣的,然后我們只要用紅外發射模塊發射一個一模一樣的信號就行了。
實驗器材準備:
紅外接收模塊、紅外發射模塊、邏輯分析儀。
一、獲取遙控器的波形
我們使用紅外接收模塊,連上邏輯分析儀,然后使用空調遙控器對著紅外接收模塊發射信號,這時邏輯分析儀就采集到了紅外信號。 這一部分不需要什么代碼。
這是我用邏輯分析儀采集到格力空調按下“打開”按鈕時的波形。
分析一下波形,可以知道,先是有一段約9ms的低電平,然后是4.5ms的高電平,再是一段0 1構成的序列,中間是20.5ms的高電平,再經過一段序列結束。
那些序列就是真正的信號,里面有控制空調的相關信息,當然,不同的空調肯定是不一樣的,這是廠家定義的。
二、用單片機產生紅外信號
知道了遙控器發射的波形,我們不需要去理解它是什么含義,只要照著來發射一段相同的波形,就能實現功能。
這里就是要稍微注意一下紅外信號的特點,這在我之前的文章里有詳細講過,這里再說一下:
對于紅外信號來說,當你發射一段脈沖時(脈沖頻率通常是38khz),紅外接收端收到的是低電平,否則,收到的是高電平。
也就是說,你如果希望接收端收到的是低電平,你不是要發射低電平,而是發射一段脈沖。 比如上面最開始是9ms的低電平,那么你需要發射一段持續9ms的脈沖。
還有就是邏輯0是一段低電平加上一段不長的高電平,邏輯1是一段低電平加上一段較長的高電平。 在這里,0是0.62ms低電平+0.56ms高電平,1是0.65ms低電平+1.7ms高電平。
首先我們把上面的序列保存在數組里面,因為中間有一段較長的高電平時間,所以把它分成兩段來保存。
char open_1[]={1,0,0,1,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,1,0,0};
char open_2[]={1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1};
char close_1[]={1,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,1,0,0};
char close_2[]={1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0};
然后我們把發送邏輯1或者邏輯0封裝成函數
//發送紅外格式的1或者0。1:0.65ms高電平+1.67ms低電平 0:0.56ms低電平+0.55ms高電平
void sendData(int n)
{
if(n==0)
{
endcount=t(650-100); //理論計算與實際有偏差,需要進行一定的修正
flag=1; //表示需要發送低電平,體現為一段脈沖
count=0;
while(count
把發送一段長時間的高電平或者低電平封裝成函數
//發送普通的電平,電平1或者電平0,第二個參數是由上面的宏定義得到
void sendUsrLevel(int level,int t)
{
endcount=t;
count=0;
if(level==0)
{
flag=1;
}
else{
flag=0;
}
while(count
最后調用上面的函數把控制空調的信號發射出去
//控制空調的開或者關,0:關閉空調,1:開啟空調
void ControlAirConditioner(int cmd)
{
char len=0;
sendUsrLevel(0,t(9000-600)); //理論計算與實際有偏差,需要進行一定的修正
sendUsrLevel(1,t(4500-350));
if(cmd==0) //關閉空調
{
len=sizeof(open_1)/sizeof(open_1[0]);
for(int i=0;i
在main函數中進行調用,通過按鍵來控制空調的開或者關
int main()
{
u8 i,ret=0;
count = 0;
flag = 0;
OP = 0;
IR_OUT = 1;
SysTick_Init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中斷優先級分組 分2組
LED_Init();
KEY_Init();
TIM4_Init(13,72-1); //定時13us
while(1)
{
i++;
if(i%20==0)
{
led1=!led1;
}
// delay_ms(1000);
ret=KEY_Scan(0);
if(ret==KEY_LEFT)
{
ControlAirConditioner(1); //開空調
// sendUsrLevel(0,t(9000));
// sendUsrLevel(1,t(4500));
}
if(ret==KEY_RIGHT)
{
ControlAirConditioner(0); //關空調
}
}
}
經過實際測試,確實可以控制我們的空調。
總的來說,思路比較簡單,就是捕獲遙控器的信號,這個作為標準信號,然后使用紅外發射模塊發射一個和他一樣的信號,另外就是這個需要使用邏輯分析儀去好好分析你實際產生的波形和標準波形的偏差,理論計算與實際難免有誤差。
-
單片機
+關注
關注
6042文章
44617瀏覽量
637485 -
模塊
+關注
關注
7文章
2730瀏覽量
47656 -
空調
+關注
關注
11文章
1235瀏覽量
58659 -
信號
+關注
關注
11文章
2804瀏覽量
77003 -
遙控器
+關注
關注
18文章
840瀏覽量
66434
發布評論請先 登錄
相關推薦
評論