和12岁小同志搞创客开发:手撕代码,做一款人体感应灯
目錄
1、傳感器原理
2、代碼實(shí)踐
機(jī)緣巧合在網(wǎng)上認(rèn)識(shí)一位12歲小同志,從零開始系統(tǒng)輔導(dǎo)其創(chuàng)客開發(fā)思維和技巧。
項(xiàng)目專欄:https://blog.csdn.net/m0_38106923/category_11097422.html?
本篇博文我們要手寫代碼做一款人體感應(yīng)燈。要求:當(dāng)有人經(jīng)過(guò)的時(shí)候,LED燈就會(huì)自動(dòng)亮起,人一旦走開,LED自動(dòng)關(guān)閉了。這里用到的傳感器是人體紅外熱釋電運(yùn)動(dòng)傳感器,它是一種能檢測(cè)人或動(dòng)物身體發(fā)射的紅外線而輸出電信號(hào)的傳感器。
1、傳感器原理
早在1938年,有人提出過(guò)利用熱釋電效應(yīng)探測(cè)紅外輻射,但并未受到重視,直到六十年代,隨著激光、紅外技術(shù)的迅速發(fā)展,才又推動(dòng)了對(duì)熱釋電效應(yīng)的研究和對(duì)熱釋電晶體的應(yīng)用。熱釋電晶體已廣泛用于紅外光譜儀、紅外遙感以及熱輻射探測(cè)器,它可以作為紅外激光的一種較理想的探測(cè)器。它目標(biāo)正在被廣泛的應(yīng)用到各種自動(dòng)化控制裝置中。
熱釋電效應(yīng)同壓電效應(yīng)類似,是指由于溫度的變化而引起晶體表面荷電的現(xiàn)象。熱釋電傳感器是對(duì)溫度敏感的傳感器。它由陶瓷氧化物或壓電晶體元件組成,在元件兩個(gè)表面做成電極,在傳感器監(jiān)測(cè)范圍內(nèi)溫度有ΔT的變化時(shí),熱釋電效應(yīng)會(huì)在兩個(gè)電極上會(huì)產(chǎn)生電荷ΔQ,即在兩電極之間產(chǎn)生一微弱的電壓ΔV。由于它的輸出阻抗極高,在傳感器中有一個(gè)場(chǎng)效應(yīng)管進(jìn)行阻抗變換。熱釋電效應(yīng)所產(chǎn)生的電荷ΔQ會(huì)被空氣中的離子所結(jié)合而消失,即當(dāng)環(huán)境溫度穩(wěn)定不變時(shí),ΔT=0,則傳感器無(wú)輸出。當(dāng)人體進(jìn)入檢測(cè)區(qū),因人體溫度與環(huán)境溫度有差別,產(chǎn)生ΔT,則有ΔT輸出;若人體進(jìn)入檢測(cè)區(qū)后不動(dòng),則溫度沒(méi)有變化,傳感器也沒(méi)有輸出了。所以這種傳感器檢測(cè)人體或者動(dòng)物的活動(dòng)傳感。
由實(shí)驗(yàn)證明,傳感器不加光學(xué)透鏡(也稱菲涅爾透鏡),其檢測(cè)距離小于2米,而加上光學(xué)透鏡后,其檢測(cè)距離可大于7米。
2、代碼實(shí)踐
整個(gè)裝置分為三個(gè)部分,輸入,控制與輸出。人體紅外熱釋電運(yùn)動(dòng)傳感器為輸入設(shè)備,Arduino就是控制設(shè)備,LED發(fā)光模塊就是輸出設(shè)備。
由于人體紅外熱釋電運(yùn)動(dòng)傳感器為數(shù)字量的傳感器,所以接數(shù)字口。LED輸出信號(hào)也是數(shù)字量,同樣接數(shù)字口。
傳感器連線效果如下所示:
實(shí)現(xiàn)代碼如下所示:
int sensorPin = 2; //傳感器連接到數(shù)字2
int ledPin = 13; //LED連接到數(shù)字13
int sensorState = 0; //變量sensorState用于存儲(chǔ)傳感器狀態(tài)void setup() {pinMode(ledPin, OUTPUT); //LED為輸出設(shè)備pinMode(sensorPin, INPUT); //傳感器為輸入設(shè)備
}void loop(){sensorState = digitalRead(sensorPin); //讀取傳感器的值if (sensorState == HIGH) { //如果為高,LED亮digitalWrite(ledPin, HIGH); } else { //否則,LED滅digitalWrite(ledPin, LOW); }
}
程序開始在setup()中通過(guò)pinMode()函數(shù)將LED設(shè)置為輸出模式,人體紅外熱釋電運(yùn)動(dòng)傳感器設(shè)置為輸入模式。
有了輸入設(shè)備,我要讀取輸入設(shè)備的值,才能進(jìn)行之后的判斷,所以loop函數(shù)一開始就是讀取人體紅外熱釋電運(yùn)動(dòng)傳感器的值。
讀取數(shù)字傳感器狀態(tài)的函數(shù)是:digitalRead(),函數(shù)格式如下所示:
digitalRead(pin)
這個(gè)函數(shù)是用來(lái)讀取數(shù)字引腳狀態(tài),高電平還是低電平。人體紅外熱釋電傳感器有人或者動(dòng)物走動(dòng)時(shí),讀到高電平,否則讀到低電平。代碼的后半段就是對(duì)判斷出來(lái)的值來(lái)執(zhí)行相應(yīng)動(dòng)作。(HIGH:高電平,代表1,LOW:低電平,代表0) 。
數(shù)字傳感器只會(huì)讀到兩個(gè)值(HIGH和LOW)。
這里要用到新的一個(gè)語(yǔ)句:if語(yǔ)句,使用格式如下所示:
(1)
if(表達(dá)式){
語(yǔ)句;
}
(2)
if(表達(dá)式){
語(yǔ)句;
}else{語(yǔ)句;}
(3)
if(表達(dá)式){
語(yǔ)句;
}else if(表達(dá)式){語(yǔ)句;}
...
else{語(yǔ)句;}
表達(dá)式是指我們的判斷條件,通常為一些關(guān)系式或邏輯式,也可是直接表示某—數(shù)值。如果if表達(dá)式條件為真,則執(zhí)行if中的語(yǔ)句。表達(dá)式條件為假,則跳出if語(yǔ)句。
程序中“==”是比較運(yùn)算符,用于判斷兩個(gè)數(shù)值是否相等,記得是“雙等號(hào)”而“=”是賦值運(yùn)算符,把等號(hào)右邊的值賦給左邊。常用運(yùn)算符如下所示:
- ==(等于)
- !=(不等于)
- <(小于)
- >(大于)
- <=(小于等于)
- >=(大于等于)
特別說(shuō)明下,小于等于和大于等于,<和=之間不能留有空格,否則編譯不通過(guò)。
當(dāng)然,除了比較運(yùn)算符外,程序也可以用的+、一、*、/(加、減、乘、除)這些常用的算術(shù)運(yùn)算符。
拓展學(xué)習(xí):和12歲小同志搞創(chuàng)客開發(fā):如何驅(qū)動(dòng)各類型傳感器?
總結(jié)
以上是生活随笔為你收集整理的和12岁小同志搞创客开发:手撕代码,做一款人体感应灯的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 和12岁小同志搞创客开发:手撕代码,点亮
- 下一篇: 和12岁小同志搞创客开发:手撕代码,做一