杜政隆,謝麗明,王飛飛
(平頂山學(xué)院 信息工程學(xué)院,河南 平頂山 467000)
近年來,我國境內(nèi)出現(xiàn)暴雨的次數(shù)越來越多,所造成的經(jīng)濟(jì)損失不可估量,而且暴雨期間洪澇災(zāi)害的發(fā)生概率也大大增加。因此亟需建立一個完善的水位監(jiān)測系統(tǒng),讓人們可以及時直觀地了解水位數(shù)據(jù),對預(yù)防洪澇災(zāi)害有極大的幫助[1]。目前,許多地方仍采用人工水位監(jiān)測方式,個別地方雖采用了水位監(jiān)測系統(tǒng),但還存在諸多問題,如:設(shè)備通信覆蓋不完全;受老舊設(shè)備影響,水位信息不精確;不能直觀實時分析各個節(jié)點的水位數(shù)據(jù)等?;诖?,本文設(shè)計了基于單片機(jī)的水位監(jiān)測系統(tǒng),可應(yīng)用于水庫、天氣水文監(jiān)測站等實際場地,工作人員可根據(jù)需求在移動端對水位數(shù)據(jù)進(jìn)行實時監(jiān)測,設(shè)置預(yù)警水位,若超出預(yù)警水位,系統(tǒng)會及時發(fā)出警告,保證民眾的安全[2]。
本系統(tǒng)根據(jù)所需功能主要設(shè)計了數(shù)據(jù)采集端、服務(wù)器端和上位機(jī)端。數(shù)據(jù)采集端有多個節(jié)點,每個節(jié)點連接LCD顯示屏、水位傳感器和蜂鳴器。采用水位傳感器進(jìn)行水位數(shù)據(jù)采集、LCD顯示屏進(jìn)行數(shù)據(jù)顯示。當(dāng)水位數(shù)據(jù)超過安全閾值時,LCD顯示屏?xí)敵鰣缶畔?,蜂鳴器進(jìn)行報警。數(shù)據(jù)采集端和服務(wù)器端之間通過UDP進(jìn)行數(shù)據(jù)通信,將水位數(shù)據(jù)存儲到數(shù)據(jù)庫中。上位機(jī)端從服務(wù)器端的數(shù)據(jù)庫中調(diào)取水位數(shù)據(jù),實現(xiàn)可視化數(shù)據(jù)實時展示功能[3]、歷史數(shù)據(jù)展示功能和超過安全閾值報警功能。系統(tǒng)總體框架如圖1所示。
圖1 水位監(jiān)測系統(tǒng)總體框架
水位監(jiān)測系統(tǒng)主要包括數(shù)據(jù)采集端、服務(wù)器端和上位機(jī)端。設(shè)備與服務(wù)器端之間使用WiFi模塊進(jìn)行UDP通信[4]。系統(tǒng)用戶通過上位機(jī)端對水位數(shù)據(jù)進(jìn)行實時監(jiān)測。系統(tǒng)功能模塊如圖2所示。
圖2 水位監(jiān)測系統(tǒng)功能模塊
本系統(tǒng)有多個節(jié)點,以一個節(jié)點為例進(jìn)行說明。系統(tǒng)硬件設(shè)備的主控單元芯片采用ESPDuino芯片。在ESPDuino單片機(jī)上集成Arduino模塊和WiFi模塊,ESPDuino單片機(jī)連接MSP20水位傳感器、LCD1602顯示屏與蜂鳴器,LCD1602顯示屏顯示當(dāng)前節(jié)點的水位信息,當(dāng)水位超過安全閾值時,顯示屏?xí)@示報警信息,且蜂鳴器會發(fā)出報警。將單片機(jī)設(shè)為AP模式通過WiFi連接指定路由器,通過UDP協(xié)議將采集到的數(shù)據(jù)傳輸至服務(wù)器端[5]。數(shù)據(jù)采集端節(jié)點結(jié)構(gòu)如圖3所示。
圖3 數(shù)據(jù)采集端結(jié)構(gòu)
系統(tǒng)運行過程中,將MSP20水位傳感器的測量橡膠管插入水庫或雨量筒中[6],每隔5 s測量一次水位,水位數(shù)據(jù)顯示在LCD屏幕上。當(dāng)水位超出預(yù)設(shè)的安全閾值時,LCD屏幕顯示報警信息且通過蜂鳴器進(jìn)行報警[7]。
數(shù)據(jù)采集端的程序設(shè)計根據(jù)Arduino的編程特點,分為初始化程序設(shè)計和循環(huán)程序設(shè)計。初始化程序中首先調(diào)用LiquidCrystal_I2C.h庫函數(shù)的lcd.init()函數(shù)和lcd.backlight()函數(shù)分別進(jìn)行顯示屏初始化和打開LCD顯示屏的背光,之后使用pinMode()函數(shù)將連接蜂鳴器定義的引腳設(shè)為輸出模式,并通過digitalWrite()設(shè)置蜂鳴器的初始狀態(tài)完成蜂鳴器的初始化。同時通過Serial.begin(9600)的函數(shù)調(diào)用設(shè)置串口波特率,最后調(diào)用WiFi.mode()將WiFi設(shè)為AP模式,Udp.begin()開始UDP端口偵聽。初始化程序流程如圖4所示。
圖4 初始化程序流程
循環(huán)程序中首先使用analogRead()讀取A0引腳的數(shù)據(jù),通過公式轉(zhuǎn)換成實際需要的水位數(shù)據(jù),然后設(shè)置安全閾值判斷水位數(shù)據(jù)是否超過閾值。若超過閾值,調(diào)用lcd.print()函數(shù)在LCD顯示屏上顯示當(dāng)前水位信息和報警信息,同時通過digitalWrite()函數(shù)設(shè)置蜂鳴器高低電平使蜂鳴器進(jìn)行報警;若沒有超過閾值則LCD屏正常顯示水位數(shù)據(jù)。最后通過設(shè)置判斷語句來判斷是否接收到上位機(jī)發(fā)來的數(shù)據(jù),如果接收到信息,通過Udp.beginPacket()、Udpwrite()以及Udp.endPacket()函數(shù)完成開始發(fā)送包數(shù)據(jù)、寫入包數(shù)據(jù)、結(jié)束發(fā)送包數(shù)據(jù)三個步驟。循環(huán)程序流程如圖5所示。
圖5 循環(huán)程序流程
服務(wù)器端首先建立UDP端點,用來接收和發(fā)送數(shù)據(jù)包;然后通過打包數(shù)據(jù)發(fā)送給數(shù)據(jù)采集端,數(shù)據(jù)采集端接收到數(shù)據(jù)包就會將水位數(shù)據(jù)打包發(fā)送給服務(wù)器端;服務(wù)器端通過創(chuàng)建數(shù)據(jù)包來接收水位數(shù)據(jù),并連接指定IP的數(shù)據(jù)庫,將水位數(shù)據(jù)存儲到指定表的指定字段中。具體流程如圖6所示。
圖6 服務(wù)器端程序流程
服務(wù)器端以jsp項目為主體、JAVA語言為主要編程語言。項目首先通過DatagramSocket()建立UDP Socket端點,并 通 過 DatagramPacket(byte[]buf,int length,InetAddress address,int port)提供數(shù)據(jù)封裝打包,inport里填入節(jié)點的IP地址,封裝打包完成后使用send()方法進(jìn)行數(shù)據(jù)包的發(fā)送,發(fā)送完成后調(diào)用close()方法關(guān)閉資源;然后調(diào)用udpsend()方法獲得節(jié)點的水位數(shù)據(jù),同時調(diào)用SimpleDateFormat()方法獲取當(dāng)前時間,取得所有所需的數(shù)據(jù)后進(jìn)行數(shù)據(jù)庫插入;最后使用 Class.forName(“com.mysql.jdbc.Driver”)方法驅(qū)動DriverManager.getConnection()取得正確的數(shù)據(jù)庫IP、數(shù)據(jù)庫用戶名和密碼后,執(zhí)行數(shù)據(jù)庫插入命令。
本系統(tǒng)的上位機(jī)端基于HTML5、Python語言,創(chuàng)建Flask項目。使用route()函數(shù)來記錄頁面路由,直接訪問所要到達(dá)的頁面,并調(diào)用pymysql.connect()實現(xiàn)從數(shù)據(jù)庫中調(diào)取節(jié)點水位數(shù)據(jù)以及時間數(shù)據(jù),且當(dāng)水位數(shù)據(jù)超過安全閾值時在數(shù)據(jù)可視化展示頁面中輸出報警信息彈窗。
水位數(shù)據(jù)匯總頁面使用pymysql.connect{}連接數(shù)據(jù)庫IP和指定的表,使用datalist.append()將數(shù)據(jù)表進(jìn)行展示,并在頁面中使用HTML5語言
圖7 水位數(shù)據(jù)匯總頁面
為更直觀地看到數(shù)據(jù)變化趨勢,本系統(tǒng)在數(shù)據(jù)可視化展示頁面中使用了ECharts可視化功能,將節(jié)點水位數(shù)據(jù)進(jìn)行了可視化展示[8]。ECharts技術(shù)在本網(wǎng)頁中使用的是折線圖,通過定義option{}來設(shè)置折線圖的參數(shù)。用title{text:}設(shè)置標(biāo)題,legend{“節(jié)點1”,“節(jié)點2”}來設(shè)置兩個可以點擊的按鈕以顯示指定折線圖,x軸上用data:{}方法指定數(shù)據(jù)表中的字段,y軸同樣使用data:{}方法指定數(shù)據(jù)表中的字段。數(shù)據(jù)可視化頁面如圖8所示。
圖8 數(shù)據(jù)可視化頁面
在數(shù)據(jù)可視化頁面,當(dāng)水位數(shù)據(jù)超過安全閾值時會通過彈窗進(jìn)行報警來提示工作人員。在本頁面中設(shè)置一個判斷語句,如果y軸中的數(shù)據(jù)超過指定安全閾值,使用window.open()函數(shù)彈出一個含有報警信息的彈窗。超出安全閾值時報警頁面[9-10]如圖9所示。
圖9 水位報警頁面
本文的系統(tǒng)能夠有效實時地對水位數(shù)據(jù)進(jìn)行監(jiān)測,可以省去高額的人工成本,并加快水位信息的傳輸速度;水文系統(tǒng)的工作人員不用在各個地方手工統(tǒng)計水位信息,只需在上位機(jī)端通過網(wǎng)頁訪問進(jìn)行水位信息統(tǒng)計,也可以訪問歷史水位信息,必要時可以去監(jiān)測點觀測顯示屏來查看水位信息;且當(dāng)水位超出安全閾值時系統(tǒng)會自動報警,可以有效地減輕水位監(jiān)測工作人員的負(fù)擔(dān)。但系統(tǒng)硬件設(shè)備長時間安裝在潮濕環(huán)境中,會加快硬件設(shè)備的損耗,這是后續(xù)研究中需要改善的地方。