本篇博文我們要手寫代碼做一款人體感應(yīng)燈深纲。要求:當(dāng)有人經(jīng)過的時候,LED燈就會自動亮起劲妙,人一旦走開湃鹊,LED自動關(guān)閉了。這里用到的傳感器是人體紅外熱釋電運(yùn)動傳感器镣奋,它是一種能檢測人或動物身體發(fā)射的紅外線而輸出電信號的傳感器币呵。
1、傳感器原理
早在1938年侨颈,有人提出過利用熱釋電效應(yīng)探測紅外輻射余赢,但并未受到重視,直到六十年代哈垢,隨著激光没佑、紅外技術(shù)的迅速發(fā)展,才又推動了對熱釋電效應(yīng)的研究和對熱釋電晶體的應(yīng)用温赔。熱釋電晶體已廣泛用于紅外光譜儀、紅外遙感以及熱輻射探測器鬼癣,它可以作為紅外激光的一種較理想的探測器陶贼。它目標(biāo)正在被廣泛的應(yīng)用到各種自動化控制裝置中。
熱釋電效應(yīng)同壓電效應(yīng)類似待秃,是指由于溫度的變化而引起晶體表面荷電的現(xiàn)象拜秧。熱釋電傳感器是對溫度敏感的傳感器。它由陶瓷氧化物或壓電晶體元件組成章郁,在元件兩個表面做成電極枉氮,在傳感器監(jiān)測范圍內(nèi)溫度有ΔT的變化時志衍,熱釋電效應(yīng)會在兩個電極上會產(chǎn)生電荷ΔQ,即在兩電極之間產(chǎn)生一微弱的電壓ΔV聊替。由于它的輸出阻抗極高楼肪,在傳感器中有一個場效應(yīng)管進(jìn)行阻抗變換。熱釋電效應(yīng)所產(chǎn)生的電荷ΔQ會被空氣中的離子所結(jié)合而消失惹悄,即當(dāng)環(huán)境溫度穩(wěn)定不變時春叫,ΔT=0,則傳感器無輸出泣港。當(dāng)人體進(jìn)入檢測區(qū)暂殖,因人體溫度與環(huán)境溫度有差別,產(chǎn)生ΔT当纱,則有ΔT輸出呛每;若人體進(jìn)入檢測區(qū)后不動,則溫度沒有變化坡氯,傳感器也沒有輸出了晨横。所以這種傳感器檢測人體或者動物的活動傳感。
由實(shí)驗(yàn)證明廉沮,傳感器不加光學(xué)透鏡(也稱菲涅爾透鏡)颓遏,其檢測距離小于2米,而加上光學(xué)透鏡后滞时,其檢測距離可大于7米叁幢。
2、代碼實(shí)踐
整個裝置分為三個部分坪稽,輸入曼玩,控制與輸出。人體紅外熱釋電運(yùn)動傳感器為輸入設(shè)備窒百,Arduino就是控制設(shè)備黍判,LED發(fā)光模塊就是輸出設(shè)備。
由于人體紅外熱釋電運(yùn)動傳感器為數(shù)字量的傳感器篙梢,所以接數(shù)字口顷帖。LED輸出信號也是數(shù)字量,同樣接數(shù)字口渤滞。
傳感器連線效果如下所示:
實(shí)現(xiàn)代碼如下所示:
const int sensorPin = 2;
? const int ledPin =? 13;
? void setup() {
? ? pinMode(ledPin, OUTPUT);
? ? pinMode(sensorPin, INPUT);
? }
? void loop()
? {
? ? if (digitalRead(sensorPin) == HIGH)
? ? {
? ? ? digitalWrite(ledPin, HIGH);
? ? }
? ? else {
? ? ? digitalWrite(ledPin, LOW);
? ? }
? }
程序開始在setup()中通過pinMode()函數(shù)將LED設(shè)置為輸出模式贬墩,人體紅外熱釋電運(yùn)動傳感器設(shè)置為輸入模式。
有了輸入設(shè)備妄呕,我要讀取輸入設(shè)備的值陶舞,才能進(jìn)行之后的判斷,所以loop函數(shù)一開始就是讀取人體紅外熱釋電運(yùn)動傳感器的值绪励。
讀取數(shù)字傳感器狀態(tài)的函數(shù)是:digitalRead()肿孵,函數(shù)格式如下所示:
digitalRead(pin)
這個函數(shù)是用來讀取數(shù)字引腳狀態(tài)唠粥,高電平還是低電平。人體紅外熱釋電傳感器有人或者動物走動時停做,讀到高電平晤愧,否則讀到低電平。代碼的后半段就是對判斷出來的值來執(zhí)行相應(yīng)動作雅宾。(HIGH:高電平养涮,代表1,LOW:低電平眉抬,代表0) 贯吓。
數(shù)字傳感器只會讀到兩個值(HIGH和LOW)。
這里要用到新的一個語句:if語句蜀变,使用格式如下所示:
(1)
if(表達(dá)式){
語句;
}
(2)
if(表達(dá)式){
語句;
}else{語句;}
(3)
if(表達(dá)式){
語句;
}else if(表達(dá)式){語句;}
...
else{語句;}
表達(dá)式是指我們的判斷條件悄谐,通常為一些關(guān)系式或邏輯式,也可是直接表示某—數(shù)值库北。如果if表達(dá)式條件為真爬舰,則執(zhí)行if中的語句。表達(dá)式條件為假寒瓦,則跳出if語句情屹。
程序中“==”是比較運(yùn)算符,用于判斷兩個數(shù)值是否相等杂腰,記得是“雙等號”而“=”是賦值運(yùn)算符垃你,把等號右邊的值賦給左邊。常用運(yùn)算符如下所示:
==(等于)
!=(不等于)
<(小于)
>(大于)
<=(小于等于)
>=(大于等于)
特別說明下喂很,小于等于和大于等于惜颇,<和=之間不能留有空格,否則編譯不通過少辣。
當(dāng)然凌摄,除了比較運(yùn)算符外,程序也可以用的+漓帅、一锨亏、*、/(加忙干、減屯伞、乘、除)這些常用的算術(shù)運(yùn)算符豪直。
拓展學(xué)習(xí):和12歲小同志搞創(chuàng)客開發(fā):如何驅(qū)動各類型傳感器?