杜政隆,謝麗明,王飛飛
(平頂山學院 信息工程學院,河南 平頂山 467000)
近年來,我國境內出現暴雨的次數越來越多,所造成的經濟損失不可估量,而且暴雨期間洪澇災害的發生概率也大大增加。因此亟需建立一個完善的水位監測系統,讓人們可以及時直觀地了解水位數據,對預防洪澇災害有極大的幫助[1]。目前,許多地方仍采用人工水位監測方式,個別地方雖采用了水位監測系統,但還存在諸多問題,如:設備通信覆蓋不完全;受老舊設備影響,水位信息不精確;不能直觀實時分析各個節點的水位數據等。基于此,本文設計了基于單片機的水位監測系統,可應用于水庫、天氣水文監測站等實際場地,工作人員可根據需求在移動端對水位數據進行實時監測,設置預警水位,若超出預警水位,系統會及時發出警告,保證民眾的安全[2]。
本系統根據所需功能主要設計了數據采集端、服務器端和上位機端。數據采集端有多個節點,每個節點連接LCD顯示屏、水位傳感器和蜂鳴器。采用水位傳感器進行水位數據采集、LCD顯示屏進行數據顯示。當水位數據超過安全閾值時,LCD顯示屏會輸出報警信息,蜂鳴器進行報警。數據采集端和服務器端之間通過UDP進行數據通信,將水位數據存儲到數據庫中。上位機端從服務器端的數據庫中調取水位數據,實現可視化數據實時展示功能[3]、歷史數據展示功能和超過安全閾值報警功能。系統總體框架如圖1所示。

圖1 水位監測系統總體框架
水位監測系統主要包括數據采集端、服務器端和上位機端。設備與服務器端之間使用WiFi模塊進行UDP通信[4]。系統用戶通過上位機端對水位數據進行實時監測。系統功能模塊如圖2所示。

圖2 水位監測系統功能模塊
本系統有多個節點,以一個節點為例進行說明。系統硬件設備的主控單元芯片采用ESPDuino芯片。在ESPDuino單片機上集成Arduino模塊和WiFi模塊,ESPDuino單片機連接MSP20水位傳感器、LCD1602顯示屏與蜂鳴器,LCD1602顯示屏顯示當前節點的水位信息,當水位超過安全閾值時,顯示屏會顯示報警信息,且蜂鳴器會發出報警。將單片機設為AP模式通過WiFi連接指定路由器,通過UDP協議將采集到的數據傳輸至服務器端[5]。數據采集端節點結構如圖3所示。

圖3 數據采集端結構
系統運行過程中,將MSP20水位傳感器的測量橡膠管插入水庫或雨量筒中[6],每隔5 s測量一次水位,水位數據顯示在LCD屏幕上。當水位超出預設的安全閾值時,LCD屏幕顯示報警信息且通過蜂鳴器進行報警[7]。
數據采集端的程序設計根據Arduino的編程特點,分為初始化程序設計和循環程序設計。初始化程序中首先調用LiquidCrystal_I2C.h庫函數的lcd.init()函數和lcd.backlight()函數分別進行顯示屏初始化和打開LCD顯示屏的背光,之后使用pinMode()函數將連接蜂鳴器定義的引腳設為輸出模式,并通過digitalWrite()設置蜂鳴器的初始狀態完成蜂鳴器的初始化。同時通過Serial.begin(9600)的函數調用設置串口波特率,最后調用WiFi.mode()將WiFi設為AP模式,Udp.begin()開始UDP端口偵聽。初始化程序流程如圖4所示。

圖4 初始化程序流程
循環程序中首先使用analogRead()讀取A0引腳的數據,通過公式轉換成實際需要的水位數據,然后設置安全閾值判斷水位數據是否超過閾值。若超過閾值,調用lcd.print()函數在LCD顯示屏上顯示當前水位信息和報警信息,同時通過digitalWrite()函數設置蜂鳴器高低電平使蜂鳴器進行報警;若沒有超過閾值則LCD屏正常顯示水位數據。最后通過設置判斷語句來判斷是否接收到上位機發來的數據,如果接收到信息,通過Udp.beginPacket()、Udpwrite()以及Udp.endPacket()函數完成開始發送包數據、寫入包數據、結束發送包數據三個步驟。循環程序流程如圖5所示。

圖5 循環程序流程
服務器端首先建立UDP端點,用來接收和發送數據包;然后通過打包數據發送給數據采集端,數據采集端接收到數據包就會將水位數據打包發送給服務器端;服務器端通過創建數據包來接收水位數據,并連接指定IP的數據庫,將水位數據存儲到指定表的指定字段中。具體流程如圖6所示。

圖6 服務器端程序流程
服務器端以jsp項目為主體、JAVA語言為主要編程語言。項目首先通過DatagramSocket()建立UDP Socket端點,并 通 過 DatagramPacket(byte[]buf,int length,InetAddress address,int port)提供數據封裝打包,inport里填入節點的IP地址,封裝打包完成后使用send()方法進行數據包的發送,發送完成后調用close()方法關閉資源;然后調用udpsend()方法獲得節點的水位數據,同時調用SimpleDateFormat()方法獲取當前時間,取得所有所需的數據后進行數據庫插入;最后使用 Class.forName(“com.mysql.jdbc.Driver”)方法驅動DriverManager.getConnection()取得正確的數據庫IP、數據庫用戶名和密碼后,執行數據庫插入命令。
本系統的上位機端基于HTML5、Python語言,創建Flask項目。使用route()函數來記錄頁面路由,直接訪問所要到達的頁面,并調用pymysql.connect()實現從數據庫中調取節點水位數據以及時間數據,且當水位數據超過安全閾值時在數據可視化展示頁面中輸出報警信息彈窗。
水位數據匯總頁面使用pymysql.connect{}連接數據庫IP和指定的表,使用datalist.append()將數據表進行展示,并在頁面中使用HTML5語言

圖7 水位數據匯總頁面
為更直觀地看到數據變化趨勢,本系統在數據可視化展示頁面中使用了ECharts可視化功能,將節點水位數據進行了可視化展示[8]。ECharts技術在本網頁中使用的是折線圖,通過定義option{}來設置折線圖的參數。用title{text:}設置標題,legend{“節點1”,“節點2”}來設置兩個可以點擊的按鈕以顯示指定折線圖,x軸上用data:{}方法指定數據表中的字段,y軸同樣使用data:{}方法指定數據表中的字段。數據可視化頁面如圖8所示。

圖8 數據可視化頁面
在數據可視化頁面,當水位數據超過安全閾值時會通過彈窗進行報警來提示工作人員。在本頁面中設置一個判斷語句,如果y軸中的數據超過指定安全閾值,使用window.open()函數彈出一個含有報警信息的彈窗。超出安全閾值時報警頁面[9-10]如圖9所示。

圖9 水位報警頁面
本文的系統能夠有效實時地對水位數據進行監測,可以省去高額的人工成本,并加快水位信息的傳輸速度;水文系統的工作人員不用在各個地方手工統計水位信息,只需在上位機端通過網頁訪問進行水位信息統計,也可以訪問歷史水位信息,必要時可以去監測點觀測顯示屏來查看水位信息;且當水位超出安全閾值時系統會自動報警,可以有效地減輕水位監測工作人員的負擔。但系統硬件設備長時間安裝在潮濕環境中,會加快硬件設備的損耗,這是后續研究中需要改善的地方。