文章目录
- 一、项目设备及平台
- 二、项目功能说明
- 1. 整体功能
- 2. GEC6818开发板功能介绍
- 3. GY39模块功能介绍
- 4. MQ-2型烟雾传感器功能介绍
- 5. RFID模块
- 三、硬件系统设计实现与图表
- 四、软件系统设计实现与流程图
- 1. 软件系统设计总体描述
- 2. 软件实现流程图
- 3. 操作过程
- 五、调试过程中出现的问题及相应解决办法
- 六、视频演示
- 七、程序设计
- 1. 数据库连接
- 2. Socket通信
- 3. 串口初始化
- 4. Label动、静态图
- 5. 定时器
- 6. 蜂鸣器驱动
一、项目设备及平台
设备:
GEC6818开发板、串口线、网线、GY39传感器、高频读卡器与标签、MQ-2烟雾浓度传感器。
平台:
QT、Putty
二、项目功能说明
1. 整体功能
该智能病房监测系统是通过QT编程实现模拟服务器功能,与GEC6818开发板实现数据通信。首先,开发板和PC通过套接字通信建立连接,开发板作为客户端可以通过查询PC端的ip地址及串口号从而与PC端建立连接。则开发板作为客户端,PC机作为服务器端。开发板可以向服务器端发送数据,则PC端即服务器端进行相应的数据处理。
病人登录时,通过数据库select语句进行查询,若存在,则登录成功,否则登录失败。首先,用户可以在开发板上进行登录身份的选择,如果是以病人身份进入系统,则首先对病人身份进行注册而后登录,该步骤主要通过RFID射频识别技术实现,成功读取病人的身份信息后再通过数据库编程实现对病人信息的存储,方便下次用户登录。病人成功登录后将会进入环境监测界面,该界面上会显示温度、湿度、海拔和光照等环境信息,该过程主要是通过GY39传感器模块实现,利用串口通信采集传感器数据加载到QT控件上,然后再将控件直接显示到屏幕上。其中,可以利用定时器每0.5s更新一次数据并发送至服务器,蜂鸣器会在温度超过30度时发出警报提醒。此外,当病人按下紧急呼救按钮时,客户端将该病人的病房号发送至服务器,服务器收到后在开发板上显示呼叫成功,而后触发蜂鸣器警报,实现处理病人的紧急呼叫功能。
医生进入系统时,首先进行身份的登录,登录成功后可以看到医生的姓名及年龄等信息。系统中病人对应的医生信息已在QT编程中实现设置,则病人注册登录成功后将自动进行医生的绑定,本项目中设置了两位病人信息与一位医生进行绑定,病人信息可以在进入医生身份登录界面后通过查询病历本查看。
2. GEC6818开发板功能介绍
GEC6818 开发平台,核心板采用 10 层板工艺设计,确保稳定可靠,可以批量用于平板电脑,车机,学 习机,POS 机,游戏机,行业监控等多种领域。该平台搭载三星 Cortex-A53 系列高性能八核处理器 S5P6818, 最高主频高达 1.4GHz,可应用于嵌入式 Linux 和 Android 等操作系统的驱动、应用开发。开发板留有丰富的外设,支持千兆以太网、板载 LVDS 接口、MIPI 接口、USB 接口等。在本次项目中主要实现数据通信及界面显示等功能。
3. GY39模块功能介绍
GY-39 是一款低成本,气压,温湿度,光强度 传感器模块。工作电压 3-5v,功耗小,安装方便。 其工作原理是,MCU 收集各种传感器数据,统一处理,直接输出计算后的结果,此模块,有两种方式读取数据,即串口 UART(TTL 电平)或者 IIC(2 线)。串口的波特率有 9600bps 与 115200bps,可配置,有连续,询问输出两种方式,可掉电保存设置。可适应不同的工作环境,与单片机及电脑连接。模块另外可以设置单独传感器芯片工作模式,作为简单传感器模块,MCU 不参与数据处理工作。
4. MQ-2型烟雾传感器功能介绍
MQ-2型烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。当处于200~300摄氏度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒收到烟雾的调至而变化,就会引起表面导电率的变化。利用这一点就可以获得这种烟雾存在的信息,烟雾的浓度越大,导电率越大,输出电阻越低,则输出的模拟信号就越大,与MQ-7类似。本项目中主要利用该模块对空气中的烟雾浓度进行监测,通过监测数据及时进行烟雾报警等处理。
5. RFID模块
高频RFID一般频率在13.56MHz左右,识别距离可扩展至1.5米,具有防碰撞特性,可以同时读取多个电子标签。标签可以存储少量数据,多用于需要存储数据、距离的识别应用,如:图书馆管理系统、场地通道安全管理系统等。
三、硬件系统设计实现与图表
硬件系统由GEC6818开发板、GY39模块、烟雾传感器模块、高频RFID模块、高频电子标签、杜邦线等组成。
-
GEC6818开发板配置:
-
GY39光强度传感器原理图
-
MQ2烟雾浓度传感器原理图
四、软件系统设计实现与流程图
1. 软件系统设计总体描述
首先通过查询服务器端的ip地址及双方约定的端口号进行服务器和客户端的绑定,保证通信的顺利进行。其次,在病人登录时,首先进行病人身份的注册,此时需要利用RFID射频识别技术对病人身份进行识别,若已经注册过则可以直接登录,否则先进行注册而后才能登录。登录时,首先通过select语句对后台数据库进行查询,如果病人信息存在则登录成功,否则登录失败。若登录失败则应退出登录进行病人的数据绑定之后再进行登录。病人登录成功后就可以进入环境监测界面,在该界面中可以看到温度、湿度、光照等环境变量的显示,并且该界面中的数据因为软件编程中定时器的应用还可以进行每0.5s进行一次更新的操作,实现真正的动态监测。环境监测变量中还安排了报警机制,当温度超过30摄氏度时,系统会自动触发蜂鸣器警报,从而提醒医护人员进行处理。除此之外,病人还可以通过按键进行紧急呼救,当病人按下按钮时,系统也会触发蜂鸣器警报,系统将进行应急处理。
在医生进行登录操作时,系统将会根据数据库内病人所绑定的主治医生对医生进行数据更新,即医生每登陆账号后台会实时更新医生的数据消息,医生也可在此查看个人数据和负责病人的病历单。
综上所述,软件系统中用到的编程技术总结如下:套接字通信、数据库编程、RFID射频识别技术、串口通信、QT设计等等。
2. 软件实现流程图
-
病人登录注册操作流程图
简要说明: 在病人登录时,首先进行病人身份的注册,此时需要利用RFID射频识别技术对病人身份进行识别,若已经注册过则可以直接登录,否则先进行注册而后才能登录。登录时,首先通过select语句对后台数据库进行查询,如果病人信息存在则登录成功,否则登录失败。若登录失败则应退出登录进行病人的数据绑定之后再进行登录。 -
医生登录流程图
简要说明: 在医生进行登录操作时,系统将会根据数据库内病人所绑定的主治医生对医生进行数据更新,即医生每登陆账号后台会实时更新医生的数据消息,医生也可在此查看个人数据和负责病人的病历单。
3. 操作过程
先建立一个空文件夹,用于后续的共享操作,在此文件夹中创建QT工程并在此编写代码,将编写后的代码使用ARM交叉编译,因为GEC6818开发板是基于ARM架构的,将编译生成的可执行文件通过网线传输到开发板上(NFS协议,通过mount命令进行挂载),即该文件夹为虚拟机与开发板的共享文件夹,然后将可执行文件在中间件Putty上进行运行。
其次再讲讲数据的采集,本项目用到的GY39光强度传感器、MQ2烟雾浓度传感器与射频识别器都是通过串口通信实现的,这里我以GY39为例介绍其是怎么采集数据的,首先打开该模块所使用到的串口文件并初始化串口,例如波特率为9600,8数据位,1停止位,0校验位等等,定义一个文件描述符用于接收,然后向该文件描述符内写入数据采集指令,例如write(fd,cmd,3);写入后再向该文件描述符内读取反馈数据,例如read(fd,&buf,1);其中cmd为传感器采集指令,buf为缓存数组,用于存储接收到的数值,最后对接收到的数据进行解析,具体解析需配合用户手册使用。
五、调试过程中出现的问题及相应解决办法
-
串口通信未能显示正确的数据信息或者显示乱码
解决办法:修改串口通信波特率,使得收发双方波特率一致。 -
在进行病人信息登录时,卡片信息读取失败
解决办法:查看硬件接线是否正确,在检查硬件接线正确后再进行卡片的识别和信息的读取。 -
服务器和客户端未能进行顺利通信
解决办法:查看服务器端ip地址和端口号是否吻合,要利用正确的服务器ip地址和端口号才能和客户端进行绑定。 -
GY39传感器模块没有输出
解决办法:在多次查看代码后,认为是原程序中所给的延时不足,造成模块来不及响应,加上printf语句后相当于额外加了延时,抱着这个思路提高了延时时间,而后得到了正确的输出数据。
六、视频演示
GEC6818智能病房监控系统
七、程序设计
1. 数据库连接
连接成功后,先清除之前所创建的表
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
QSqlDatabase userDb;
userDb = QSqlDatabase::addDatabase("QSQLITE");
userDb.setDatabaseName("../Intel_Sickroom/user.db");
bool ok = userDb.open();
if(!ok)
{
qDebug() << "Open userDb error:" << userDb.lastError().text();
}
QSqlQuery query(userDb);
QString deleteTable = QString{"drop table user;"};
if(!query.exec(deleteTable))
{
qDebug() << "delete user table error:" << query.lastError().text();
}
else
{
qDebug() << "delete user table success!" ;
}
2. Socket通信
#include<QTcpSocket>
QTcpSocket *tcpsocket;
tcpsocket=new QTcpSocket(this);
QString IP="192.168.201.181";
quint16 Port=8080;
tcpsocket->connectToHost(IP,Port);
QString str="123";
tcpsocket->write(str.toUtf8().data());
connect(tcpsocket,&QTcpSocket::connected,[=](){
qDebug()<<"TCP connect succes!";
});
3. 串口初始化
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>
#include <errno.h>
int Widget::uart_init(const char * uart_name,int baudrate)
{
int uart1_fd= open(uart_name, O_RDWR);
if (uart1_fd == -1)
{
perror("open error:");
return -1;
}
struct termios myserial;
memset(&myserial, 0, sizeof (myserial));
myserial.c_cflag |= (CLOCAL | CREAD);
myserial.c_cflag &= ~CSIZE;
myserial.c_cflag &= ~CRTSCTS;
myserial.c_cflag |= CS8;
myserial.c_cflag &= ~CSTOPB;
myserial.c_cflag &= ~PARENB;
if(baudrate == 9600)
{
cfsetospeed(&myserial, B9600);
cfsetispeed(&myserial, B9600);
}
else if(baudrate == 115200)
{
cfsetospeed(&myserial, B115200); `在这里插入代码片`
cfsetispeed(&myserial, B115200);
}
tcflush(uart1_fd, TCIFLUSH);
tcsetattr(uart1_fd, TCSANOW, &myserial);
return uart1_fd;
}
4. Label动、静态图
#include <QPixmap>
#include <QIcon>
#include <QMovie>
#include <QLabel>
QPixmap pix1(":/images/card.jpg");
ui->label5->setPixmap(pix1);
ui->label5->setScaledContents(true);
QMovie *mov = new QMovie{":/images/scan.gif"};
ui->label4->setMovie(mov);
ui->label4->setScaledContents(true);
mov->start();
5. 定时器
#include <QTimer>
QTimer *timer=new QTimer(this);
timer->start(500);
connect(timer,&QTimer::timeout,[=](){
......
});
timer->stop();
6. 蜂鸣器驱动
#include <sys/types.h>
#include <sys/stat.h>
#define BEEP_ON 1
#define BEEP_OFF 0
fd_beep = open("/dev/pwm",O_WRONLY);
if(-1 == fd_beep)
{
perror("open fd_beep error");
}
beep_cmd = BEEP_ON;
write(fd_beep,&beep_cmd,1);
beep_cmd = BEEP_OFF;
write(fd_beep,&beep_cmd,1);
若需完整工程文件可加下方wx联系👇👇👇