陳真通 王文慶 郝敬全
(1.西安郵電大學(xué)自動(dòng)化學(xué)院 西安 710121)(2.泰華智慧產(chǎn)業(yè)集團(tuán)股份有限公司 濟(jì)南 250101)
節(jié)能減排是我國(guó)長(zhǎng)期堅(jiān)持的一項(xiàng)基本國(guó)策。隨著城市建設(shè)的快速發(fā)展,為加強(qiáng)對(duì)公共建筑的節(jié)能運(yùn)行管理,建設(shè)部和財(cái)政部共同提出建設(shè)公共建筑能耗監(jiān)測(cè)系統(tǒng)的要求。建設(shè)能耗監(jiān)測(cè)系統(tǒng),對(duì)及時(shí)準(zhǔn)確地掌握重點(diǎn)用能單位能耗情況、追蹤節(jié)能政策實(shí)施效果、增強(qiáng)宏觀調(diào)控的針對(duì)性和主動(dòng)性具有重要意義[1]。文獻(xiàn)[2]基于物聯(lián)網(wǎng)技術(shù)的樓宇能耗監(jiān)控系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn),在研究現(xiàn)有能耗監(jiān)控系統(tǒng)的基礎(chǔ)上,結(jié)合電能檢測(cè)技術(shù)、Zigbee 無線通信技術(shù)和嵌入式技術(shù)設(shè)計(jì)并實(shí)現(xiàn)了一套樓宇能耗監(jiān)控系統(tǒng)。文獻(xiàn)[3]對(duì)公共建筑能耗監(jiān)測(cè)系統(tǒng)進(jìn)行了研究與應(yīng)用,詳細(xì)研究能耗監(jiān)測(cè)系統(tǒng)下的能耗數(shù)據(jù),并能為用能單位提供系統(tǒng)的能耗數(shù)據(jù)及詳盡的能耗數(shù)據(jù)分析,為節(jié)能減排提供基本的依據(jù)。文獻(xiàn)[4]改造設(shè)計(jì)基于節(jié)能化管理的辦公建筑節(jié)能監(jiān)測(cè)系統(tǒng),在實(shí)際應(yīng)用中實(shí)現(xiàn)了對(duì)辦公建筑能源的節(jié)約,并且提升了系統(tǒng)監(jiān)測(cè)性能和經(jīng)濟(jì)效益。
目前,LoRa 無線傳感器網(wǎng)絡(luò)技術(shù)的飛速發(fā)展和廣泛應(yīng)用,LoRa 技術(shù)采用了擴(kuò)頻技術(shù),提高了無線傳輸?shù)臏?zhǔn)確性和可靠性,提高了抗干擾能力和通信效率[5]。同其它的無線通信技術(shù)相比,實(shí)現(xiàn)了普通無線通信技術(shù)無法實(shí)現(xiàn)的在低功耗的情況下的遠(yuǎn)距離傳輸,通信距離遠(yuǎn)使中繼器的數(shù)量大大減少,同時(shí)使硬件成本降低,另外工作在免費(fèi)的頻譜下,利于使用和開發(fā)[6~7]。因此,提出了設(shè)計(jì)一種基于LoRa 的大型公共建筑能耗監(jiān)控系統(tǒng),以適應(yīng)新技術(shù)的發(fā)展,滿足公共建筑能耗監(jiān)控的需求[8~9]。
本次設(shè)計(jì)選用應(yīng)用較為廣泛的智能電表作為能耗計(jì)量裝置進(jìn)行測(cè)試,其與LoRa無線傳輸模塊、主控STM32F407 以及主控外圍電路組成能耗數(shù)據(jù)采集節(jié)點(diǎn)。能耗監(jiān)控節(jié)點(diǎn)由LoRa 無線傳輸模塊、LCD 屏、iTOP-4412 核心板以及核心板對(duì)應(yīng)的底板電路組成。由能耗數(shù)據(jù)采集節(jié)點(diǎn)和能耗監(jiān)控節(jié)點(diǎn)組成的大型公共建筑能耗監(jiān)控系統(tǒng)的總體架構(gòu)[10~11],如圖1所示。
圖1 能耗監(jiān)控系統(tǒng)總體框架圖
首先手動(dòng)設(shè)置智能電表的地址,能耗數(shù)據(jù)采集節(jié)點(diǎn)主控STM32F407 通過RS485 模塊發(fā)送相應(yīng)的地址和命令,獲得相應(yīng)電表的電壓、電流、功率的值,并給這組數(shù)據(jù)加上相應(yīng)電表的標(biāo)號(hào)和簡(jiǎn)單加密處理。將處理后的數(shù)據(jù)通過LoRa無線傳輸模塊向能耗監(jiān)控節(jié)點(diǎn)實(shí)現(xiàn)發(fā)送。能耗監(jiān)控節(jié)點(diǎn)采用iTOP-4412 核心板,通過LoRa 無線傳輸模塊接收數(shù)據(jù)并解析,然后將數(shù)據(jù)顯示到LCD 屏上,接著調(diào)用移植的數(shù)據(jù)庫(kù)SQLite 的函數(shù)接口將能耗數(shù)據(jù)進(jìn)行本地保存,最后利用套接字socket 進(jìn)行網(wǎng)絡(luò)傳輸,將能耗數(shù)據(jù)上傳至服務(wù)器[12]。
以STM32F407 為主控芯片,該芯片具有低功耗、高性價(jià)比、外設(shè)接口豐富等優(yōu)點(diǎn),并且該芯片擁有豐富的固件庫(kù),極大地縮短了開發(fā)周期。STM32最小工作電路以及能耗數(shù)據(jù)采集節(jié)點(diǎn)設(shè)計(jì)所用到I/O口所組成的電路示意圖,如圖2所示。
圖2 STM32電路圖
RS485 通信網(wǎng)絡(luò)中采用主從通信方式,智能電表為從機(jī)。RS485 接口采用差分信號(hào)進(jìn)行傳輸,不需要通過參照點(diǎn)來檢測(cè)傳輸?shù)男盘?hào),只要在傳輸?shù)倪^程中保證兩線之間的電位差就可以了,提高了信號(hào)傳輸?shù)目垢蓴_能力。RS485 通信采用的芯片為SP3485,STM32 的串口USART 通過芯片SP3485 與智能電表通信,獲得智能電表電壓、電流和功率。RS485數(shù)據(jù)采集電路如圖3所示。
圖3 RS485接口電路
能耗監(jiān)控節(jié)點(diǎn)的硬件由核心板和底板組成,采用iTOP-4412 核心板。主要進(jìn)行底板的電路設(shè)計(jì),要結(jié)合核心板進(jìn)行底板電路設(shè)計(jì)。為了敘述方便,統(tǒng)一命名,把iTOP-4412 核心板稱為目標(biāo)機(jī),把開發(fā)和編譯程序的計(jì)算機(jī)稱為主機(jī),以下就不再贅述。能耗監(jiān)控節(jié)點(diǎn)整體設(shè)計(jì)結(jié)構(gòu)圖如圖4所示。
圖4 能耗監(jiān)控節(jié)點(diǎn)整體設(shè)計(jì)結(jié)構(gòu)圖
3.2.1 LCD接口電路
為了將接收到的能耗數(shù)據(jù)進(jìn)行解析并進(jìn)行實(shí)時(shí)顯示,需要設(shè)計(jì)LCD 接口電路。設(shè)計(jì)基于ANSI/TIA/EIA-644 LVDS 接口標(biāo)準(zhǔn)的電路接口連接LCD屏幕低壓差分信號(hào)的傳輸、抗干擾能力比較強(qiáng)、傳輸距離遠(yuǎn)是LVDS 技術(shù)重要特點(diǎn)。采用LVDS 接口的配合軟排線實(shí)現(xiàn)核心板與7 寸LCD 顯示屏之間的數(shù)據(jù)通信。
3.2.2 網(wǎng)絡(luò)接口電路
網(wǎng)卡芯片的型號(hào)選用的是DM9621A,其中已經(jīng)包含了數(shù)據(jù)鏈路層和物理層。但是DM9621A 網(wǎng)卡芯片是USB 接口的芯片,引腳比較少,使用比較方便,不是直接連接到處理器上,而是通過芯片USB3503A連接到處理器上。為了使網(wǎng)絡(luò)傳輸信號(hào)增強(qiáng),傳輸距離更遠(yuǎn),與外部隔離,避免外部的干擾,增強(qiáng)魯棒性。采用網(wǎng)卡和網(wǎng)絡(luò)隔離變壓器HR911105A 設(shè)計(jì)網(wǎng)路接口電路。此時(shí)在Linux 系統(tǒng)上可以通過socket 協(xié)議實(shí)現(xiàn)端到端的數(shù)據(jù)通訊,完成各種網(wǎng)絡(luò)應(yīng)用。
3.2.3 LoRa無線傳輸模塊電路設(shè)計(jì)
LoRa無線傳輸模塊需要與核心板iTOP4412的USB 接口通信,而無線傳輸模塊的接口是串口,接口不同無法直接通信,需要借助通信接口轉(zhuǎn)換電路,作為其通信的橋梁。采用轉(zhuǎn)換芯片CH340G,可以將USB 接口轉(zhuǎn)換為串口。串口通信電路原理如圖5所示。
圖5 串口通信電路
為了實(shí)現(xiàn)能耗數(shù)據(jù)采集節(jié)點(diǎn)的能耗數(shù)據(jù)的采集和發(fā)送功能,編寫相應(yīng)的應(yīng)用程序進(jìn)行實(shí)現(xiàn)。在集成開發(fā)環(huán)境Keil uVision5 新建基于固件庫(kù)的工程,將所用到的文件添加到工程中,最后直接在相應(yīng)的文件下進(jìn)行程序編寫就可以了。
4.1.1 軟件工作流程
單片機(jī)上電程序開始運(yùn)行,首先完成延時(shí)函數(shù)、IO、串口的初始化和中斷優(yōu)先級(jí)分組。然后延時(shí)時(shí)間到,通過串口向智能電表發(fā)送命令,智能電表返回能耗數(shù)據(jù),包括電壓、電流、功率,最后將獲得的能耗數(shù)據(jù)保存到自定義的結(jié)構(gòu)體中,加入編號(hào)并進(jìn)行簡(jiǎn)單的加密,通過LoRa 無線傳輸模塊將能耗數(shù)據(jù)發(fā)送到能耗監(jiān)控節(jié)點(diǎn)[13]。軟件的功能流程圖如圖6所示。
4.1.2 主程序的編寫
首先初始化RS485模塊,本質(zhì)上是初始化該模塊連接的串口,主控上沒有實(shí)際存在的串口,需要將IO 口復(fù)用為串口。將IO 口復(fù)用為串口,配置之前要使能IO 口時(shí)鐘和復(fù)用為的串口的時(shí)鐘。串口發(fā)送相應(yīng)的命令,需要接收能耗數(shù)據(jù),所以要開啟串口的接收中斷。使用函數(shù)RS485_Send_Data 發(fā)送具體的采集命令,在中斷處理函數(shù)USART2_IRQHandler 中實(shí)現(xiàn)接收具體的能耗數(shù)據(jù)。對(duì)接收到的智能電表的電壓、電流、功率的具體數(shù)值,添加電表的編號(hào),并進(jìn)行簡(jiǎn)單的加密處理,然后通過LoRa無線傳輸模塊將數(shù)據(jù)發(fā)送到能耗監(jiān)控節(jié)點(diǎn)。采集命令是定時(shí)發(fā)送的,使用到了延時(shí)函數(shù),要初始化延時(shí)函數(shù),最后實(shí)現(xiàn)相應(yīng)的功能。部分主程序發(fā)送電壓、電流、功率的值如下所示:
void Lora_tx_bytes(uint8_t*TxBuffer,uint8_t Length)
{while(Length--)
{while (RESET==USART_GetFlagStatus (USART3,USART_FLAG_TXE));
USART3->DR=*TxBuffer;
TxBuffer++;}}
圖6 程序設(shè)計(jì)流程圖
4.2.1 嵌入式Linux操作系統(tǒng)的移植
在開發(fā)過程中,由于目標(biāo)機(jī)的硬件資源有限,且外圍的硬件不同,無法直接移植Linux操作系統(tǒng),需要對(duì)源碼根據(jù)目標(biāo)機(jī)的處理器類型和外圍硬件進(jìn)行裁剪,然后編譯成鏡像文件,然后再燒錄到目標(biāo)機(jī)中進(jìn)行運(yùn)行,此時(shí)目標(biāo)機(jī)的運(yùn)行環(huán)境搭建完成[14]。在主機(jī)上進(jìn)行相應(yīng)的軟件開發(fā),交叉編譯后生成的可執(zhí)行文件,然后下載到目標(biāo)機(jī)中,直接在主機(jī)上的串口軟件中輸入命令就可以運(yùn)行軟件。
4.2.2 基于Linux操作系統(tǒng)的應(yīng)用軟件開發(fā)
為了提高編程的效率,對(duì)能耗監(jiān)控節(jié)點(diǎn)的各模塊,采用模塊化編程,提高編程的效率和準(zhǔn)確性,然后將編程好的各模塊進(jìn)行聯(lián)調(diào)。需要對(duì)四大模塊進(jìn)行編程,包括LoRa 無線接收模塊、LCD 顯示模塊、數(shù)據(jù)本地存儲(chǔ)模塊、數(shù)據(jù)上傳服務(wù)器模塊。首先開辟兩個(gè)進(jìn)程,LoRa 無線接收模塊在一個(gè)進(jìn)程中運(yùn)行,剩余的三個(gè)模塊在另外一個(gè)進(jìn)程中運(yùn)行。同一主機(jī)進(jìn)程間通信選擇通信效率較高的共享內(nèi)存,并使用有名信號(hào)量實(shí)現(xiàn)同步,即實(shí)現(xiàn)LoRa無線傳輸模塊先接收能耗數(shù)據(jù),再進(jìn)行顯示、存儲(chǔ)和上傳。
1)LoRa無線接收模塊的編程
在Linix 操作系統(tǒng)上初始化串口和讀寫串口,都是使用文件描述符進(jìn)行相應(yīng)的操作。通過調(diào)用Linux 操作系統(tǒng)提供的open()函數(shù)打開設(shè)備文件,獲取文件描述符,文件描述符是用非負(fù)的整數(shù)來表示。使用自定義函數(shù)int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nStop)來初始化串口,在該函數(shù)中調(diào)用相應(yīng)的函數(shù)實(shí)現(xiàn)串口初始化,設(shè)置串口的波特率、數(shù)據(jù)位、校驗(yàn)位、停止位。部分程序如下所示:
fd = open(“/dev/ttyUSB0”,O_RDWR | O_NOCTTY);//獲得文件描述符
set_opt(fd,115200,8,‘N’,1);//設(shè)置串口的波特率、數(shù)據(jù)位、奇偶校驗(yàn)位、停止位
read(fd,buf,sizeof(buf));//讀取串口接收的消息
2)LCD顯示模塊的編程
對(duì)接收到的能耗數(shù)據(jù)進(jìn)行顯示,需要打開LCD屏對(duì)應(yīng)的設(shè)備文件,獲得文件描述符,然后獲得顯示屏的可變參數(shù),計(jì)算顯示屏的大小,根據(jù)相應(yīng)設(shè)備文件的文件描述符,然后將顯示屏的文件描述符映射到用戶空間,在用戶空間得到操作顯示屏的指針,此時(shí)就可以操作顯示屏了,部分程序如下所示:
fbfd=open(“/dev/fb0”,O_RDWR);//獲得文件描述符
ioctl(fbfd,F(xiàn)BIOGET_VSCREENINFO,&vinfo);//獲得顯示屏的可變參數(shù)
screensize=vinfo.xres_virtual*vinfo.yres_virtual*vinfo.bits_per_pixel/8;//計(jì)算顯示屏的虛
//擬大小
fbp=(char*) mmap (0, screensize,PROT_READ|PROT_WRITE,MAP_SHARED,fbfd,0);
//完成映射
3)數(shù)據(jù)存儲(chǔ)模塊編程
將數(shù)據(jù)庫(kù)SQLite移植到目標(biāo)機(jī)中,數(shù)據(jù)庫(kù)移植完后,將接收到的能耗數(shù)據(jù)解析顯示之后,就可以直接調(diào)用數(shù)據(jù)庫(kù)的函數(shù)接口,對(duì)能耗數(shù)據(jù)進(jìn)行本地存儲(chǔ)。在使用數(shù)據(jù)庫(kù)之前,要調(diào)用函數(shù)打開數(shù)據(jù)庫(kù)和創(chuàng)建表,在基礎(chǔ)上才可進(jìn)行能耗數(shù)據(jù)的插入、刪除、修改、查找,調(diào)用數(shù)據(jù)庫(kù)源碼,部分函數(shù)如下所示:
opensql(char*devpath);//打開數(shù)據(jù)庫(kù)
createtable(char*table_name);//創(chuàng)建表
sqlinsert(char*table_name,RecordData*rd);//插入
4)數(shù)據(jù)上傳模塊的編程
將目標(biāo)機(jī)接收到的能耗數(shù)據(jù),上傳到主機(jī)上搭建的服務(wù)器,這屬于不同主機(jī)間進(jìn)程間通信,通信方式選用套接字socket[15~16]。選用TCP 協(xié)議實(shí)現(xiàn)客戶端與服務(wù)器的通信。編寫的TCP 服務(wù)器程序?qū)崿F(xiàn)消息的循環(huán)接收,部分TCP 服務(wù)器程序如下所示:
int TcpServerInit()
{servFd=socket(PF_INET,SOCK_STREAM,0);//創(chuàng)建套接字
bind(servFd,(struct sockaddr*)&servAddr,sizeof(servAddr));//綁定IP地址和端口號(hào)
listen(servFd,10);//創(chuàng)建監(jiān)聽隊(duì)列
}
編寫的TCP客戶端程序?qū)崿F(xiàn)消息的循環(huán)發(fā)送,部分TCP客戶端程序如下所示:
cliFd=socket(PF_INET,SOCK_STREAM,0);//創(chuàng)建套接字connect(cliFd,(struct sockaddr*)&servAddr,sizeof(servAddr));//請(qǐng)求連接
目前為止,基本完成了能耗監(jiān)控系統(tǒng)的開發(fā),包括硬件設(shè)計(jì)和軟件設(shè)計(jì),接下來就是進(jìn)行整體測(cè)試。測(cè)試能耗數(shù)據(jù)的顯示、存儲(chǔ)、上傳。將能耗數(shù)據(jù)采集節(jié)點(diǎn)放在實(shí)驗(yàn)樓進(jìn)行采集智能電表的數(shù)據(jù),然后將能耗數(shù)據(jù)進(jìn)行發(fā)送;能耗數(shù)據(jù)監(jiān)控節(jié)點(diǎn)選擇相應(yīng)的距離,然后接收能耗數(shù)據(jù),并實(shí)現(xiàn)能耗數(shù)據(jù)的顯示、存儲(chǔ)、上傳。
1)能耗數(shù)據(jù)顯示測(cè)試
能耗監(jiān)控節(jié)點(diǎn)通過LoRa無線傳輸模塊接收能耗數(shù)據(jù),首先對(duì)接收到的能耗數(shù)據(jù)進(jìn)行解析,然后在LCD屏上進(jìn)行顯示,顯示結(jié)果如圖7所示。
圖7 LCD顯示結(jié)果
2)能耗數(shù)據(jù)本地存儲(chǔ)測(cè)試
在目標(biāo)機(jī)上移植了SQLite數(shù)據(jù)庫(kù),可以調(diào)用保存能耗數(shù)據(jù)的函數(shù)接口,對(duì)能耗數(shù)據(jù)進(jìn)行存儲(chǔ)。在目標(biāo)機(jī)上無法打開存儲(chǔ)的能耗數(shù)據(jù)的數(shù)據(jù)庫(kù)文件,需要將生成保存能耗數(shù)據(jù)的文件傳輸?shù)街鳈C(jī)上,然后利用相應(yīng)的軟件SQLite 打開該文件查看保存的能耗數(shù)據(jù)。結(jié)果如圖8所示。
圖8 能耗數(shù)據(jù)存儲(chǔ)
3)能耗數(shù)據(jù)上傳服務(wù)器測(cè)試
在主機(jī)的Linux 操作系統(tǒng)環(huán)境下進(jìn)行測(cè)試,首先在Linux 操作系統(tǒng)上ping 通目標(biāo)機(jī),然后編譯并運(yùn)行所編寫的TCP服務(wù)器應(yīng)用程序,此時(shí)就可以等待接收能耗數(shù)據(jù)。將接收到的能耗數(shù)據(jù)進(jìn)行解析,然后將智能電表的編號(hào)、電壓、電流、功率進(jìn)行顯示。TCP 服務(wù)器接收到的能耗數(shù)據(jù)顯示,如圖9 所示。
圖9 主機(jī)Linux開發(fā)環(huán)境的TCP服務(wù)器
隨著LoRa 無線通信技術(shù)的不斷成熟,實(shí)現(xiàn)了長(zhǎng)距離和低功耗,是其它無線通信技術(shù)無法滿足的。設(shè)計(jì)了一種基于LoRa的大型公共建筑能耗監(jiān)控系統(tǒng),該系統(tǒng)包括能耗數(shù)據(jù)采集節(jié)點(diǎn)和能耗監(jiān)控節(jié)點(diǎn)。能耗數(shù)據(jù)采集節(jié)點(diǎn)實(shí)現(xiàn)能耗數(shù)據(jù)的采集和發(fā)送,能耗數(shù)據(jù)包括電流、電壓、功率,然后將能耗數(shù)據(jù)封裝和加密,通過LoRa 無線傳輸模塊將能耗數(shù)據(jù)發(fā)送到能耗監(jiān)控節(jié)點(diǎn)。能耗監(jiān)控節(jié)點(diǎn)通過Lo-Ra 無線傳輸模塊將能耗數(shù)據(jù)接收并解析,然后將數(shù)據(jù)進(jìn)行顯示、存儲(chǔ)、上傳。本能耗監(jiān)控系統(tǒng)成本低、通信距離遠(yuǎn)、抗干擾能力強(qiáng)、部署方便并且應(yīng)用場(chǎng)景廣闊。