王立華,孫少通,倪 雪,胡 月
(山東科技大學(xué) 電子通信與物理學(xué)院,山東 青島 266590)
在資源較為有限的嵌入式硬件平臺上的傳統(tǒng)開發(fā)語言是C/C++,存在代碼移植性差,開發(fā)周期長、維護(hù)成本高等缺點(diǎn)。伴隨著嵌入式硬件平臺計(jì)算能力的普遍提高,在嵌入式硬件平臺上MicroPython的開發(fā)成為熱點(diǎn)[1],并已經(jīng)開始應(yīng)用于教育、智能硬件等設(shè)計(jì)中。與傳統(tǒng)編程語言相比,MicroPython語言與普通Python語言具有極佳的兼容性和天然的移植優(yōu)勢。同時(shí)Micropython還富有多種高級特性[2],比如閉包函數(shù)、列表解析、生成器、異常處理等。通過MicroPython提供的支持庫,開發(fā)者可以快速控制硬件對象,而不用太多的關(guān)注底層,極大地降低了開發(fā)難度,提高開發(fā)效率。
現(xiàn)階段我國的溫室農(nóng)業(yè)信息化、智能化程度較低[3-5],雖然在精準(zhǔn)農(nóng)業(yè)、環(huán)境監(jiān)控等方面有一定的應(yīng)用,但與發(fā)達(dá)國家相比仍存在較大差距[6-9]。溫室大棚環(huán)境參數(shù)的有效監(jiān)測可以提高農(nóng)作物的生產(chǎn)效率,為農(nóng)業(yè)大數(shù)據(jù)應(yīng)用提供數(shù)據(jù)基礎(chǔ),對于提高我國溫室農(nóng)業(yè)水平具有重要意義[10]。
傳統(tǒng)溫室環(huán)境監(jiān)測節(jié)點(diǎn)大都采用有線通信或較為復(fù)雜的節(jié)點(diǎn)間通信,具有成本高、布線復(fù)雜、布局不靈活等缺點(diǎn)[11-13],使用靈活性差。本文以溫室環(huán)境監(jiān)測需求為背景,針對以上監(jiān)測節(jié)點(diǎn)的設(shè)計(jì)缺陷,對監(jiān)測節(jié)點(diǎn)進(jìn)行了軟硬件設(shè)計(jì),在操作系統(tǒng)的基礎(chǔ)上使用MicroPython語言[14-16]實(shí)現(xiàn)快速開發(fā)。
檢測節(jié)點(diǎn)的系統(tǒng)結(jié)構(gòu)由檢測節(jié)點(diǎn)、云服務(wù)器和移動(dòng)端應(yīng)用組成,如圖1所示。
圖1 系統(tǒng)結(jié)構(gòu)框圖
一般溫室大棚并不具有良好的WiFi環(huán)境,所以與服務(wù)器的通信使用NB-IOT模塊實(shí)現(xiàn)。檢測節(jié)點(diǎn)分為多個(gè)節(jié)點(diǎn),其中一個(gè)檢測節(jié)點(diǎn)作為NB-IOT網(wǎng)關(guān),負(fù)責(zé)數(shù)據(jù)的匯總以及與云平臺的通信,兩者之間采用TCP通信協(xié)議,節(jié)點(diǎn)間通信通過一主多從結(jié)構(gòu)的NRF射頻通信實(shí)現(xiàn),在不進(jìn)行通信時(shí)節(jié)點(diǎn)進(jìn)入休眠狀態(tài)以達(dá)到低功耗的目的。云服務(wù)器使用Onenet物聯(lián)網(wǎng)云平臺[17-18],在平臺創(chuàng)建應(yīng)用發(fā)布后可獲得移動(dòng)端應(yīng)用。
檢測節(jié)點(diǎn)由主控制器系統(tǒng)、傳感器、通信模塊、電源模塊等組成,結(jié)構(gòu)組成如圖2所示。根據(jù)檢測需求,有溫、濕度、光照強(qiáng)度、風(fēng)速和CO2濃度等傳感器,分別用來采集環(huán)境信息并傳輸至NB-IOT網(wǎng)關(guān)。微控制器系統(tǒng)由單片機(jī)和外圍電路組成,負(fù)責(zé)對采集數(shù)據(jù)進(jìn)行傳輸和處理。通信模塊根據(jù)節(jié)點(diǎn)類型的不同,有NRF射頻模塊和NB-IOT模塊兩種,分別負(fù)責(zé)節(jié)點(diǎn)間通信和與服務(wù)器的通信。電源模塊用來給系統(tǒng)提供工作電源,為了實(shí)現(xiàn)靈活的配置節(jié)點(diǎn)采用鋰電池供電。
圖2 檢測節(jié)點(diǎn)結(jié)構(gòu)框圖
云平臺與NB-IOT網(wǎng)關(guān)之間依照TCP通信協(xié)議進(jìn)行通信,負(fù)責(zé)將數(shù)據(jù)進(jìn)行處理和可視化,并提供了命令接口以實(shí)現(xiàn)對終端的遠(yuǎn)程控制。通過PC端網(wǎng)頁的顯示界面可以展示當(dāng)前的環(huán)境參數(shù)和設(shè)備狀態(tài),支持?jǐn)?shù)據(jù)導(dǎo)出,為大數(shù)據(jù)農(nóng)業(yè)的實(shí)現(xiàn)提供了數(shù)據(jù)基礎(chǔ),結(jié)合大數(shù)據(jù)處理技術(shù)可以分析環(huán)境、氣節(jié)與生產(chǎn)效率的關(guān)系。當(dāng)環(huán)境參數(shù)達(dá)到設(shè)定的閾值時(shí)能夠下達(dá)命令控制相關(guān)設(shè)備進(jìn)行調(diào)節(jié),并進(jìn)行多種方式的通知,避免環(huán)境因素造成產(chǎn)業(yè)損失,在移動(dòng)端應(yīng)用中可以實(shí)現(xiàn)同樣的功能。
檢測節(jié)點(diǎn)采用32 bit微控制器STM32F4作為主控,該芯片具有1024K Flash、192K SRAM,通過SDIO接口可擴(kuò)展內(nèi)存卡來擴(kuò)展內(nèi)存空間。最高運(yùn)行頻率可達(dá)168 MHz,能夠滿足操作系統(tǒng)和MicroPython的運(yùn)行需求。為了使用方便,通過USB接口獲取電源,將電壓轉(zhuǎn)換為3.3 V的系統(tǒng)工作電壓,引出SW接口便于連接調(diào)試器進(jìn)行軟件的跟蹤調(diào)試。各傳感器的數(shù)據(jù)接口分別采用SPI、IIC、ADC、One-wire數(shù)據(jù)接口來實(shí)現(xiàn)數(shù)據(jù)讀取,見表1。
表1 傳感器/通信模塊數(shù)據(jù)接口表
MicroPython是Python3編程語言的一種精簡而高效的實(shí)現(xiàn),它被優(yōu)化為在微控制器和受限環(huán)境中運(yùn)行,目前已經(jīng)在嵌入式系統(tǒng)上完整實(shí)現(xiàn)了Python3的核心功能。MicroPython在嵌入式系統(tǒng)上的應(yīng)用還獲得了一些操作系統(tǒng)的支持,在操作系統(tǒng)的軟件結(jié)構(gòu)中MicroPython作為一個(gè)軟件組件存在,具有更好的可移植性。
傳感節(jié)點(diǎn)分為采集結(jié)點(diǎn)和匯聚節(jié)點(diǎn),分別進(jìn)行數(shù)據(jù)的采集和上傳任務(wù)。節(jié)點(diǎn)通過周期性的采集數(shù)據(jù),通過確定的格式進(jìn)行節(jié)點(diǎn)間傳輸。為了保證網(wǎng)絡(luò)處于連接狀態(tài),在啟動(dòng)操作系統(tǒng)前創(chuàng)建用戶任務(wù)循環(huán)檢測TCP的連接狀態(tài),當(dāng)檢測到TCP連接斷開時(shí)將再次進(jìn)行連接。檢測系統(tǒng)的軟件控制流程如圖3所示。
圖3 控制程序流程圖
2.2.1 基于RT-Thread的MicroPython實(shí)現(xiàn)
通過移植基于STM32F4硬件平臺的實(shí)時(shí)操作系統(tǒng),實(shí)現(xiàn)操作系統(tǒng)的底層控制,MicroPython作為操作系統(tǒng)的一個(gè)軟件組件存在。系統(tǒng)對底層硬件初始化完成后,分別創(chuàng)建定時(shí)器線程、用戶線程和空閑線程,在用戶線程中掛載SD卡創(chuàng)建文件系統(tǒng)。初始化文件系統(tǒng)后執(zhí)行msh_exec(py_main,strlen(py_main))命令,將任務(wù)指針指向文件系統(tǒng)的main.py文件,啟動(dòng)操作系統(tǒng)后開始運(yùn)行main.py程序。操作系統(tǒng)啟動(dòng)過程示意圖如圖4所示。
圖4 操作系統(tǒng)啟動(dòng)過程示意圖
通過MicroPython提供的支持庫可以實(shí)現(xiàn)對于基本對象的調(diào)用,例如UART、SPI、IIC對象的類方法提供了對于不同對象的具體操作。對于MicroPython支持較好的Pyboard之外的硬件,通常Machine庫能夠提供較好的支持。操作系統(tǒng)提供了很好的POSIX標(biāo)準(zhǔn)支持,所以MicroPython中很多模塊可以在RT-Thread MicroPython上運(yùn)行。本文以SPI對象為例,通過Machine庫的使用來展示對于SPI接口控制對象的操作,控制過程如圖5所示。
圖5 硬件對象初始化信息圖
2.2.2 MicroPython多線程的實(shí)現(xiàn)
其多任務(wù)的實(shí)現(xiàn)分為兩種方式:①在進(jìn)入MicroPython環(huán)境前創(chuàng)建任務(wù)線程,進(jìn)入MicroPython環(huán)境后對線程進(jìn)行監(jiān)視和管理。②操作系統(tǒng)啟動(dòng)后直接進(jìn)入MicroPython環(huán)境,使用thread庫函數(shù)_thread.start_new_thread創(chuàng)建多任務(wù)并進(jìn)行調(diào)度。在操作系統(tǒng)創(chuàng)建多線程任務(wù)后進(jìn)入MicroPython環(huán)境不會影響原任務(wù)的運(yùn)行。
在STM32F405硬件平臺上移RT-Threa-d操作系統(tǒng),移植Micropython組件實(shí)現(xiàn)主程序的運(yùn)行環(huán)境。通過串口輸出的信息表明能夠在操作系統(tǒng)上運(yùn)行Micropython程序,并且能夠控制UART、SPI、ADC、One-wire、Pin等硬件對象。NB-IOT模塊作為通信節(jié)點(diǎn)的網(wǎng)關(guān),通過控制UART對象,實(shí)現(xiàn)對于物聯(lián)網(wǎng)平臺的數(shù)據(jù)匯總。數(shù)據(jù)展示界面可以在PC端實(shí)時(shí)查看,如圖6所示。圖6顯示界面清晰簡潔,能夠較為直觀的展示溫室內(nèi)的環(huán)境信息。當(dāng)環(huán)境信息的某項(xiàng)超過設(shè)定的參數(shù)閾值時(shí)將觸發(fā)云平臺的閾值報(bào)警功能,以郵件或短信方式發(fā)出通知報(bào)警。
以某農(nóng)業(yè)園區(qū)黃瓜溫室大棚為例進(jìn)行應(yīng)用測試,測試大棚占地面積為2 200 m2,共部署4個(gè)采集節(jié)點(diǎn)、一個(gè)匯聚節(jié)點(diǎn),其中每個(gè)節(jié)點(diǎn)都配置2個(gè)溫度傳感器、濕度傳感器,3個(gè)二氧化碳傳感器,2個(gè)光照強(qiáng)度傳感器。測試節(jié)點(diǎn)實(shí)時(shí)采集大棚中的環(huán)境信息,通過節(jié)點(diǎn)間通信傳輸至匯聚節(jié)點(diǎn),最終匯聚節(jié)點(diǎn)負(fù)責(zé)將數(shù)據(jù)打包傳輸至云平臺,PC端或移動(dòng)端可以通過訪問云端服務(wù)器獲取數(shù)據(jù)展示界面。對大棚環(huán)境信息進(jìn)行檢測,圖7展示了2018年9月14日11時(shí)光強(qiáng)傳感器的測試數(shù)據(jù),大棚內(nèi)的溫度為37 ℃,光照強(qiáng)度為770klx,濕度為74%,CO2濃度為602 mg/m3。根據(jù)環(huán)境信息記錄可知,在10:40~11:30這段時(shí)間內(nèi),大棚內(nèi)的光照強(qiáng)度有平穩(wěn)變化,CO2濃度較為穩(wěn)定,溫室內(nèi)溫度逐漸上升,濕度呈現(xiàn)下降趨勢,與當(dāng)?shù)氐臏厥掖笈飪?nèi)相應(yīng)時(shí)節(jié)環(huán)境信息相符合。
圖6 PC端環(huán)境信息展示界面
圖7 溫室大棚光照強(qiáng)度信息記錄
本設(shè)計(jì)使用MicroPython編程語言完成了對溫室大棚內(nèi)的溫、濕度、光照強(qiáng)度等環(huán)境信息的采集,系統(tǒng)通過NB-IOT網(wǎng)關(guān)將數(shù)據(jù)傳輸至物聯(lián)網(wǎng)云平臺,實(shí)現(xiàn)了在PC端和移動(dòng)端的遠(yuǎn)程查看和環(huán)境量超閾值報(bào)警,能夠準(zhǔn)確監(jiān)測環(huán)境信息數(shù)據(jù)。通過創(chuàng)建操作系統(tǒng)層基礎(chǔ)任務(wù)循環(huán)檢測TCP連接狀態(tài),可以在設(shè)備出現(xiàn)故障或斷網(wǎng)時(shí)進(jìn)行自動(dòng)重啟,較好地保證了網(wǎng)絡(luò)連接的穩(wěn)定性。通過本應(yīng)用證明了MicroPython語言在嵌入式平臺的實(shí)用性,與其他設(shè)計(jì)方案相比具有軟件構(gòu)建簡單,開發(fā)周期短的優(yōu)勢,對于物聯(lián)網(wǎng)應(yīng)用的快速開發(fā)具有借鑒意義。