我們家里的空調(diào)、電視等,它們的遙控器都是通過紅外信號來控制的。 其實,我們可以自己用紅外發(fā)射模塊來做一個遙控器。
關(guān)于紅外的知識,大家可以參考我之前的文章,這里就不再贅述了。
要自己實現(xiàn)紅外遙控器的功能,思路其實很簡單,首先,我們需要知道原來遙控器發(fā)射的信號是怎么樣的,然后我們只要用紅外發(fā)射模塊發(fā)射一個一模一樣的信號就行了。
實驗器材準備:
紅外接收模塊、紅外發(fā)射模塊、邏輯分析儀。
一、獲取遙控器的波形
我們使用紅外接收模塊,連上邏輯分析儀,然后使用空調(diào)遙控器對著紅外接收模塊發(fā)射信號,這時邏輯分析儀就采集到了紅外信號。 這一部分不需要什么代碼。
這是我用邏輯分析儀采集到格力空調(diào)按下“打開”按鈕時的波形。
分析一下波形,可以知道,先是有一段約9ms的低電平,然后是4.5ms的高電平,再是一段0 1構(gòu)成的序列,中間是20.5ms的高電平,再經(jīng)過一段序列結(jié)束。
那些序列就是真正的信號,里面有控制空調(diào)的相關(guān)信息,當然,不同的空調(diào)肯定是不一樣的,這是廠家定義的。
二、用單片機產(chǎn)生紅外信號
知道了遙控器發(fā)射的波形,我們不需要去理解它是什么含義,只要照著來發(fā)射一段相同的波形,就能實現(xiàn)功能。
這里就是要稍微注意一下紅外信號的特點,這在我之前的文章里有詳細講過,這里再說一下:
對于紅外信號來說,當你發(fā)射一段脈沖時(脈沖頻率通常是38khz),紅外接收端收到的是低電平,否則,收到的是高電平。
也就是說,你如果希望接收端收到的是低電平,你不是要發(fā)射低電平,而是發(fā)射一段脈沖。 比如上面最開始是9ms的低電平,那么你需要發(fā)射一段持續(xù)9ms的脈沖。
還有就是邏輯0是一段低電平加上一段不長的高電平,邏輯1是一段低電平加上一段較長的高電平。 在這里,0是0.62ms低電平+0.56ms高電平,1是0.65ms低電平+1.7ms高電平。
首先我們把上面的序列保存在數(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); //理論計算與實際有偏差,需要進行一定的修正
flag=1; //表示需要發(fā)送低電平,體現(xiàn)為一段脈沖
count=0;
while(count
把發(fā)送一段長時間的高電平或者低電平封裝成函數(shù)
//發(fā)送普通的電平,電平1或者電平0,第二個參數(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)的信號發(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)); //理論計算與實際有偏差,需要進行一定的修正
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ù)中進行調(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)先級分組 分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); //開空調(diào)
// sendUsrLevel(0,t(9000));
// sendUsrLevel(1,t(4500));
}
if(ret==KEY_RIGHT)
{
ControlAirConditioner(0); //關(guān)空調(diào)
}
}
}
經(jīng)過實際測試,確實可以控制我們的空調(diào)。
總的來說,思路比較簡單,就是捕獲遙控器的信號,這個作為標準信號,然后使用紅外發(fā)射模塊發(fā)射一個和他一樣的信號,另外就是這個需要使用邏輯分析儀去好好分析你實際產(chǎn)生的波形和標準波形的偏差,理論計算與實際難免有誤差。
-
單片機
+關(guān)注
關(guān)注
6036文章
44557瀏覽量
635140 -
模塊
+關(guān)注
關(guān)注
7文章
2705瀏覽量
47464 -
空調(diào)
+關(guān)注
關(guān)注
11文章
1228瀏覽量
58583 -
信號
+關(guān)注
關(guān)注
11文章
2791瀏覽量
76754 -
遙控器
+關(guān)注
關(guān)注
18文章
837瀏覽量
66108
發(fā)布評論請先 登錄
相關(guān)推薦
評論