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