












摘 要:為解決高校學生用水、用電安全問題,設計實現了一個基于物聯網技術、低功耗無線通信技術、大數據云平臺的學生宿舍水電智能監測系統。以STM32F103單片機為核心處理器,通過水壓、電流傳感器實現對水壓、電流的監測,通過紅外傳感器模塊實現對宿舍人員數量的監控,通過WiFi模塊把數據上傳至華為云平臺。輸出信號由單片機采集,水壓、電流值在液晶顯示屏上顯示。管理員通過Web端對宿舍水電進行實時監測,以保障宿舍人員用水、用電安全。該系統具有體積小、功耗低等優點,可以降低能耗并保障高校宿舍用水、用電安全。
關鍵詞:智能監測;STM32;華為云平臺;物聯網;大數據;無線通信
中圖分類號:TP212.6 文獻標識碼:A 文章編號:2095-1302(2025)04-000-06
0 引 言
隨著我國高等教育事業的飛速發展,高校已經成為了我國資源消耗大戶。截至2021年9月30日,我國普通高等學校共有2 756所,在校人數3 285.3萬人。住房城鄉建設部會同財政部和教育部陸續制定并發布了一系列相關技術標準,眾多高校建立了一批節能監管平臺,然而,現階段高校學生用水、用電情況仍不容樂觀,用電不當導致宿舍起火,甚至導致學生死亡的事故頻頻發生。
智能水電監測即利用物聯網技術,配合華為云平臺,實現對宿舍用水、用電安全的監測,并對宿舍進行智能化管理。該系統可以培養學生節約水電的意識,提高信息傳遞的效率,降低事故發生率及損失,在宿舍監督管理、提升現代化宿舍安全意識方面,具有良好的社會效益和應用前景。
伴隨著物聯網、人工智能、無線通信、大數據等技術的高速發展,高校有必要引進智慧水電管理系統,通過在宿舍水電閘門安裝必要的傳感器從而實現對用水、用電的監控。該系統的使用在保證人身安全的同時,能夠達到節約能源的目標,對資源配置、環境建設等具有重大意義。
1 系統組成
宿舍水電監測系統如圖1所示。主控芯片采用STM32F103,該微控制器采用Cortex-M3內核,CPU最高速度達72 MHz,具有16 KB~1 MB FLASH、多種控制外設、USB全速接口和CAN。該系統采用高精度、低功耗的濕度傳感器采集濕度數據,采用水壓、電流傳感器采集水流、電壓數據。硬件終端采集數據并定時發送至華為云平臺(注冊的用戶可通過Web端查詢數據[1-4])。宿舍水電監測系統結構如圖2所示。
1.1 人員計數系統
設計基于單片機的人體計數系統,根據紅外傳感器的檢測情況和對單片機數據的處理情況,對人員進出方向進行判斷并準確計數,并通過無線通信技術進行實時反饋。管理者可以通過Web端或手機APP端實時掌握宿舍人員數量,對無人的宿舍進行相關監測。
1.2 室內漏水監測及警報系統
當室內人員數量為0時該漏水監測及報警系統開始工作。控制單元由低成本的嵌入式最小控制系統構成,負責采集來自檢測單元的漏水監測終端的異常信息,對信號的可靠性進行判斷,并將信號輸出到報警單元。控制單元利用室內無線局域網或移動網接入,將異常信息發送到后臺系統服務器,以提醒管理員。
1.3 室內用電情況監測系統
該系統可以實現以下功能:監測學生宿舍的用電情況,并可以通過Web端管理平臺提供詳細的圖形化數據及分析報告,使宿舍每個時間段的用電情況一目了然。用電異常時可通過系統進行彈窗、圖形告警,通知管理員對用電異常的區間進行異常排查。
1.4 Web端和手機APP端管理平臺開發
設計一個和水電各類數據有關的監測程序。Web端和手機APP端為用戶管理界面。管理員可以通過Web端或手機APP端與系統服務器管理平臺網絡連接,實現對學生宿舍實時用水、用電安全的遠程監測與管理。
2 硬件系統設計
紅外計數模塊由STM32F103單片機核心板電路、TFT 1.44英寸彩屏液晶顯示電路、2路紅外探頭信號檢測電路、WiFi模塊、蜂鳴器報警電路、按鍵電路及電源組成。
交流電壓電流監測模塊由STM32F103單片機核心板電路、交流電壓電流檢測模塊電路、WiFi模塊電路、指示燈電路組成。
濕度檢測模塊由STM32單片機核心板電路、土壤濕度傳感器模塊電路、WiFi模塊電路組成[5-9]。
2.1 E18-D80NK紅外傳感器模塊電路設計
E18-D80NK-N是一種集發射與接收于一體的光電傳感器。信號經過調制后輸入,再由接收頭解調輸出,有效避免了可見光的干擾。該傳感器具有探測距離遠、受可見光干擾小、價格低廉、裝配難度低、使用方便等特點,可以廣泛應用于機器人避障、流水線計件等場合。E18-D80NK光電傳感器模塊原理如圖3所示。
2.2 ESP8266 WiFi模塊電路設計
串口WiFi模塊為新一代嵌入式WiFi模塊,體積小,功耗低,采用UART接口。串口WiFi模塊基于通用串行接口特性,符合IEEE802.11協議棧網絡標準,內置TCP/IP協議棧,便于傳統串口設備更好地加入無線網絡。
ESP8266是一款超低功耗模塊,專為移動設備和互聯網應用設計,其將用戶的物理設備連接到WiFi無線網絡進行互聯網或局域網通信,可廣泛應用于智能電網、智能交通、智能家具、工業控制等領域。ESP8266 WiFi模塊電路原理如圖4所示。
2.3 交流電壓、電流互感器模塊電路設計
交流電壓、電流互感器模塊通過交流電壓互感器(TV1005M)和交流電流互感器(TA1005M)來檢測交流電壓和交流電流值,并通過5 V繼電器電路完成切斷。交流電壓、電流互感器模塊電路結構如圖5所示。
交流電壓、電流互感器模塊電路原理如圖6所示。R1為限流電阻;D1、D2為二極管,單向導電;電容均用于濾波,使信號更加平穩;R2、R3為分壓電阻,將采集的模擬信號轉化為電壓信號;LED2為電源指示燈;R6為限流電阻,用于保護LED2燈;J1為220 V交流電輸入接口;J2為負載輸入接口;RL1為5 V繼電器,本文設計的電路中,由于單片機引腳的電流驅動能力不足以實現繼電器的通斷,所以使用9012三極管作為驅動元件驅動繼電器,考慮到繼電器閉合或者斷開瞬間會產生反向感應電動勢,損害三極管,因此通過1N4007二極管消除反向電動勢以保護三極管;LED1為繼電器是否閉合指示燈,如果繼電器閉合,則指示燈亮,否則指示燈滅;R4為限流電阻,用來保護LED1;R5為限流電阻,用來保護三極管,當控制引腳RY1為高電平時,繼電器閉合。交流電壓、電流互感器模塊電路接口如圖7所示。
系統主要采用Keil μVision5軟件調試程序,程序選用C語言編寫。交流電壓、電流互感器模塊電路運行流程如圖8所示。通過PL2303串口燒寫模塊實現對單片機程序的燒寫[10]。
2.4 漏水監測模塊電路設計
濕度傳感器原理如圖9所示。
宿舍用水、用電監測系統實物如圖10所示。
3 軟件系統設計
3.1 前端數據顯示和預警
項目使用網站顯示監控數據,基于SpringMVC框架實現注冊登錄的邏輯,便于不同的用戶獲取個人監控數據。對于注冊功能,成功注冊的用戶信息會被同步保存到用戶數據庫中;對于登錄功能,前端輸入的學號、密碼會與數據庫中的用戶信息進行對比,以得到該用戶的宿舍號,此時前端跳轉頁面顯示該用戶宿舍的水電監控信息。前端頁面如圖11所示。
注冊登錄的部分邏輯代碼如下:
private static ResourceBundle rb=ResourceBundle.getBundle(\"com.jmp.util.db-config\");
/*加載數據庫配置文件中的連接信息*/
static
{URL=rb.getString(\"jdbc.url\");
USERNAME=rb.getString(\"jdbc.username\");
PASSWORD=rb.getString(\"jdbc.password\");
DRIVER=rb.getString(\"jdbc.driver\");
try
{Class.forName(DRIVER);}
catch(ClassNotFoundException e)
{e.printStackTrace();}}
/***創建數據庫連接*@return*/
public static Connection getConnection()
{Connection con=1;
try
{con=DriverManager.getConnection(URL,USERNAME,PASSWORD);}
catch(SQLException e)
{e.printStackTrace();
System.out.println(\"數據庫連接失敗,請檢查數據庫地址、用戶名、密碼是否存在錯誤!!!\");}
return con;}
/*創建模型對象*/
public class RoomNumber
{private String room_id;
private String now_time;
private int enter_number;
private int departures_number;
private int now_number;
public RoomNumber(String room_id,String now_time,int enter_number,int departures_number,int now_number)
{this.room_id=room_id;
this.now_time=now_time;
this.enter_number=enter_number;
this.departures_number=departures_number;
this.now_number=now_number;}
public String getRoom_id()
{return room_id;}
public void setRoom_id(String room_id)
{this.room_id=room_id;}
public String getNow_time()
{return now_time;}
public void setNow_time(String now_time)
{this.now_time=now_time;}
public int getEnter_number()
{return enter_number;}
public void setEnter_number(int enter_number)
{this.enter_number=enter_number;}
public int getDepartures_number()
{return departures_number;}
public void setDepartures_number(int departures_number)
{this.departures_number=departures_number;}
public int getNow_number()
{return now_number;}
public void setNow_number(int now_number)
{this.now_number=now_number;}
@Override
public String toString()
{return \"RoomElectricity
{\"+\"Room_id=\"+room_id+\",now_time='\"+now_time+'\''+\", enter_number='\"+enter_number+'\''+\",departures_number='\"+departures_number+'\''+\",now_number='\"+now_number+'\''+''};}}
對于數據顯示頁面,本項目使用HTML、JSP、CSS設計了監控數據顯示臺。
在JSP中獲取連接數據庫、查詢數據的代碼如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
{String m=request.getParameter(\"m\");
if(\"getNumber\".equals(m))
{getNumber(request,response);}
else if(\"getElectricity\".equals(m))
{getElectricity(request, response);}}
private void getNumber(HttpServletRequest request, HttpServlet Response response)
{String keyName=request.getParameter(\"roomname\");
RoomNumber roomNumber=new RoomNumber();
roomNumber.setRoom_id(keyName);
//System.out.println(keyName);
System.out.println(\"Here2!\");
try
{Listlt;RoomNumbergt;roomList=RoomService.getNumber (roomNumber);
//System.out.println(roomList);
request.setAttribute(\"roomList\",roomList);
System.out.println(request);
request.getRequestDispatcher(\"/Views/home.jsp\").forward(request, response);
//System.out.println(response);}
catch(Exception e)
{e.printStackTrace();}}
查詢MySQL數據代碼:
static ResourceBundle rb=ResourceBundle.getBundle(\"com.jmp.dao.book-sql\");
public RoomDaoImpl()
{//創建BookDaoImpl對象時加載QueryRunner
qr = new QueryRunner();}
@Override
public Listlt;RoomNumbergt;getNumber(RoomNumber roomNumber) throws SQLException
{String sql=rb.getString(\"room.sql.getNumber\");
Listlt;RoomNumbergt;list=qr.query(DBUtil.getConnection(), sql,roomNumber.getRoom_id(),new BeanListHandlerlt;gt;(RoomNumber.class));
//System.out.println(sql);
System.out.println(list);
return list;}
在JSP中調用接口查詢數據庫數據:
lt;script src=\"https://code.jquery.com/jquery-3.6.0.min.js\"gt;lt;/scriptgt;lt;scriptgt;
//在頁面加載時立即執行的請求代碼
$.ajax
({url:\"/RoomServlet\",method:\"GET\",data:
{m:\"getNumber\",roomname:\"T2C7091\"},
success: function(response)
{//處理響應
console.log(response);
}//輸出響應內容到控制臺
error:function(xhr,status,error)
{//處理錯誤
console.log(\"請求錯誤:\"+status);}});
print(response);
lt;/scriptgt;
3.2 數據庫設計
本項目使用MySQL數據庫,分別建立了監控數據庫和用戶信息數據庫。監控數據庫下有2個Table,分別用于存儲房間人數和用電情況。用戶數據庫包括學號、密碼、宿舍號(房間號)。數據庫頁面如圖12所示。
3.3 后端數據上傳和存儲
本文項目使用了一臺帶公網IP的華為云服務器作為服務端,并建立了MySQL數據庫,可通過公網IP進行訪問。同時,本文項目使用Socket搭建了TCP服務端,用于接收來自下位機的數據,并以事先設定好的數據格式對數據進行解析(本項目采用的是JSON格式),使用GSON包對JSON數據解析完成后,將數據存儲到數據庫中。
使用Socket搭建TCP服務端的代碼如下:
public void setUpServer(int port)
{try
{ServerSocket server=new ServerSocket(port);
System.out.println(\"服務器創建成功\"+port);
while(true)
{Socket client=server.accept();
System.out.println(\"正在有客戶端訪問\"+client.getRemoteSocketAddress());
processChat(client);}}
catch(Exception e)
{e.printStackTrace();}}
private void processChat(Socket client) throws Exception
{OutputStream out=client.getOutputStream();
InputStream ins=client.getInputStream();
BufferedReader in=new BufferedReader(new InputStreamReader (ins));
String s;
while((s=in.readLine())!= 1)
{String jsonString = new String(s);
//System.out.println(jsonString);
System.out.println(s);
Gson gson=new Gson();
try
{data object=gson.fromJson(s,data.class);Date date=new Date();
//this object contains the current date value
SimpleDateFormat formatter=new SimpleDateFormat (\"yyyy-MM-dd HH:mm:ss\");
object.now_time=formatter.format(date);
Class.forName(\"com.mysql.jdbc.Driver\");
//System.out.println(\"1.完成注冊\");
//建立連接,
String url=\"jdbc:mysql://123.60.136.10:3306/monitor?\";
//主要協議:次要協議:主機名:端口號/數據庫名
Connection connection=DriverManager.getConnection(url, \"root\",\"123456\");
//System.out.println(\"2.完成連接\");
String sql=\"insert into number values(?,?,?,?,?,?)\";
PreparedStatement preparedStatement=connection.prepareStatement(sql);
preparedStatement.setString(1,object.room_id);
preparedStatement.setString(2,object.now_time);
preparedStatement.setInt(3,object.enter_number);
preparedStatement.setInt(4,object.departures_number);
preparedStatement.setFloat(5,object.now_number);
//System.out.println(\"3.創建成功\");
preparedStatement.executeUpdate();
preparedStatement.close();
connection.close();}
catch(JsonIOException|ClassNotFoundException|SQLException e)
{e.printStackTrace();}}}
主程序開啟后,先對STM32單片機和各模塊進行初始化以及端口配置,檢測單片機與各個模塊是否成功連接,若成功,則開始準備接收各傳感器采集的室內數據。若室內有人,則無需展示數據;若無人,則接收數據。若檢測到水流、電流值異常,則向用戶發消息報警,用戶可通過Web平臺遠程查看。后端頁面如圖13所示。
4 結 語
本文設計的宿舍智能水電監測系統將傳統的用水、用電監測和物聯網技術、大數據技術結合,借助華為云平臺,通過安裝的紅外傳感器智能判斷宿舍人數,進而實現用水、用電安全監測。該系統已處于試運行階段,現階段運行可靠,無線通信穩定。
參考文獻
[1]胡宗磊.基于物聯網技術的電能檢測系統[J].農業網絡信息,2015(2):36-38.
[2]楊曉芬.基于無線傳感器網絡的博物館環境監測系統[J].電子世界,2016,19(10):75-78.
[3]蔚承英,陳勇剛,楊利平,等.基于GPRS和嵌入式計算機的遠程監控系統研究[J].安防科技,2016,2(12):18-20.
[4]熊媛.傳感器技術在自動控制系統中的應用及發展展望[J].工業設計,2016,10(8):12-15.
[5]朱兆豐,劉靜琦,周振虎,等.基于STM32的室內環境監測系統設計[J].物聯網技術,2021,11(6):6-9.
[6]秦立辰,陳付龍,程桂花,等.一種基于NB-IoT的智慧消防監測預警系統[J].物聯網技術,2022,12(9):20-23.
[7]王巖,王超梁,楊格格.一種物聯網水質監測云系統設計與實現[J].物聯網技術,2022,12(4):22-24.
[8]張昊霖,張敏,曹大焱,等.智慧寢室系統設計與實現[J].物聯網技術,2021,11(6):76-78.
[9]魏靜博,黎芳芳,張芹,等.基于STM32的物聯網溫控平臺系統設計[J].現代電子技術,2023,46(4):52-56.
[10]汪康.基于NB-IoT的智能樓宇環境監控系統設計[D].南京:南京郵電大學,2019.
作者簡介:宋欣霓(2001—),女,研究方向為人工智能。
張崢嶸(2002—),女,研究方向為電氣工程。
左宇馳(2004—),男,研究方向為電子信息。
成宇軒(2002—),男,研究方向為電氣工程。
尚鈺棋(2001—),女,研究方向為信息安全。