陳梓敏 張子揚(yáng) 周賢中



摘? ?要:基于實(shí)驗(yàn)室氣體安全問題頻出的情景,研發(fā)性能強(qiáng)大、架構(gòu)輕便的報(bào)警器是一個(gè)值得研究的課題。在實(shí)驗(yàn)室中配置該報(bào)警器以檢測(cè)環(huán)境中的溫度、濕度、氧氣濃度,當(dāng)檢測(cè)數(shù)值高于或低于安全范圍時(shí),將會(huì)由傳感器發(fā)出警示信號(hào)。同時(shí),通過輕量化Web框架Flask進(jìn)行后端設(shè)計(jì),經(jīng)過樹莓派進(jìn)行數(shù)據(jù)處理后可以在瀏覽器網(wǎng)頁端實(shí)時(shí)監(jiān)控受檢測(cè)指標(biāo)變化,并且保存歷史記錄。
關(guān)鍵詞:Flask? Python? 樹莓派? 氧氣濃度
中圖分類號(hào):TP273;U495? ? ? ? ? ? ? ? ? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A? ? ? ? ? ? ? ? ? ? ? ?文章編號(hào):1674-098X(2020)03(b)-0056-04
Abstract: Based on the situation of frequent gas safety problems in the laboratory, it is worth studying to develop a powerful and portable alarm. The alarm is equipped in the laboratory to detect the temperature, humidity and oxygen concentration in the environment. When the detection value is higher or lower than the safe range, the sensor will send out warning signals. At the same time, through the lightweight web framework flask for back-end design, after the raspberry pie data processing, it can real-time monitor the changes of detected indicators in the browser Web site, and save the history.
Key Words: Flask; Python; Raspberry Pi; Oxygen Concentration
在任何可能發(fā)生氧氣不足的地方,都需要氧氣警報(bào)。盡管大多數(shù)人都想到飛機(jī)或潛艇等封閉環(huán)境,但更常見的例子是頻繁使用化學(xué)試劑和化學(xué)氣體進(jìn)行實(shí)驗(yàn)的密閉實(shí)驗(yàn)室環(huán)境。如果實(shí)驗(yàn)室中存儲(chǔ)著的氣體的鋼瓶或儲(chǔ)罐發(fā)生泄漏,氣體的快速流出會(huì)迅速降低封閉區(qū)域或室內(nèi)的氧氣含量,從而威脅人的生命安全。
隨著實(shí)驗(yàn)室中的科研范圍日漸擴(kuò)大,實(shí)驗(yàn)環(huán)境的密封性要求逐漸提高,由缺氧導(dǎo)致的一系列安全事故頻發(fā),這一嚴(yán)峻問題引起了廣大科研工作者的重視。為達(dá)到保障科研工作者的生命安全、創(chuàng)造安全的實(shí)驗(yàn)環(huán)境等目的,本項(xiàng)目意在開發(fā)一個(gè)功能強(qiáng)大、使用方便、能耗較低的溫濕度氧氣濃度報(bào)警器。
1? 系統(tǒng)設(shè)計(jì)
本項(xiàng)目的硬件設(shè)計(jì)圍繞樹莓派3B+單片機(jī)及其外設(shè)展開。正常工作狀態(tài)下,傳感器持續(xù)讀取外界環(huán)境中的目標(biāo)數(shù)值,LED燈處于常亮狀態(tài),蜂鳴器處于低電平狀態(tài),不發(fā)出鳴叫聲音。當(dāng)傳感器檢測(cè)到相關(guān)目標(biāo)數(shù)值未處于預(yù)設(shè)的標(biāo)準(zhǔn)范圍之內(nèi)時(shí),蜂鳴器被置于高電平狀態(tài),開始持續(xù)鳴叫示警。
直至使用者連續(xù)按兩次按鈕,LED燈變至閃爍狀態(tài),蜂鳴器停止發(fā)出鳴叫警報(bào)聲。此外,長(zhǎng)按按鈕可使LED燈處于熄滅狀態(tài),輕按一次則恢復(fù)正常工作狀態(tài)。
1.1 硬件設(shè)計(jì)
如圖1所示,硬件部分由樹莓派3B+、Grove拓展板、溫濕度傳感器、氧氣濃度傳感器、蜂鳴器及LED按鍵組成,其中的外設(shè)統(tǒng)一使用Grove接口,達(dá)到便于整理、美觀等效果。
其中,樹莓派3B+是由英國(guó)樹莓派基金會(huì)于2018年發(fā)行的單板計(jì)算機(jī),相較此前的型號(hào),具備更加豐富的拓展功能以及更加強(qiáng)大的性能,自身帶有四個(gè)USB A端口、一個(gè)基于USB 2.0的千兆以太網(wǎng)端口、HDMI高清多媒體接口以及3.5mm音頻接口,此外還有雙頻WiFi模塊、藍(lán)牙4.2模塊。處理器基于ARM芯片,能夠以1.4GHz的頻率運(yùn)行,以SD卡為內(nèi)存硬盤,具備所有PC的基本功能。因此,其自身具備功耗低、性能強(qiáng)大、拓展豐富的特點(diǎn),此外,其價(jià)格不足250元,價(jià)格低廉,采用其作為開發(fā)板能夠節(jié)約經(jīng)費(fèi)。
拓展板Grove Base Hat通過GPIO拓展口連接在樹莓派的IO口上,并使用銅柱固定。拓展板提供多個(gè)數(shù)字、模擬、I2C、PWM、UART端口,以滿足使用者多樣要求,并且端口皆為Grove接口。
DHT11是一款低成本的數(shù)字溫度和濕度傳感器,可產(chǎn)生校準(zhǔn)的數(shù)字輸出,并且具有很高的可靠性和長(zhǎng)期穩(wěn)定性。氧氣濃度傳感器選用了煒盛科技的ME2-O2-Φ20型電化學(xué)氣體傳感器,可對(duì)氧氣進(jìn)行定量測(cè)量,具有低功耗、高精度、高靈敏度、抗干擾能力強(qiáng)等優(yōu)點(diǎn)。
以上兩個(gè)傳感器在使用前都需預(yù)熱數(shù)分鐘,否則將產(chǎn)生不穩(wěn)定數(shù)據(jù)。
1.2 軟件設(shè)計(jì)
該報(bào)警器需實(shí)現(xiàn)實(shí)時(shí)監(jiān)控?cái)?shù)據(jù)變化和查詢歷史數(shù)據(jù)的功能,并且當(dāng)氧氣濃度不在安全范圍內(nèi)時(shí),蜂鳴器以及LED按鈕開始工作,實(shí)現(xiàn)報(bào)警功能。為了達(dá)到降低功耗以及使用方便等目的,設(shè)計(jì)了在瀏覽器中查詢相關(guān)數(shù)據(jù)的功能。
1.2.1 開發(fā)平臺(tái)
根據(jù)需求,本項(xiàng)目軟件設(shè)計(jì)后端部分使用了由Python編寫的輕量級(jí)WEB應(yīng)用框架——Flask框架[1-2],并使用HTML和JavaScript語言編寫網(wǎng)頁顯示部分。Flask框架使用簡(jiǎn)單、功耗低、占用內(nèi)存少,且具有很強(qiáng)的可拓展性,可快速搭建小型網(wǎng)站。在數(shù)據(jù)存儲(chǔ)調(diào)用方面,選用了小型數(shù)據(jù)庫SQLite3[3],通過創(chuàng)建pi_temp.db數(shù)據(jù)庫文件,并在其中建立三個(gè)表分別存儲(chǔ)溫度、濕度和氧氣濃度數(shù)值。使用者在瀏覽器中輸入樹莓派的IP地址以及預(yù)設(shè)的端口號(hào),即可實(shí)時(shí)監(jiān)控?cái)?shù)據(jù)或查閱歷史數(shù)據(jù)。
1.2.2 后端程序分析
如圖2程序框架所示,后端設(shè)計(jì)部分主要由flask_sqlite3.py(構(gòu)建flask框架)、deque_logger.py(讀取并寫入數(shù)據(jù))、bbb.py(報(bào)警服務(wù))三個(gè)Python程序構(gòu)成,并由ZeroMQ[4-5]模塊實(shí)現(xiàn)程序間的通訊。
在flask_sqlite3.py程序中,導(dǎo)入了flask包中的Flask、request、render_template模塊構(gòu)建flask框架,通過模板新建html文件并傳遞相關(guān)參數(shù),分別由不同的使用條件建立live.html、no_sensor.html、history.html三個(gè)網(wǎng)頁程序。
以上網(wǎng)頁中,live頁面直接顯示溫度、濕度、氧氣濃度三項(xiàng)數(shù)據(jù),從而達(dá)到實(shí)時(shí)監(jiān)控的目的;在history頁面中,通過調(diào)用time、datetime、arrow時(shí)間模塊,使對(duì)應(yīng)時(shí)間格式化,以便查詢時(shí)調(diào)用,并通過json[5]模塊格式化數(shù)據(jù),使用plotly模塊包繪制三項(xiàng)數(shù)據(jù)的折線變化圖,當(dāng)檢測(cè)到數(shù)據(jù)庫中相應(yīng)的表中無數(shù)據(jù)更新時(shí),在no_sensor頁面中顯示錯(cuò)誤警告“Sorry, can't access the sensor!”。
deque_logger.py程序通過導(dǎo)入Seeed公司提供的grove.adc包中的讀數(shù)方法讀取傳感器對(duì)應(yīng)電壓值,從而換算成對(duì)應(yīng)的氧氣濃度。另外,通過DHT公司提供的例程直接計(jì)算從DHT11溫濕度傳感器[6-7]得到的溫度、濕度數(shù)據(jù)。
通過導(dǎo)入zmq模塊,采用請(qǐng)求應(yīng)答模式(Request-Reply)實(shí)現(xiàn)消息的雙向傳輸,滿足deque_logger.py和bbb.py程序的通訊需求。在deque_logger.py程序中,每當(dāng)寫入一次數(shù)據(jù)后,都將檢測(cè)氧氣濃度是否在安全范圍內(nèi),若不在安全范圍內(nèi),則發(fā)送警示消息‘bb至bbb.py程序。當(dāng)bbb.py程序檢測(cè)到該信息為‘bb且預(yù)設(shè)的alarm變量為真,將蜂鳴器置于高電平,蜂鳴器開始鳴叫。若alarm變量為假或接收到的信息不為‘bb,則蜂鳴器不發(fā)出鳴叫聲。
在bbb.py 程序中,導(dǎo)入gpiozero包中的Buzzer模塊控制蜂鳴器。LED按鈕由Seeed公司提供的相應(yīng)例程進(jìn)行控制,其中的GroveLedButton類通過Button模塊和Factory模塊將按鍵的狀態(tài)和LED燈的狀態(tài)聯(lián)系在一起,設(shè)計(jì)出三個(gè)事件,分別響應(yīng)不同的動(dòng)作。當(dāng)單次按壓按鍵時(shí),LED燈亮起;當(dāng)連續(xù)按壓按鍵時(shí),LED燈開始閃爍,蜂鳴器停止發(fā)出鳴叫聲;當(dāng)長(zhǎng)按按鍵時(shí),LED燈熄滅,蜂鳴器不再工作,LED按鍵也不再工作。
1.2.3 前端界面設(shè)計(jì)
如圖3所示,live頁面可實(shí)時(shí)顯示當(dāng)前外界環(huán)境中溫度、濕度、氧氣濃度的數(shù)值,為了達(dá)到簡(jiǎn)潔明了的目的,在
層中鍵入文本,并且設(shè)定每10s刷新一次頁面顯示數(shù)據(jù)。通過Javascript腳本[8-9]制作名為Historic的控件,點(diǎn)擊后可跳轉(zhuǎn)至history頁面。如圖4所示,history頁面通過折線圖中不同顏色的線條直接顯示溫度、濕度、氧氣濃度的歷史數(shù)據(jù),通過控件可更改數(shù)據(jù)顯示范圍。此外,點(diǎn)擊Live可跳轉(zhuǎn)至實(shí)時(shí)顯示頁面。
2? 實(shí)驗(yàn)驗(yàn)證
如圖5所示,為了達(dá)到節(jié)省環(huán)保的目的,本項(xiàng)目使用生活中常用的物品來完成實(shí)驗(yàn)驗(yàn)證。首先,通過充電寶對(duì)樹莓派進(jìn)行供電,通電開機(jī)后程序開始運(yùn)行,預(yù)熱5min后,傳感器開始穩(wěn)定測(cè)量環(huán)境中的有關(guān)數(shù)據(jù)。將所有設(shè)備放入密閉性良好的保鮮盒,在其中放入合適用量的除氧劑用以降低氧氣濃度。
如圖6所示,密封一段時(shí)間后,當(dāng)盒中氧氣濃度低于預(yù)先設(shè)定的臨界值,蜂鳴器開始報(bào)警,實(shí)現(xiàn)報(bào)警功能,完成驗(yàn)證。
3? 結(jié)語
基于Flask的樹莓派溫濕度及氧氣濃度報(bào)警器在硬件上,通過樹莓派和多個(gè)grove接口傳感器進(jìn)行設(shè)計(jì),實(shí)現(xiàn)了功能強(qiáng)大、接線簡(jiǎn)單、設(shè)計(jì)方便等目的。其中,溫濕度傳感器DHT11通過PWM接口連接樹莓派,氧氣濃度傳感器通過Analog接口連接樹莓派。
在軟件設(shè)計(jì)方面,通過Python的Flask輕量級(jí)Web框架進(jìn)行后端設(shè)計(jì),降低了代碼設(shè)計(jì)難度,提高了代碼的簡(jiǎn)潔度和可讀性,提高了完成項(xiàng)目的效率。
由于樹莓派PWM方面的設(shè)計(jì)漏洞,導(dǎo)致當(dāng)多個(gè)程序同時(shí)運(yùn)行時(shí),PWM時(shí)序會(huì)產(chǎn)生波動(dòng),從而導(dǎo)致溫濕度傳感器產(chǎn)生錯(cuò)誤數(shù)據(jù)。在調(diào)試過程中,通過逐步嘗試修改讀數(shù)方法、更換傳感器、更換接口等方法,最終決定通過collections模塊中的deque.median()方法取中位數(shù)以消除錯(cuò)誤數(shù)據(jù),達(dá)到代碼簡(jiǎn)便、經(jīng)濟(jì)節(jié)省的目的。
基于Flask的樹莓派溫濕度及氧氣濃度報(bào)警器的開發(fā)可以提高實(shí)驗(yàn)室安全性,同時(shí)可以達(dá)到高性能、低功耗的目的,能夠?yàn)閷?shí)驗(yàn)室安全提供良好的服務(wù)。
參考文獻(xiàn)
[1] 葉鋒.Python最新Web編程框架Flask研究[J].電腦編程技巧與維護(hù),2015(15):29-30.
[2] 牛作東,李捍東.基于Python與flask工具搭建可高效開發(fā)的實(shí)用型MVC框架[J].計(jì)算機(jī)應(yīng)用與軟件,2019, 36(7).
[3] Introduction to Sqlite and its usage with python[J]. 2015.
[4] 葉崧, 姚健東. 基于ZeroMQ & JSON的分布式測(cè)控系統(tǒng)消息通信架構(gòu)設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2014,37(2):105-109.
[5] 方賡.基于ZeroMQ消息交換的充電站監(jiān)控平臺(tái)的設(shè)計(jì)與應(yīng)用[J].電子世界,2019(11).
[6] 李德路,侯文寶.基于DHT11室內(nèi)溫/濕度監(jiān)控系統(tǒng)設(shè)計(jì)[J].智能建筑與城市信息,2013(11):65-67.
[7] 潘繼強(qiáng).基于DHT11的空氣溫濕度監(jiān)控系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù),2014(21):5105-5108.
[8] Halfacree G .JavaScript[M]// The Official BBC micro:bit?; User Guide. John Wiley & Sons, Inc. 2017.
[9] Dale, Kyran.Data Visualization With Python And Javascript[J].2016.