基于Arduino的水位监测系统设计与实现

2023-03-22 09:28杜政隆谢丽明王飞飞
物联网技术 2023年3期
关键词:蜂鸣器服务器端页面

杜政隆,谢丽明,王飞飞

(平顶山学院 信息工程学院,河南 平顶山 467000)

0 引 言

近年来,我国境内出现暴雨的次数越来越多,所造成的经济损失不可估量,而且暴雨期间洪涝灾害的发生概率也大大增加。因此亟需建立一个完善的水位监测系统,让人们可以及时直观地了解水位数据,对预防洪涝灾害有极大的帮助[1]。目前,许多地方仍采用人工水位监测方式,个别地方虽采用了水位监测系统,但还存在诸多问题,如:设备通信覆盖不完全;受老旧设备影响,水位信息不精确;不能直观实时分析各个节点的水位数据等。基于此,本文设计了基于单片机的水位监测系统,可应用于水库、天气水文监测站等实际场地,工作人员可根据需求在移动端对水位数据进行实时监测,设置预警水位,若超出预警水位,系统会及时发出警告,保证民众的安全[2]。

1 水位监测系统的总体设计

本系统根据所需功能主要设计了数据采集端、服务器端和上位机端。数据采集端有多个节点,每个节点连接LCD显示屏、水位传感器和蜂鸣器。采用水位传感器进行水位数据采集、LCD显示屏进行数据显示。当水位数据超过安全阈值时,LCD显示屏会输出报警信息,蜂鸣器进行报警。数据采集端和服务器端之间通过UDP进行数据通信,将水位数据存储到数据库中。上位机端从服务器端的数据库中调取水位数据,实现可视化数据实时展示功能[3]、历史数据展示功能和超过安全阈值报警功能。系统总体框架如图1所示。

图1 水位监测系统总体框架

2 水位监测系统的详细设计

水位监测系统主要包括数据采集端、服务器端和上位机端。设备与服务器端之间使用WiFi模块进行UDP通信[4]。系统用户通过上位机端对水位数据进行实时监测。系统功能模块如图2所示。

图2 水位监测系统功能模块

2.1 数据采集端的详细设计与实现

本系统有多个节点,以一个节点为例进行说明。系统硬件设备的主控单元芯片采用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 循环程序流程

2.2 服务器端的详细设计与实现

服务器端首先建立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、数据库用户名和密码后,执行数据库插入命令。

2.3 上位机端的详细设计与实现

本系统的上位机端基于HTML5、Python语言,创建Flask项目。使用route()函数来记录页面路由,直接访问所要到达的页面,并调用pymysql.connect()实现从数据库中调取节点水位数据以及时间数据,且当水位数据超过安全阈值时在数据可视化展示页面中输出报警信息弹窗。

水位数据汇总页面使用pymysql.connect{}连接数据库IP和指定的表,使用datalist.append()将数据表进行展示,并在页面中使用HTML5语言标签写入文字进行显示。水位数据汇总页面如7所示。

图7 水位数据汇总页面

为更直观地看到数据变化趋势,本系统在数据可视化展示页面中使用了ECharts可视化功能,将节点水位数据进行了可视化展示[8]。ECharts技术在本网页中使用的是折线图,通过定义option{}来设置折线图的参数。用title{text:}设置标题,legend{“节点1”,“节点2”}来设置两个可以点击的按钮以显示指定折线图,x轴上用data:{}方法指定数据表中的字段,y轴同样使用data:{}方法指定数据表中的字段。数据可视化页面如图8所示。

图8 数据可视化页面

在数据可视化页面,当水位数据超过安全阈值时会通过弹窗进行报警来提示工作人员。在本页面中设置一个判断语句,如果y轴中的数据超过指定安全阈值,使用window.open()函数弹出一个含有报警信息的弹窗。超出安全阈值时报警页面[9-10]如图9所示。

图9 水位报警页面

3 结 语

本文的系统能够有效实时地对水位数据进行监测,可以省去高额的人工成本,并加快水位信息的传输速度;水文系统的工作人员不用在各个地方手工统计水位信息,只需在上位机端通过网页访问进行水位信息统计,也可以访问历史水位信息,必要时可以去监测点观测显示屏来查看水位信息;且当水位超出安全阈值时系统会自动报警,可以有效地减轻水位监测工作人员的负担。但系统硬件设备长时间安装在潮湿环境中,会加快硬件设备的损耗,这是后续研究中需要改善的地方。

猜你喜欢
蜂鸣器服务器端页面
刷新生活的页面
电动自行车产品车速提示音检测现状和整改技术研究(2)
Linux环境下基于Socket的数据传输软件设计
掌控板制作简易钢琴
单片机驱动蜂鸣器的程序设计
浅析异步通信层的架构在ASP.NET 程序中的应用
基于Qt的安全即时通讯软件服务器端设计
丰田凯美瑞240V车间隙警告蜂鸣器异常鸣响
网页防篡改中分布式文件同步复制系统
网站结构在SEO中的研究与应用