测试视频已上传到b站:
基于QT上位机的汽车监控警报系统
一、绪论
本次实验的选题是基于 QT 上位机的汽车行驶监控警报系统,灵感来源于本人在行驶电动车过程 中遇到的问题,为汽车模拟了不同的场景,外接步进电机模拟汽车行驶状态,调用传感器实时监控 汽车的振动、温度、光照等数据,并及时将数据反馈到上位机进行监控,更有喇叭、一键报警等功 能。
二、总体方案设计
根据不同情况为汽车设置了“锁定”、“日间行驶”、“夜间行驶”三个场景,外接步进电机 模拟汽车行驶状态,调用传感器实时监控汽车的振动(防盗)、温度(电动车锂电池防爆)、光照 (电动车夜间行驶车灯测距)等数据,通过串口通信与基于 QT 设计的上位机进行通讯,将实时数据 反馈到上位机进行监控,并能通过上位机发送指令控制单片机。
三、软件设计与实现
1、下位机设计
(1)使用的函数和库
包括:显示、按键、振动传感器、蜂鸣器、音乐、ADC 传感器、串口通信、步进电机模块。
(2)初始页面设计
打开单片机后,初始状态设为 3(汽车锁定),数码管显示文字“hello–”,设置音乐模块的 初始节拍值 beat=200,音调值为 E 调 tone=0XFE;步进电机速度 speed=10,转速 steps=10000,并 将步进电机的速度传给串口通信发送缓冲数组的第四位和第五位。
(3)辅助功能设计
① 、振动感应 如果有检测到振动,振动标志位 vibration 为 1。
② 、ADC 模拟量感应 获取 ADC 模拟量中的温度值和光照值,并将温度值模拟量转为摄氏度,当温度大于 30 度或光照 值大于 100 时温度报警标志 temprature 和光照报警标志 illuminate 为 1,并将并将实时模拟值传 给存到缓冲数组的第 0、1 位和第 2、3 位,用于传送给上位机进行实时监测并绘制动态图表。 ③ 、喇叭功能 当按下导航左键时,通过 ADC 感应检测导航电压值,当电压值在左键的范围中时,蜂鸣器持续 响应,数码管显示“dddddddd”,模拟喇叭功能。 ④、倒计时自动落锁 在 10ms 回调函数中设置倒计时 10s,LED 灯显示倒计时数字,时间满后锁定标志 lockflag 为 1, 转到锁定模式。
(4)主体结构设计
在 100ms 回调函数中设计下位机的主体结构,通过状态参数将下位机分为四种模式,0 表示响 铃状态,1 表示停止响铃状态,2 表示进入警戒模式,3 表示退出警戒模式。 ① 、响铃状态: 播放音乐《黑猫警长》,数码管显示“CALL-110”,LED 灯全亮,在 switch 外使用标志位 flag 进行 400ms 的定时,在 case0 中每 400msLED 灯设置一次相反的状态,实现 LED 灯不断闪烁的效果。 ② 、停止响铃状态 停止播放音乐,温度报警标志 temprature 、光照报警标志 illuminate 、震动报警标志 vibration 都设为 0,喇叭标志 trumpt 也设为 0,此时不能鸣笛。数码管显示“-PAUSE-”。 ③ 、警报状态 通过标志位 lockdriveshift 将处于警报状态的汽车分为三个模式,分别是 a、锁定模式,b、 日间行驶模式,c、夜间行驶模式。 a、汽车锁定模式 数码管显示“–LOCK–”,停止播放音乐,调用喇叭功能,此时如果有振动,或者温度和光照 达到警报值,将转到 state=0 产生警报。 b、日间行驶模式 数码管显示“–drive–”,调用喇叭功能,以 speed 的速度值和 steps 的转速打开步进电机 1 号,模拟汽车行驶状态,在日间行驶模式中,只有温度达到警报值会产生警报,lockflag 是步进电 机自动锁定标志位,当检测到步进电机速度为 0 时,系统会倒计时 10s,然后转到 state2 中的汽车 锁定模式。 c、夜间行驶模式 数码管显示“–night–”,调用喇叭功能,以 speed 的速度值和 steps 的转速打开步进电机 1 号,在夜间行驶状态中,LED 等全亮模拟车灯,当温度和光照达到警报值会产生警报,lockflag 同 日间模式。 ④、退出警报模式 即单片机开机后的初始等待界面,数码管显示作者名“-by-ACL-”,在每 400ms 的时间中 LED 灯显示相反的状态,由于初始状态 init()中 LED 灯为间隔亮起,所以此处达到 LED 等间隔闪烁的效 果。
(5)按键模块
① 、功能按键 按下 key2 进入系统,转入 state2 中的 lock 模式,设置初始报警标志位全为 0。在其他 state 中按下按键 2 同样转回 lock 界面。 按下 key1,如果处于 state0 响铃状态则转到 state1 停止响铃,反之亦然,达到播放/暂停报 警铃声的功能。 ② 、导航按键 按下 Key3 键,串口通信发送标志 sendflag=1,此时可以通过串口向上位机实时发送监控数据; 再按一次 sendflag=0 时,可以接收从上位机发下的指令。 在 state2 中,按下导航左键,数码管显示“dddddddd”,调用喇叭函数,可以模拟按喇叭的效 果。 按下导航中键,可以解锁进入 state2 警报状态,并切换日间/夜间行驶模式。 按下导航的上、下键,如果步进电机在工作状态,则可以改变步进电机的速度,每次加 5 或者 减 5,LED 灯闪烁显示当前速度,并将实时速度值传给存到缓冲数组的第 4 位和第 5 位,用于传送给 上位机进行实时监测。同时,当前速度为 5 时,再按一次下键,系统检测到速度为 0,此时倒计时 标志 timeflag 为 1,启动倒计时 10s 自动锁定功能。
(6)串口通信模块
发送缓冲数组和接收缓冲数组定义,发送数组定义为 adcrxd[温度,温度,光照,光照,速度, 速度],接收缓冲数组帧头为 0xaa。 ①、串口发送 在 100ms 回调函数中,当进入初始等待界面且发送标志为 1 时,可以向上位机不断发送实时数 据。 ② 、串口接收 定义串口接收回调函数,当上位机发送“aa fx”时下位机产生对应的响应。f0 远程启动 f1 远程锁定,f2 远程报警,f3 远程关闭警报
2、上位机设计
(1) 登录界面
在登录按键上关联点击槽函数,当点击登录按键时,获取用户名编辑框 speedEdit 和密码编辑 框 stepsEdit 的字符串,当用户名为“LXN”且密码为“11111”时,当前登录界面关闭,新建 Widget 对象,并按当前页面大小打开 Widget 主页。
(2) 串口通信界面
连接单片机后,自动寻找串口。 “打开串口”按钮关联点击动作槽函数,在界面上的下拉框 CombBox 中为单片机匹配波特率、 校验位和停止位。 “关闭串口”按钮关联点击槽函数,如果关闭成功,由 QMessegebox 提示关闭成功,否则提示 关闭失败。 “发送”按钮关联点击槽函数,如果点击发送,将从发送框 LineEdit 中获取字符串,将 str 字 符串转换为 16 进制形式后存入字符数组 senddata 中,然后将 senddata 发送到串口传到下位机,同 时在接收框 recvEdit 中显示传输的字符串。 手动关联接收信号和接收槽,用 readAll()函数读取串口的所有数据,用流函数将字节数组 读入,在 while 循环中,当数据包没有到最后一个字节时,将十六进制数据转换为字符数据并不断 填充到字符串 mystr 中,接下来三行注释代码可以将接收数据显示在接收框 recvEdit 中,但是由于 两个 tab 同时接收数据会导致程序卡死,所以取消掉该功能,只在接收框上显示发送数据。 “清空”按钮和“退出”按钮,清空接收区信息框,退出该界面。
(3) 实时数据监测界面
将转换成字符串的接收数据按照协议截取并转换成十进制,分别由不同的的 lineEdit 文本框接 收,并将数据转换成 float 类型用于接下来的图表处理。 调用 Qcustomplot 函数包绘制实时动态曲线,获取当前系统时间作为横坐标,并将温度和光照 值添加作为曲线绘制。 在 setupPlot 函数中设置图表的外观、曲线颜色等等,此处直接参考的博客上的配色模板[1] 至此,本实验软件设计部分全部结束。
四、实验过程与测试
首先,单片机上电,显示欢迎界面和作者名字(左),按 key2 进入系统,转到汽车锁定模式(右)。 按导航中键可以进入行驶状态并切换日间行驶(左)和夜间行驶(右),夜间行驶时 LED 灯全 亮模拟车灯,此时右侧步进电机开启,右侧 SM 接口 LED 灯闪烁。 按导航上下键可以调整步进电机速度,按上键速度每次加 5,下键速度每次减 5,LED 灯显示当 前速度。当速度为 0 时,系统倒计时 10s 自动锁定,LED 灯显示倒计时。 导航左键可以模拟喇叭鸣笛功能。 启动上位机,使用用户名“LXN”,密码“11111”登录系统(区分大小写),若密码不对,会 提示“User name or password is invalid. ” 进入界面后,系统自动搜索串口,可手动设置默认波特率和数据、标志位,点击“打开串口” 连接下位机,若打开成功(左)提示“Opening the serial port successfully”,如果因为串口 不存在或被占用打开失败(右),会提示“The serial port does not exist or is occupied.” 打开串口后点击“实时数据”界面,在单片机上按 key3 开启/暂停数据传输,左侧数据栏中会 显示实时速度、光照和温度值,右侧图表栏会绘制实时动态曲线,蓝色曲线代表当前光照,红色曲 线代表当前温度。 在锁定状态下,振动、光照或温度三个因素都会影响产生警报,在日间行驶状态,只有温度异 常会产生警报,在夜间行驶状态下,温度和光照异常会产生警报。 警报状态下,单片机数码管显示“CALL-110”,并响起音乐《黑猫警长》,按 key1 键可以暂停 (右)/启动(左)警报。 在单片机上按 key3,暂停实时数据传输后,点击“串口通讯”界面,可以按照下方提示输入“aa” 加对应的指令“fx”,由上位机发送给单片机,控制单片机的操作。 软件功能测试结束。
五、设计总结与心得
本次实验我一共做了十天左右,上位机和下位机加起来一共有八百多行代码,整个小学期除了 吃饭睡觉就是在敲代码查资料,第一次一个人完成这么大的工程量,写到现在我的肩膀都痛得不行, 所以本次实验对我来说意义还是蛮重大的。 一开始想到这个选题是因为我这个学期新买了一辆电动车,在骑车的过程中我发现了很多有趣 又实用的小功能,比如振动报警,所以最初我只花了两天做了一个简易版的振动声光报警器,振动 是为了锁车时防盗,温度是用于监测锂电池温度防爆,光照是夜间行驶时监测身后是否有其他车辆, 方便避让或拉开车距,当然这个功能也可以通过雷达测距模块实现,雷达的功能也更全面,日间行 驶也可以使用。 初版功能完成后我又思考有没有什么可以拓展的功能,于是干脆想能不能用单片机模拟电动车 行驶状态并监控数据,于是改进了代码模式架构,并加入了喇叭、车灯、加减速、刹车后自动落锁 等功能。 单片机功能做好后还有一个周的时间,当时我的设计虽然完成了,但是整体都比较简单,也没 有很大的代码技术难度,而且因为单片机空间有限,我监控的温度、光照和速度都不能显示,单片 机放在一边经常突然响起警报很吓人,所以我就想做一个可以在电脑上监控数据的上位机。 因为以前完全没有学习过硬件知识,所以我查了两天的资料也不知道到底该用什么做上位机, 最后我决定参考学习通的案例,用基于 C++的 QT 实现上位机的制作。整个周末我都在工训中心看 QT 的学习视频,并跟着教程做了一个很简单的登录界面。不得不说平时写代码 debug 虽然让我很烦躁, 但是当一个具体的东西通过我手下的代码呈现在我面前时,那种成就感绝对是远远大于学习时的挫 败和疲惫的。 接下来我又继续搭建好了上位机的三个界面,但是就在验收前两天,我还卡在串口通讯的数据 类型转换这个点,虽然最后发现只需要用一个很简单的函数就能解决问题,但是这个问题足足困扰 了我一天半,我还害怕最后我的项目不能如期完成,这期间我在博客上查阅了无数的资料,伟大的 网络时代,真的非常非常感激各位详细认真写博客教程的大牛,让我不至于为了一个函数头秃。 整个实验在验收前一天全部结束,我的单片机已经可以和上位机完成简单的通讯,整个设计我 个人还是比较满意的,但也有一些想法没有能实现。 比如串口通信,我想在上位机界面实现用按键直接控制下位机硬件的功能,但是查询资料需要 在加入一些底层的硬件工程文件,因为是 BSP 所以也无法实现;然后我又想通过按键触发槽函数向 下位机发送指令信息,但可能因为串口会被发送框的 senddata 占用,还是其他什么原因,总之我尝 试了很久也无法成功发送指令,只能放弃这个功能。 至此我的小学期可以说正式忙完了,说实话很长一段时间因为写代码陷入了瓶颈,我一度觉得 可能自己不适合学习这个专业,但是在这次集训当中我却有了新的体验,不断学习新的知识,不断 用编译器修正自己的逻辑,用代码构筑自己脑中所思所想,这真的是一件让人很有成就感的事,也 是我选择学习计算机的初心,今后的日子,更加坚持,更加努力,更加热爱。
六、参考文献
(1)、CSDN 博主「taxingdianzi」:手把手教你制作一个温湿度上位机(串口通信) 原文链接:https://blog.csdn.net/qq_39542860/article/details/108291462 (2)、【北京迅为】嵌入式学习之 QT 学习篇 视频链接:https://www.bilibili.com/video/BV1tp4y1i7EJ?share_source=copy_web (3)、【传智教育】最新 QT 从入门到实战完整版|传智教育 视频链接:https://www.bilibili.com/video/BV1g4411H78N?share_source=copy_web
|