有請(qǐng)本章的主角們:玩具小風(fēng)扇、紅外接收器和一個(gè)紅外遙控器(空調(diào)、電視遙控都行)。本章我們的目標(biāo)是實(shí)現(xiàn)用遙控器控制風(fēng)扇。
紅外協(xié)議
我們知道,人的眼睛能看到的可見光按波長從長到短排列,依次為紅、橙、黃、綠、青、藍(lán)、紫。其中紅光的波長范圍為0.62~0.76μm;紫光的波長范圍為0.38~0.46μm,比紫光波長還短的光叫紫外線,比紅光波長還長的光叫紅外線,紅外是一種人的眼眼看不到的光線,利用紅外波來傳遞信息,傳遞的規(guī)則就成為紅外協(xié)議。紅外線的波長較短,對(duì)障礙物的衍射能力差,所以更適合應(yīng)用在需要短距離無線通信場(chǎng)合點(diǎn)對(duì)點(diǎn)的直接線數(shù)據(jù)傳輸。為了使各種設(shè)備能夠通過一個(gè)紅外接口進(jìn)行通信,紅外數(shù)據(jù)協(xié)議(InfraredDataAssociation,簡稱IRDA)發(fā)布了一個(gè)關(guān)于紅外的統(tǒng)一的軟硬件規(guī)范,也就是紅外數(shù)據(jù)通訊標(biāo)準(zhǔn)。
紅外通信是利用950nm近紅外波段的紅外線作為傳遞信息的媒體,即通信信道。發(fā)送端采用脈時(shí)調(diào)制(PPM)方式,將二進(jìn)制數(shù)字信號(hào)調(diào)制成某一頻率的脈沖序列,并驅(qū)動(dòng)紅外發(fā)射管以光脈沖的形式發(fā)送出去;接收端將接收到的光脈轉(zhuǎn)換成電信號(hào),再經(jīng)過放大、濾波等處理后送給解調(diào)電路進(jìn)行解調(diào),還原為二進(jìn)制數(shù)字信號(hào)后輸出。
簡而言之,紅外通信的實(shí)質(zhì)就是對(duì)二進(jìn)制數(shù)字信號(hào)進(jìn)行調(diào)制與解調(diào),以便利用紅外信道進(jìn)行傳輸;紅外通信接口就是針對(duì)紅外信道的調(diào)制解調(diào)器。

紅外信號(hào)錄制
利用紅外接收設(shè)備可以接收到紅外波的信號(hào),紅外接收器接收到紅外線光波,經(jīng)過解調(diào)電路轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)。把接收的到數(shù)據(jù)記錄存儲(chǔ)下來的過程叫做錄制。利用 Ruff 套件中的紅外接收器錄制空調(diào)遙控器的信號(hào),存儲(chǔ)下來,然后使用紅外發(fā)射器發(fā)生出去,你就可以實(shí)現(xiàn) Ruff 來控制空調(diào)了,想想是不是很有趣?還有更有趣的,Ruff 連接網(wǎng)絡(luò),你就可以遠(yuǎn)程操控你們家空調(diào)。你還可以利用溫度傳感器寫一個(gè)程序根據(jù)溫度范圍自動(dòng)調(diào)節(jié)你們家空調(diào)。
控制風(fēng)扇
說了原理,開始實(shí)踐吧!
在上一章《我的第一個(gè)物聯(lián)網(wǎng)應(yīng)用3》 中,我們知道怎么使用繼電器控制風(fēng)扇了,這一章很簡單,在上一章的基礎(chǔ)上,我們結(jié)合紅外設(shè)備,使用紅外設(shè)備控制繼電器來控制風(fēng)扇。說了一堆的紅外原理,其實(shí)我們這里利用的很簡單,我們只要接收到紅外信號(hào)即可,不需去解讀信號(hào)的意義,收到信號(hào)時(shí)如果繼電器關(guān)閉狀態(tài)就打開,反之就關(guān)閉。
-
添加紅外接收器
rap device add irr
我們把設(shè)備 ID 定為 "irr", 添加成功以后我們?nèi)?Ruff 官網(wǎng)軟件倉庫中查看下紅外接收器的驅(qū)動(dòng)提供了什么方法。
$('#<device-id>').on('data', function(data) {
console.log('received data', data);
});
只有一個(gè)方法:監(jiān)聽數(shù)據(jù),我們所以我們寫一個(gè)監(jiān)聽數(shù)據(jù)的方法:
$('#irr').on('data', function(data) {
console.log('received data', data);
//控制繼電器
controlRelay();
});
再寫一個(gè)控制控制繼電器的方法:
var relayOpen = false;
function controlRelay(){
relayOpen = !relayOpen;
if (relayOpen) {
$('#relay').turnOn(function () {
// 打開繼電器成功的回調(diào)函數(shù)
console.log('turn on');
});
} else {
$('#relay').turnOff(function () {
// 關(guān)閉繼電器成功的回調(diào)函數(shù)
console.log('turn off');
});
}
}
完整代碼:index.js
var relayOpen = false;
function controlRelay(){
relayOpen = !relayOpen;
if (relayOpen) {
$('#relay').turnOn(function () {
// 打開繼電器成功的回調(diào)函數(shù)
console.log('turn on');
});
} else {
$('#relay').turnOff(function () {
// 關(guān)閉繼電器成功的回調(diào)函數(shù)
console.log('turn off');
});
}
}
$.ready(function (error) {
if (error) {
console.log(error);
return;
}
$('#irr').on('data',function(data) {
//控制繼電器
controlRelay();
});
});
$.end(function () {
$('#relay').turnOff(function () {
console.log('turn off');
});
});
部署看看吧,也許你的風(fēng)扇噪音會(huì)對(duì)紅外信號(hào)造成干擾,一旦干擾你的紅外接收器就會(huì)不斷接收到信號(hào)(實(shí)際是風(fēng)扇噪音信號(hào)),如果出現(xiàn)這種情況,建議你把風(fēng)扇和紅外接收器的距離離遠(yuǎn)一些。