杜 彬,宋坤偉
(山西職業(yè)技術學院,山西 太原 030006)
當前在城市中因霧霾、尾氣排放、室內(nèi)裝修而形成的各類污染成分在空氣中的傳播,都會對人體健康造成損害,而大型室內(nèi)場館密閉性高、通風不足、人員密度大等特點使室內(nèi)空氣污染的檢測與治理顯得尤為重要,而快速高效的實時空氣質(zhì)量信息檢測并自動記錄相關數(shù)據(jù)的工作在為制訂與實施空氣質(zhì)量改善措施提供參考依據(jù)的同時,還可以為管理機構對場館中的空氣質(zhì)量變化趨勢分析與實施人員流量管控措施提供基礎數(shù)據(jù)支持,有效預防公共安全事故的發(fā)生。
樹莓派作為基于Debian Linux系統(tǒng)的單板機計算機[1],因其體積小、集成化程度高、擴展性強的優(yōu)勢被廣泛使用在不同領域的物聯(lián)網(wǎng)應用系統(tǒng)中,其低廉的硬件價格與開放式的軟件架構為用戶提供了極高的性價比,非常有利于產(chǎn)品的推廣與普及。樹莓派的第三代產(chǎn)品Raspberry Pi3 提供了種類豐富的傳感器接口支持,通過編程調(diào)用Linux開源庫實現(xiàn)對PM2.5、二氧化碳、甲醛等傳感器的控制,能夠可靠的完成空氣質(zhì)量的實時動態(tài)檢測與數(shù)據(jù)上傳,并具有設備體積小、實施成本低、實時性強和精度高等優(yōu)點。
如圖1智能空氣質(zhì)量檢測系統(tǒng)整體架構所示,系統(tǒng)劃分為智能檢測終端與云服務器端兩部分,智能檢測終端由部署在樹莓派平臺上的多種傳感器構成,系統(tǒng)利用傳感器模塊按固定周期分別采集空氣中的MP2.5、二氧化碳、溫濕度以及用于反映甲醛濃度的HCHO數(shù)據(jù)值,并調(diào)用GPRS模塊上傳至在線云服務器進行存儲。在向被監(jiān)測場所的管理機構提供實時、準確的空氣質(zhì)量數(shù)據(jù)的同時,通過共享在云端服務器上存儲的數(shù)據(jù),也可以為更大范圍、更深層次的城市環(huán)境質(zhì)量檢測與綜合評估系統(tǒng)的開發(fā)與運行提供基礎數(shù)據(jù)支持。
圖1 智能空氣質(zhì)量檢測系統(tǒng)整體架構
本文選用的樹莓派3平臺搭載了ARM11 處理器(主頻700MHz)、512M主存與40個GPIO接口[2]。該平臺良好的運算/處理能力與大量的GPIO接口在為系統(tǒng)中現(xiàn)有的各個傳感器數(shù)據(jù)采集功能的可靠運行提供保障的同時,還使系統(tǒng)具備了良好的擴展性,開發(fā)人員可以根據(jù)項目的實際需求向系統(tǒng)中補充其它傳感器模塊,使系統(tǒng)功能更加完善。此外,樹莓派平臺僅有一張磁卡大小的體積,也使得設備的安裝部署非常簡便,適于在大型場館空間中多點部署,對于當前室內(nèi)裝修結構愈加復雜的發(fā)展現(xiàn)狀,樹莓派平臺具備了非常優(yōu)異的適應性與良好的性價比。
PM2.5數(shù)據(jù)檢測使用Rirans PM2.5激光傳感器,由于PM2.5主要由懸浮在空氣中的微小顆粒組成,普通的基于化學反映原理工作的有害氣體傳感器難以檢測[3],因此本系統(tǒng)選用了基于激光反射原理的傳感器,通過對空氣中直徑超過3.03 μm的懸浮粉塵進行激光照射,當這些粉塵因受到光照而產(chǎn)生的散射光線被傳感器上的光接受元件接收到后,會根據(jù)散射的強弱(即反映粉塵密度)自動轉(zhuǎn)換為不同強度的電信號,并以電壓的形式輸出到樹莓派平臺上進行處理,準確獲取當前空氣中的PM2.5數(shù)據(jù)。Rirans模塊在樹莓派平臺上的配置方案如表1所示。
表1 Rirans PM2.5傳感器配置方案
二氧化碳數(shù)據(jù)檢測所采用的MH-Z14A屬于非色散紅外檢測型傳感器,該傳感器以紅外線作為測量介質(zhì),利用二氧化碳吸收波長4.26μm紅外線的物理特征來有選擇地準確測量二氧化碳的分量,紅外輻射透過被測氣體后,在二氧化碳氣體的相應波長處會發(fā)生能量的衰減,傳感器通過測量該譜線能量的衰減量即可獲知被測氣體濃度,并以串口數(shù)據(jù)方式輸出檢測結果,具有良好的穩(wěn)定性與可靠性。MH-Z14A模塊的連接配置方案如表2所示。
表2 MH-Z14A傳感器配置方案
系統(tǒng)選用DHT22傳感器來獲取空氣中的溫濕度變化情況,該傳感器基于熱敏電阻與感濕電阻進行工作,由于電阻的阻值會隨著空氣中的溫濕度變化而發(fā)生改變,因此傳感器可以通過電流的變化來獲取相應的溫濕度數(shù)據(jù),并將最終結果以數(shù)字信號的形式輸出至樹莓派平臺進一步處理。該模塊配置方案如表3所示。
表3 DHT22傳感器配置方案
對于室內(nèi)空間中因裝修而產(chǎn)生的甲醛成分的檢測,本系統(tǒng)使用Plantower DS傳感器來完成,其原理是基于電化學方法將包含有甲醛成分的空氣與電解質(zhì)反應所產(chǎn)生的電流作為傳感器的輸出信號。Plantower DS作為最新型的數(shù)字輸出式HCHO傳感器,其精度與穩(wěn)定性均達到了很高的水平,能夠可靠地為系統(tǒng)提供空氣中的實時甲醛含量數(shù)據(jù)。該模塊的配置方案如表4所示。
表4 Plantower DS傳感器配置方案
系統(tǒng)在獲取到各個傳感器輸出的檢測數(shù)據(jù)并進行處理后,使用SIM800C模塊將數(shù)據(jù)上傳至云服務器完成存儲,SIM800C是專用于樹莓派平臺的無線通信模塊,支持短信、GPRS、HTTP等多種數(shù)據(jù)傳輸模式,系統(tǒng)通過MICRO SIM卡接入GPRS網(wǎng)絡后將數(shù)據(jù)上傳至云服務器上的WebService接口后,由服務器端程序完成向數(shù)據(jù)庫的存儲。SIM800C模塊的配置方案如表5所示。
表5 SIM800C傳感器配置方案
系統(tǒng)運行過程中,樹莓派主板上搭載的ARM處理器按固定間隔時間(5s)獲取各個傳感器模塊所采集到的空氣質(zhì)量數(shù)據(jù)信息,然后將信息合并后再通過GPRS通信模塊向云服務端上傳數(shù)據(jù)。軟件運行流程如圖2所示。
圖2 軟件運行流程圖
在集成了Debian Liunx環(huán)境的樹莓派平臺上,主流的編程開發(fā)語言是Python[4],因此本系統(tǒng)中各傳感器數(shù)據(jù)采與上傳集功能用Python編寫的腳本程序?qū)崿F(xiàn),主程序通過定期調(diào)用該腳本實現(xiàn)對空氣質(zhì)量的循環(huán)檢測。由于傳感器引腳發(fā)送到樹莓派主板的是一組由高低電平組成的脈沖信號,因此在編程處理時,首先需要根據(jù)傳感器使用說明中闡述的信號位數(shù)來創(chuàng)建相應長度的數(shù)組,然后采用while循環(huán)語句檢測其輸出電平的變化(由低電平變?yōu)楦唠娖胶?再轉(zhuǎn)變?yōu)榈碗娖郊礊橐粋€完整信號),并在數(shù)組中存儲各信號的持續(xù)時間。然后根據(jù)持續(xù)時間的長度對數(shù)組中的數(shù)據(jù)轉(zhuǎn)換為二進制的0或1,最后將二進制信號進行處理后以十進制數(shù)值并進行相應的處理后返回給主程序。數(shù)據(jù)處理步驟如圖3所示。
圖3 傳感器數(shù)據(jù)處理步驟
在數(shù)據(jù)處理的環(huán)節(jié)上,需要根據(jù)各個傳感器所發(fā)送的數(shù)據(jù)長度與格式進行有針對性的處理,下面對溫濕度數(shù)據(jù)、甲醛數(shù)據(jù)采集模塊以及數(shù)據(jù)上傳模塊的關鍵實現(xiàn)代碼進行說明。
由于DHT22溫濕度傳感器的輸出信號為40位數(shù)據(jù),其中包含了兩種數(shù)據(jù)(16位濕度數(shù)據(jù)與16位溫度數(shù)據(jù),其余8位為校驗位),因此需要分別進行兩次十進制的數(shù)值轉(zhuǎn)換。最后根據(jù)每組最高位所記錄的正負標識對數(shù)值進行最后處理。
#GPIO.setmode(GPIO.BOARD) //聲明GPIO引腳編號模式為BOARD
import RPi.GPIO as GPIO //導入GPIO支持模塊
import sys //導入系統(tǒng)支持模塊
import time //導入時間對象支持模塊
def handt() //溫濕度數(shù)據(jù)采集函數(shù)
ht=15 //溫濕度傳感器數(shù)據(jù)輸出引腳編號
htdata=[0,0,…,0]//創(chuàng)建長度為40的數(shù)組并將全部元素初始化為0,用于存儲數(shù)據(jù)
GPIO.output(ht,1)//向傳感器輸出高電平
GPIO.setup(ht,GPIO.IN)//設置引腳為數(shù)據(jù)輸入模式
n=0
while n<41://Python中循環(huán)語句塊以相同縮進為標識
tm=time.time()*1000000//用于記錄傳感器所發(fā)送信號的時序
n+=1
while not GPIO.input(ht)://檢測到高電平信號則停止循環(huán),即等待高電平開始
pass
while GPIO.input(ht)://檢測到低電平信號則停止循環(huán),即等待高電平結束,一個完整信號結束
pass
htdata[n]=time.time()*1000000-tm//將信號數(shù)據(jù)存儲至數(shù)組中
GPIO.setup(ht,GPIO.OUT) //數(shù)據(jù)獲取完畢,將引腳重新復位
GPIO.output(ht,1)
for m in range(len(htdata))://將數(shù)據(jù)轉(zhuǎn)換為 0、1
if htdata[m]>100: //數(shù)組中存儲的是信號持續(xù)時間值,大于100則轉(zhuǎn)換為1
htdata[m]=1
else:
htdata[m]=0
h-data=0//濕度值獲取開始
j=24
while j<40://將數(shù)組25-39元素中存儲的濕度值轉(zhuǎn)換為10進制,最高位為正負標識
j+=1
h-data+=htdata[j]*pow(2,j-25)//第n位數(shù)據(jù)中的2進制值,乘以2的n-1次方,用于完成十進制的轉(zhuǎn)換
if htdata[40]==1:
h-data=-1*h-data//最高位為1時,數(shù)據(jù)為負值
h-data=h-data/10//DHT22輸出的數(shù)字比實際值高10倍,因此需要除以10
t-data=0//溫度值獲取開始
k=8
while k<24://將數(shù)組9-23元素中存儲的濕度值轉(zhuǎn)換為10進制,最高位為正負標識
k+=1
t-data+=htdata[k] *pow(2,k-9)//十進制轉(zhuǎn)換
if htdata[24]==1:
t-data=-1*t-data//最高位為1時,數(shù)據(jù)為負值
t-data=t-data/10//除以10,獲取最終數(shù)據(jù)
htstr=h-data+”/”+t-data
return htstr//返回溫濕度數(shù)據(jù)
Plantower DS甲醛傳感器的輸出信號為80位數(shù)據(jù),其中49-64位為氣體檢測數(shù)據(jù)。41-48位為被測氣體當量。因此需要在完成十進制數(shù)值轉(zhuǎn)換后,將監(jiān)測數(shù)值除以氣體當量數(shù)值以獲取最終的實際數(shù)據(jù)。
def hcho ()//甲醛含量數(shù)據(jù)采集函數(shù)
nt=10 //甲醛傳感器數(shù)據(jù)輸出引腳編號
ntdata=[0,0,…,0]//創(chuàng)建長度為80的數(shù)組并將全部元素初始化為0,用于存儲數(shù)據(jù)
GPIO.output(nt,1)//向傳感器輸出高電平
GPIO.setup(nt,GPIO.IN)//設置引腳為數(shù)據(jù)輸入模式
n=0
while n<81://讀入傳感器數(shù)據(jù)
tm=time.time()*1000000
n+=1
while not GPIO.input(nt):
pass
while GPIO.input(nt):
pass
htdata[n]=time.time()*1000000-tm//將信號數(shù)據(jù)存儲至數(shù)組中
GPIO.setup(nt,GPIO.OUT) //數(shù)據(jù)獲取完畢,將引腳重新復位
GPIO.output(nt,1)
for m in range(len(ntdata)): //將數(shù)據(jù)轉(zhuǎn)換為 0、1
if ntdata[m]>100:
ntdata[m]=1
else:
ntdata[m]=0
n-data=0//HCHO數(shù)值獲取開始
j=48
while j<65://將數(shù)組49-64元素中存儲的濕度值轉(zhuǎn)換為10進制
j+=1
n-data+=ntdata[j]*pow(2,j-49)
v-data=0//氣體當量數(shù)值獲取開始
j=40
while j<49://將數(shù)組41-48元素中存儲的氣體當量值轉(zhuǎn)換為10進制
j+=1
v-data+=ntdata[j]*pow(2,j-41)
hcstr=n-data/v-data//氣體數(shù)值除以氣體當量數(shù)值,獲得最終數(shù)據(jù)
return hcstr
主程序在完成數(shù)據(jù)采集后,通過調(diào)用GPRS模塊上傳數(shù)據(jù)至云服務器。
#!/usr/bin/env python
import serial
import time
import datetime
while True:
time.sleep(5)//設置間隔時間為5s
try
mp=mp25()//獲取mp2.5數(shù)據(jù)
co=co2()//獲取二氧化碳數(shù)據(jù)
ht=handt()//獲取溫濕度數(shù)據(jù)
hc=hcho()//獲取甲醛數(shù)據(jù)
gprs(“mp25=”+mp+”&co2=”+co+”&h-t=”+ht+”&hcco=”+hc)//調(diào)用數(shù)據(jù)上傳函數(shù)
except continue
GPRS模塊控制函數(shù)中包含了與服務器的連接、合法性驗證、時間獲取與格式化、信息合并以及數(shù)據(jù)提交等功能,這些功能主要通過向SIM800C發(fā)送模塊中預置的命令來實現(xiàn),關鍵代碼如下:
def gprs(str1) //數(shù)據(jù)上傳功能函數(shù)
ServerTok=”st=pi2017S00106”//向服務器提交數(shù)據(jù)時的認證口令,用于設備身份合法性驗證
ClientId=”cid=cpr001”//設備唯一編號
sn=6//模塊輸入命令引腳編號
nowtime=datetime.datetime.now()
times=nowtime.strftime("%Y-%m-%d %H:%M:%S")//獲得當前時間
datastr=”tm=”+times+”&”+str1+”&”+ServerTok+”&”+ClientId//組成向服務器提交的數(shù)據(jù)字符串
GPIO.pinMode(sn,OUTPUT)//設置GPIO6針腳模式為輸出
GPIO.digitalWrite(sn,” AT+CGATT=1”)//向模塊發(fā)送指令,使模塊基于GPRS網(wǎng)絡模式
GPIO.digitalWrite(sn,” AT+CIICR=1”)//向模塊發(fā)送指令,激活移動場景,建立無線鏈路
GPIO.digitalWrite(sn, “AT+CIPSTART=’TCP’,’202.96.152.36’,’23158’”)//設置要連接的遠端服務器類型,IP地址,端口號。
GPIO. digitalWrite (sn, “AT+DATA=”& datastr)//將待發(fā)送數(shù)據(jù)發(fā)送至模塊
GPIO.digitalWrite(sn, “AT+CIPSEND=0”)//啟動發(fā)送操作
retun
本文所設計的空氣質(zhì)量檢測系統(tǒng)基于樹莓派3平臺構建,使用多種傳感器實現(xiàn)了對室內(nèi)空氣質(zhì)量的多方位動態(tài)數(shù)據(jù)采集,并通過GPRS通信模塊完成了數(shù)據(jù)的實時上傳與存儲。檢測設備體積小巧,便于安裝,并且采用無線數(shù)據(jù)傳輸模式,非常適合在結構復雜的大型室內(nèi)空間中多點部署。所獲取的檢測數(shù)據(jù)具備良好的完整性、實時性與準確性,在大型室內(nèi)空間的空氣污染控制與治理工作中具備良好的實用價值。