基於arduino的紅外傳感系統


一、作品背景
在這個科技飛速發展的時代,物聯網已經成為了我們身邊必不可少的技術模塊,我這次課程設計做的是一個基於arduino+樹莓派+OneNet的紅外報警系統,它主要通過識別人或者動物的運動來判斷是否有人在附近再通過蜂鳴器的響叫來實現報警功能。
紅外報警系統在生活中的應用也很廣泛,例如博物館的展品,家里的安防系統,公司的安防系統等,但是如何准確的報警,保證紅外線的正確識別是這個系統的主要問題,本次的實踐綜合這些因素提出了比較靠譜的解決方案,用智能網關解決這一系列的問題。

二、元件原理
熱釋電紅外傳感器的主要材料,是鉭酸鋰(LiTao3)、硫酸三甘酞(LATGS)和鈦鋯酸鉛(PZT)。它是在鈦酸鋇一類壓電晶體上,上下表面設有電極,並在表面加有黑色膜。當有紅外線間歇地照射時,其表面溫度上升,使晶體內部的原子排列產生變化,即引起自發極化電荷。稱此現象為熱釋電效應,為熱電效應之一種。熱釋電效應產生的表面電荷是暫時的,只要它出現,便很快被空氣中的各離子所中和。為此,用熱釋電效應制作紅外傳感器時,多是在它的元件前面加有機械式的周期遮光裝置,以便使自發極化電荷周期性地出現,只有檢測移動物體時不用。由於熱釋傳感器的輸出阻抗很大,輸出電壓信號又極微弱,故在傳感器內部附加一只場效應管與一個薄膜電阻Rg,使其阻抗進行變換。Rs為負載電阻,有的熱釋傳感器無Rs,需外接。為實現不同的檢測目的,在進入紅外線的窗口上設有濾光鏡,將不需要的光譜濾掉。
作為人體檢測的熱釋紅外傳感器,多是用雙元件組成。雙元件的特點一是當入射的能量順序地射到兩個元件時,由於兩只元件為串聯,其輸出比一只元件高一倍;另是由於兩只元件為逆向相連接,對於相同且同時輸入的能量將相互抵消,如太陽光中的紅外線干擾和環境溫度變化所引起的誤差等。防止外人人侵的熱釋電紅外傳感器應用電路,如當有人進入欲保護的視野范圍內時,傳感器即產生一交流感應電壓,其頻率與人體移動速度有關,通常在5~6Hz左右。它可控制10~12m的移動人體,其視野約70度 。
蜂鳴器的發聲原理由振動裝置和諧振裝置組成,而蜂鳴器又分為無源他激型與有源自激型。
無源他激型蜂鳴器的工作發聲原理是:方波信號輸入諧振裝置轉換為聲音信號輸出。
有源自激型蜂鳴器的工作發聲原理是:直流電源輸入經過振盪系統的放大取樣電路在諧振裝置作用下產生聲音信號。

三、解決方案
在前面我們了解到紅外線報警系統要想成功就得讓他對正確的事情進行報警和反饋,那么我就依據這個給定一個合理的解決方案。
因為我們這個系統主要是用於防范錯誤的人對自己的財產造成威脅,那么我們的紅外線報警器的報警模式就是基於是否有人靠近來報警,因為紅外報警器分為主動式和被動式兩種。主動式紅外報警器,是報警器主動發出紅外線報警器,是報警器主動發出紅外線,紅外線碰到障礙物,就會反彈回來,被報警器探頭接受如果探頭監測到,紅外線是靜止不動的,也就是不斷發出紅外線又不斷反彈的,那么報警器就不會報警。當有會動的物體觸犯了這根看不到的紅線的時候,探頭就會監測到異樣,就會報警。
在家中沒有人的情況下,我們選擇了被動式的報警模式,也就是監測是否在無人的情況下有人靠近你所需要保護的對象,這樣就可以有效的報警並且確保報警的准確性。

四、紅外報警系統原理構架
在我看來紅外線報警系統分為三個部分:arduino+樹莓派;樹莓派+OneNet;arduino+樹莓派+OneNet;
1、arduino+樹莓派
我們要想把arduino和樹莓派相連我們就得知道它們是靠什么通信的,前面說過arduino和樹莓派的連接方式有兩種USB和GPIO引腳,我們主要用的是USB連接,結構是示意圖如下圖所示:

2、樹莓派+OneNet
第二步就是把樹莓派和OneNet連接在一起,樹莓派相當於一個Linux的系統,在這個系統上代有python的IDE環境(當然你也可以用c#或者java,這里我們主要說python),我們需要在編寫一個python的函數來連接雲和樹莓派,在OneNet的眾多協議中,我采用了http協議,雖然這個協議不如其他協議功能那么多,但是對於初學着來說卻是很友好,使用http的全局推送連接OneNet連接示意圖,如下所示:

3、arduino+樹莓派+OneNet
最后就是需要把三個東西都連接起來,要想把arduino的數據傳輸到OneNet上就是把arduino的串口狀態發送到OneNet上,我們已經知道了樹莓派是如何收到串口,我們現在需要把這個數據打包發送給OneNet,接下來我們通過這要的原理來完成我們紅外線系統的結構示意圖:


如上圖所示這是三個模塊的設備連接圖,但是它們的原理是紅外線采集到信息后發送狀態給arduino,狀態正確蜂鳴器發出聲音,arduino再把接收到的狀態通過串口發送給樹莓派,樹莓派接收到消息后,把其用字符串的形式發送給OneNet,原理圖如下所示:

五、實驗設計
1、Arduino模塊設計
Arduino模塊相比較與其他模塊來說不必要考慮連接問題,我們只需要把代碼燒入到Aduino中就可以了,因為燒入到arduino的代碼在其通電后可以自己運行,我們只需要讓它發送串口方便以后讀取數據就行。
代碼如下:
int PIR_sensor = A5;
int Buzzerpin = 3;
int val = 100;
void Alarm() //蜂鳴器警報
{
for(int i=0;i<100;i++){
digitalWrite(Buzzerpin,HIGH); //發聲
delay(2);
digitalWrite(Buzzerpin,LOW); //不發聲
delay(2);
//修改延時時間,改變發聲頻率
}
}
void setup(){
pinMode(PIR_sensor,INPUT); //設置人體紅外接口為輸入狀態
pinMode(Buzzerpin,OUTPUT); //設置蜂鳴器接口為輸出狀態
Serial.begin(9600);
}
void loop(){
int val=digitalRead(PIR_sensor); //定義參數存儲人體紅外傳感器讀到的狀態
//Serial.print("someone is coming:");
if(val==1)
val=101;
else
val=100;
Serial.println(val);
delay(500);
if(val == 101) //如果檢測到運動,發出警報
{
Alarm();
}
else {
return;
}
delay(100);
}

2、樹莓派模塊設計
對於樹莓派模塊的設計,我們需要了解到樹莓派靠什么讀取到arduino發送的信息,我們這里了解到一個pyserial庫和一個serial.red()函數,其中Serial庫是一個串口通信專用的模塊,它可以讀取串口中的信息並打印,串口通信是指外設和計算機間,通過數據信號線 、地線、控制線等,按位進行傳輸數據的一種通訊方式。這種通信方式使用的數據線少,在遠距離通信中可以節約通信成本,但其傳輸速度比並行傳輸低。串口是計算機上一種非常通用的設備通信協議。pyserial模塊封裝了python對串口的訪問,為多平台的使用提供了統一的接口。其中serial.red()是讀取這個串口信息的函數。
樹莓派代如下:

python代碼如下(連接OneNET):

import datetime
import json
import time
import requests
import serial

APIKEY = 'IvjydOIULd13LSCsO4By069pt=Y='
apiurl = 'http://api.heclouds.com/devices/579157258/datapoints'
apiheaders = {'api-key': APIKEY, 'Content-Length': '120'}
def get_input():
port="COM3"
serialFromArduino=serial.Serial(port,9600,timeout=1)
serialFromArduino.flushInput()
while True:
if (serialFromArduino.inWaiting() > 0):
input = serialFromArduino.read(1)
print((input).decode('UTF-8'))
return input

def http_put():
Infrared = int(get_input())
#temperature = get_input()
#temperature = random.randint(60,100)
CurTime = datetime.datetime.now()
payload = {'datastreams': [{"id": "girlA", "datapoints": [{"at": CurTime.isoformat(), "value":Infrared}]}]}
# payload = {"datastreams": [{"id": "girlA", "datapoints": [{"value": 11}]}]}
print("當前時間為: %s" % CurTime.isoformat())
print("上傳值為: %.3f" % Infrared)

jdata = json.dumps(payload)  # 對數據進行JSON格式化編碼
# 打印json內容
print(jdata)
r = requests.post(apiurl, headers=apiheaders, data=json.dumps(payload))
return r

while True:
time.sleep(2)
resp = http_put()
print("OneNET請求結果:\n %s" % resp)

3、OneNET模塊
在這個模塊中我們需要知道,樹莓派和onenet是如何相連的,查閱開發者文檔,我用http全局推送,把樹莓派從arduino中得到的串口數據發送到OneNet上,既然要讀串口,發送消息,那么我們就得先定義庫函數,在OneNet中把消息發送得用requests,打印則用json。頭文件定義如下圖所示:

Requests是用Python語言編寫的,基urllib3來改寫的,采用Apache2 Licensed 來源協議的HTTP庫,它比urllib更加方便,可以節約我們大量的工作,完全滿足HTTP測試需求,一句話---Python實現的簡單易用的HTTP庫。
在百度詞條中,JSON(JavaScript Object Notation, JS 對象簡譜) 是一種輕量級的數據交換格式。它基於 ECMAScript (歐洲計算機協會制定的js規范)的一個子集,采用完全獨立於編程語言的文本格式來存儲和表示數據。簡潔和清晰的層次結構使得 JSON 成為理想的數據交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提升網絡傳輸效率。實際上 json的格式和 python中的字典很像,也是由鍵值對組成,但是 python中的值可以為任何對象(列表、字典、字符串、數字等等),而 json中的值只能是數組(列表)、字典、字符串、數組、布爾值中的一中或幾種。
平台以HTTP POST請求形式向第三方平台URL地址推送數據,第三方平台接收到數據后需要返回 HTTP 200,否則OneNET會認為此次推送無效並重試,json庫一共有三個方法,分別是 dump、dumps、load、loads。其中 dump和 dumps是用來把把字典和數組轉換為 json格式的,dump把轉換結果直接寫入文件,dumps返回字符串。load和 loads是把 json格式的數據轉換為字典格式,load直接從 json文件中讀取數據並返回字典對象,loads把字符串形式的 json數據轉換成字典格式。
用JSON打印的時候會用到dump和dumps,那么他們兩個有什么區別呢?查閱資料我知道了,dump的函數原型是 dump(obj, fp) 第一個參數 obj是要轉換的對象,第二個參數 fp是要寫入數據的文件對象。dumps的函數原型是 dumps(obj) 參數是要轉換的對象。(如果要轉換的對象里有中文字符的話,要把 ensure_ascii設置為 False否則中文會被編碼為 ascii格式)下面是json打印內容的函數:

在樹莓派連接OneNet中,最重要的還是apikey和設備的url,這兩個是設備連接上OneNet的必要條件,在pythone中,我們可以直接把apikey和url賦值給一個函數,然后再把接受到的數據發送給url,通過得到的apikey進入設備,APIkey主要用於API調用時的鑒權參數,key如下分為兩種:
Master-APIkey:產品下唯一的管理員權限的APIKey,具有管理產品下所有設備的權限
Device-APIkey:設備級APIkey,具備與之關聯的所有設備的訪問權限
URL是英語Uniform Resource Locator的簡稱,中文統一資源定位符的意思。是對可以從互聯網上得到的資源位置和訪問方法的一種簡潔表示,是互聯網上標准資源的地址。互聯網上的每個文件都有一個唯一的URL,它包含的信息指出文件的位置以及瀏覽器應該怎么處理它。可以分為絕對URL和相對URL 。
(1)絕對URL:顯示文件的完整路徑,這意味着絕對URL本身所在的位置與被引用的實際文件的位置無關。
(2)相對URL :以包含URL本身的文件夾的位置為參考點,描述目標文件夾的位置。
還有一個知識點就是token,在OneNet的全局推送中,雲平台上可以添加全局推送,在此時你就可以看到token的出現,而且token也是雙方連通的一個認證,如下圖所示:

那么token是什么呢,token是一種令牌,令牌是一種能夠控制站點占有媒體的特殊幀,以區別數據幀及其他控制幀。token其實說的更通俗點可以叫暗號,在一些數據傳輸之前,要先進行暗號的核對,不同的暗號被授權不同的數據操作。基於 Token 的身份驗證方法
使用基於 Token 的身份驗證方法,在服務端不需要存儲用戶的登錄記錄。大概的流程是這樣的:
1.客戶端使用用戶名跟密碼請求登錄
2.服務端收到請求,去驗證用戶名與密碼
3.驗證成功后,服務端會簽發一個 Token,再把這個 Token 發送給客戶端
4.客戶端收到 Token 以后可以把它存儲起來,比如放在 Cookie 里或者 Local Storage 里
5.客戶端每次向服務端請求資源的時候需要帶着服務端簽發的 Token
6.服務端收到請求,然后去驗證客戶端請求里面帶着的 Token,如果驗證成功,就向客戶端返回請求的數據。
Token在OneNet中也可以起到調試作用,看看端口是否連通。當一切都連通的時候我們就可以通過串口和OneNet發出和接收的數值看看是否一樣,成功后,就可以通訊了。

六、結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM