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