随着电子技术的发展,电子产品对人们生活的影响越来越广泛,它使人们的工作、生活、学习变得越来越方便、快捷[1-2]。在政府机关、企事业单位的办公室或实验室通常安装有饮水机,为工作和学习群体提供饮用水,而饮水机中的水是断断续续加热的,由于室内人员不能及时了解饮水机中的水是否已烧开,往往会出现等待而浪费时间的情况[3]。本文提出了一种饮水机状态桌面监测系统设计方案,该系统以AT89S52单片机为控制核心,利用TCS230颜色传感器对饮水机状态进行采集,采用Qt Creator开发上位机软件,配合串口通信和TCP/IP网络通信协议,将饮水机的工作状态实时显示在电脑桌面的任务栏上,使用户可以及时了解饮水机中的水是否已烧开。
1. 系统设计要求和功能框图 1.1. 系统设计要求本系统主要由3个模块组成:上位机软件模块、数据采集模块和服务器客户端软件模块。系统设计要求如下:
(1) 单片机将采集的RGB颜色数据传送给计算机;
(2) 计算机通过RGB数据判断饮水机中的水是否烧开,同时发送给局域网客户端;
(3) 客户端获取鼠标单击事件,然后显示饮水机的工作状态。
1.2. 系统框图和功能系统的硬件部分包括AT89S52单片机控制核心、TCS230颜色传感器模块、饮水机指示灯模拟电路和1602液晶显示模块。液晶显示模块仅用于前期系统调试,调试完成后即可移除[4-5]。系统工作原理框图如图 1所示。
![]() |
图 1 系统工作原理图 |
TCS230是美国TAOS公司推出的一款数字式可编程彩色光/频率转换器[6-7]。它在一个CMOS电路上集成了可配置的硅光电二极管、红绿蓝(RGB)3种滤光器和电流频率转换器,采用数字化输出,不需要额外的A/D转换电路,典型输出频率范围0.002 Hz~500 kHz;颜色获取精度高,能够实现每个彩色信道10位以上的转换精度;电路结构简单,可以和微处理器直接相连。TCS230引脚和功能框图如图 2所示,其中,光电二极管阵列控制引脚S2、S3用于选择红、绿、蓝滤波器,经过电流—频率转换器后输出不同频率的方波信号;定标控制引脚S0、S1用于选择不同的比例因子,从而对输出频率范围进行调整以与不同频率计数器相匹配。
![]() |
图 2 TCS230引脚和功能框图 |
根据德国物理学家赫姆霍兹(Helmholtz)的三原色理论,任何颜色均是由不同比例的红、绿、蓝(RGB)三原色混合而成的,若能获取某种颜色中R、G、B分量值,就能确定其颜色。使用TCS230颜色传感器检测时,在配置其S2、S3引脚电平选定某一原色(红、绿、蓝)滤波器后,它将只允许某种特定的原色通过,当TCS230分别检测出某种颜色中R、G、B分量后,通过电流—频率转换器即可把光强线性转换为频率信号,根据量化得到的R、G、B值就可以计算出投射到TCS230上光的颜色。S0、S1和S2、S3功能配置组合如表 1所示。
![]() |
表 1 TCS230功能配置 |
AT89S52单片机和TCS230构成的颜色检测电路如图 3所示。由单片机的P1口控制TCS230的各控制引脚,用于选择不同的滤波类型和输出比例因子。TCS230的输出端与单片机的定时/计数器T1的输入端P3.5口相连,设置T1为定时工作模式并初始化定时时长为10 ms。上电工作时,由单片机在一个定时周期内接收TCS230的OUT引脚输出的R、G、B脉冲,通过对颜色传感器输入的三原色因子脉冲进行计数,并通过计数的脉冲数来确定RGB数值,以此来判断饮水机当前的工作状态[8]。此外,采用MAX232芯片设计了串口通信电路,以实现颜色检测电路与上位机之间的通讯。调试时,采用液晶显示器显示RGB数据来监测单片机的串口代码是否有误。实际实验中,可采用红色、蓝色和绿色LED代替热水器指示灯。
![]() |
图 3 颜色检测电路 |
系统软件主要包括颜色检测程序、服务端程序和客户端程序3部分。颜色检测程序主要对AT89S52单片机编程,在Keil uVision5环境中用C语言开发。服务端和客户端程序采用Qt Creator开发,Qt Creator提供了丰富的开发工具和组件,具有开发效率高、免费开源等特点[9]。
3.1. 颜色检测程序设计按三原色理论,白色是由等量的红、绿、蓝三原色混合而成的,但实际上,白色中的R、G、B分量并不完全相等。因此,系统上电初始化后,首先需利用标准白色光源完成白平衡调整,即告诉颜色传感器什么是白色。通过白平衡调整,可计算得到一个三原色比例因子。然后由单片机的P1.0和P1.1口向颜色传感器的S2和S3引脚发出控制信号,从OUT端分别采集红、蓝、绿在10 ms内的脉冲个数,把测得的脉冲个数与三原色比例因子相乘即可得到对应的R、G、B值[10]。单片机通过“颜色检测—串口发送—显示”等3个过程并进行循环检测,若R、G、B其中有一个发生变化,RGB数据就会发送给上位机,工作流程如图 4所示。
![]() |
图 4 系统工作流程图 |
服务端程序运行在上位机上,获取单片机硬件系统通过串口发送来的RGB数据,并判断是绿色还是红色,将提示信息发给局域网内所有运行客户端软件的电脑[11-12]。
Qt软件库中并没有提供串口控制类,设计中使用第三方编写的qextserialportf类[13]。对串口的初始化和窗口构造函数添加如下代码:
structPortSettings SerComset={BAUD 9600, DATA_8, PAR_NONE, STOP_1, FLOW_OFF, 500};//定义结构体,用来存放串口设置的各个参数
SerCom=newWin_QextSerialPort("com1", SerComset, QextSerialBase::EventDriven); //定义服务端串口对象,并传递参数
SerCom->open(QIODevice::ReadWrite); //串口打开方式,可读可写
connect(SerCom, SIGNAL(readyRead()), this, SLOT(SerComread())); //关联信号和槽函数,若串口缓冲区有数据,执行槽函数
串口初始化完成后,就设置了波特率、数据位、停止位、校验位,指定了程序读取哪个COM口[14]。
槽函数void SerComread()被定义在mainwindow.cpp中,定义一个QByteArray的temp变量用来存放从串口读取的数据,三原色的因子存放在primary_divisor[3]这个数组中, 分别为R、G、B,每次数据接收完成后,判断颜色因子的分量值。根据条件得出结果,将结果发送给客户端。
服务端还要完成向客户端发送信息的任务,由于使用网络服务,因此,在工程文件.pro中加入代码QT += network,在mainwindow.h中添加private对象和Private slot函数:
QtcpComServer * tcpComServer;
QTcpSocket * clientConnection[3];
void sendtcpMsg(); //发送信息函数
void sendSocketMsg(qunit flag); //发送结果函数
tcpComServer和私有槽函数的初始化在mainwindow的构造函数中完成:
tcpComServer = new QTcpServer(this);
tcpComServer->listen(QHostAddress::Any, 5942))//初始化tcpComServer套接字,并让其监听整个网络地址的6060端口
由于所实现的功能均为数据发送,因此两个Private slot函数的定义基本是一样的。但是sendSocketMsg(quint16) 函数有参数传入,这个参数即是饮水机状态。sendtcpMsg()函数里的clientConnection[3]在每次有新的客户端连接时赋值,即表示产生新的TCP连接[15]。
连接信号和槽函数定义如下:
connect(SerCom, SIGNAL(readyRead()), this, SLOT(SerComread()));
connect(tcpComServer, SIGNAL(newCon-nection()), this, SLOT(sendtcpMsg()));
到此,服务端的功能设计完成。
3.3. 客户端程序设计客户端程序运行在局域网内需要显示饮水机状态的电脑上,它的任务就是接收服务器发送来的信息,用户通过单击操作,获取饮水机状态。为了完成客户端的功能,在widget.h中添加如下两个对象:
QPushButton * connectButton;
QTcpSocket * clientSocket;
定义QString message,存放服务器接收到的字符串;
定义char * status,存放饮水机状态;
添加私有槽函数:
void newTcpConnect();
void readTcpMsg();
这些对象都在widget的构造函数中完成初始化。
clientSocket = new QTcpSocket(this);
voidnewTcpConnect()函数用于获取用户填写的主机IP地址和端口号,并连接到主机。
void readTcpMsg()函数用于读取主机发来的信息,将信息存到message变量里,以便显示到桌面。
将connectButton和槽函数newConnect()关联在一起,即当按钮被按下时,客户端就会自动连接服务器。
connect(clientSocket, SIGNAL(readyRead()), this, SLOT(readTcpMsg()))关联了接收缓冲区与读缓冲区的readTcpMsg()函数,一旦服务器发送数据到缓冲区,缓冲区数据就会被读取并存放到message中,通过判断message里面的字符串是“yes”或“no”来判断水是否烧开。
为了实现窗口的托盘运行,需声明QSystemTrayIcon * trayIcon对象。通过在构造函数里初始化trayIcon = new QSystem TrayIcon (this),并调用trayIcon->show()即可实现托盘运行。
void iconActivated(QSystemTrayIcon::ActivationReason reason)函数实现了对托盘左击,弹出气泡的功能, 避免了在不需要了解饮水机状态的情况下弹出窗口的麻烦。客户端巧妙利用改变托盘的titlec来通知用户饮水机的状态。[16]
此函数可以获取左键单击双击,和单击滚轮等动作,此设计只采用鼠标左键单击动作。
void Widget::createActions()函数获取鼠标右键对托盘的动作,右键单击后弹出菜单:最小化、最大化、关闭和还原。此设计只选择了“托盘运行”和“关闭程序”。
4. 软件运行结果客户端软件打开界面如图 5所示。输入主机IP和端口号,点击“连接”按钮,当“欢迎使用饮水机桌面监测系统”变为“已连接到饮水机”后,系统就可以实时监测饮水机的状态。
![]() |
图 5 客户端界面 |
托盘运行状态如图 6所示,任务栏黑色的图标就是服务端托盘运行的图标。当客户端获取到饮水机状态时,对话气泡中的“……”就会变为“正在烧水”或“水已烧好”。
![]() |
图 6 任务栏状态指示 |
该系统具有结构简单、工作稳定可靠、实时性好等特点,只需将系统接入办公室或实验室内的局域网,就可以将饮水机的工作状态实时反映给用户计算机,方便用户随时获知饮水机中的水是否已烧开。
[1] | 潘之涛. 新时期电子技术应用探讨[J]. 电子技术与软件工程, 2014(5): 124. |
[2] | 王瑞凤, 刘思驿, 张锦绣, 等. 电子产品对大众生活的影响研究[J]. 产业与科技论坛, 2016, 15(19): 104–105. DOI:10.3969/j.issn.1673-5641.2016.19.053 |
[3] | 郭毅飞, 董峰. 基于AT89C51单片机的智能饮水机控制系统[J]. 湖南农机, 2012, 39(11): 90–93. DOI:10.3969/j.issn.1007-8320.2012.11.049 |
[4] | 赵亮. 液晶显示模块LC01602应用[J]. 电子制作, 2007(3): 58–59. |
[5] | 林嘉. 基于89S52的LCD1602程序设计[J]. 电脑知识与技术, 2012, 8(26): 6376–6378. |
[6] | 卢川英, 于浩成, 孙敬辉, 等. 基于TCS230传感器的颜色检测系统[J]. 吉林大学学报(信息科学版), 2008, 26(6): 621–626. |
[7] | 戴勇军, 贾春阳. 基于单片机便携式颜色自适应识别电路的设计[J]. 电子设计工程, 2011, 19(4): 182–185. |
[8] | 康海, 刘书林, 赵坤. 基于TCS3200D芯片的色彩变化识别系统设计[J]. 电子设计工程, 2015, 23(8): 91–93. |
[9] | 卢华伟, 秦品健, 郑锐. 基于Qt/Qwt的操作监控系统的设计与实现[J]. 微计算机信息, 2010, 26(1): 72–74. |
[10] | 张松灿, 肖本贤. 高分辨率颜色传感器TCS230的原理和应用[J]. 单片机与嵌入式系统应用, 2005(3): 44–46. |
[11] | 江帆, 孙立, 尹华山. 基于Qt环境下物理参数综合分析系统的设计与实现[J]. 电子设计工程, 2014, 22(8): 34–36. |
[12] | 金繁, 崔培雷. 嵌入式Qt中信号与槽机制的研究[J]. 电子设计工程, 2014, 22(24): 168–170. DOI:10.3969/j.issn.1674-6236.2014.24.051 |
[13] | [加]Jasmin Blanchette, [英]Mark Summerfield. C++ GUI Programming with Qt4[M]. 第2版. 闫锋欣, 曾泉人, 张志强, 译. 北京: 电子工业出版社, 2008. |
[14] | 霍亚飞. Qt Creator快速入门[M]. 北京: 北京航空航天大学出版社, 2002. |
[15] | 霍亚飞. Qt及Qt Qquick开发实战精解[M]. 北京: 北京航空航天大学出版社, 2010. |
[16] | [美]Molkentin, Daniel. The Book of Qt4: The Art of Building Qt Applications[M]. San Francisco: No Starch Press, 1990. |