1. 引言
随着近些年来高校招生规模的不断扩大,图书馆作为学生学习的必争之地,受到广大师生的热烈欢迎。然而,近年来,图书馆的座位增长率与在校师生人数增长率严重失衡,常常供不应求,这就导致学生为了霸占位置而大费周章,严重破坏了校园的和谐环境,助长了不好的风气,给学校带来非常不利的影响[1]。为了解决上述问题,国内很多高校都应用了各式各样的座位检测和管理系统,但仍存在许多漏洞,如清华大学基于校园一卡通系统,与图书馆门禁系统相结合[2];苏州大学基于位置服务,门禁系统与座位管理系统相结合[3]。这种系统整合的方法可扩展性好,能够在很大程度上缓解图书馆的占座问题。但是仍存在一些问题,如前者仅仅只能管理人员进出,无法实时检测每一座位的情况,无法保证馆内座位资源的分配。而后者需使用用户的位置信息,有泄露用户隐私的风险。此外,还有部分高校采用图像识别的模式,如宁波工程学院采用监控识别实现对座位的监管[4],这种方式实现了对每个座位的实时监测,解决了馆内座位资源分配的问题,但是成本高,需要在图书馆无死角的安装摄像头,以确保摄像头能够监测到任意位置,同时需要调用监控信息,隐私问题难以解决,此外,此方案设计难度较高,图像识别的准确度极大影响监测效果。由此本文设计了一款使用红外传感器的图书馆座位监测系统,以解决上述问题。
使用红外传感器监测座位使用情况,拥有安装便利,成本低,容易实现,后期维护简单等特点,同时可以实时监测每一座位,解决了图书馆占座和座位资源无法合理分配等问题。该系统可自动分辨出座位上是否被使用,并将信息上传至上位系统,配合上位机系统的预约、可视化管理等功能,方便同学找座和图书管理员管理,大大提高了图书馆座位的利用率。
2. 系统构成
本文所设计的系统具有座位使用情况检测、实时显示和向上位系统传输数据等功能。基于其所需的功能,把系统分为主控芯片、显示模块、红外传感器模块、数据传输模块,分别实现主控功能、显示使用情况功能、数据传输功能。系统总体框架如图1所示。
红外传感器用于监测座位的使用情况,每个红外传感器配备了一个红外光源和一个光接收装置。传感器工作时,红外光源不断发射红外光,当座位被使用时,人体将红外光反射至接收器,接收器接收到红外光后,会向控制芯片传递信号“1”,表示座位正在被使用。相反,如果接收器未接收到红外光,那么它会向控制芯片传递信号“0”,表示座位未被使用;显示模块主要用于直观地展示红外传感器的监测结果。一旦红外传感器检测到座位有人使用,显示模块就会显示出数字1,以表明座位正在被使用;如果红外传感器没有检测到座位被使用,那么显示模块就会显示出数字0,以表明座位处于空闲状态;数据传输模块用于将红外传感器的信号通过串口通信发送至上位机。由此上位机就可以实时了解到各个座位的使用情况,便于进行进一步的座位管理和监管。
系统总体表现为:首先,红外传感器检测座位的使用情况,并将检测结果转化为信号传递给STM32芯片。然后,STM32芯片再将这些信号分别发送至OLED显示屏和上位机。在OLED显示屏上,我们可以看到单个座位的使用情况;而在上位机上,我们可以得到图书馆全部座位的使用情况。
Figure 1.System framework
图1.系统框架
3. 硬件设计
东南大学曾设计过类似系统,其以AT89C51单片机作为控制核心,移位寄存器、LED共阳数码管、红外接近开关设计了一款监控管理系统[5]。本系统相比于东南大学的设计有了很大的提升,首先本设计采用STM32F103C8T6型芯片[6]作为本次设计的内核。相比于51单片机,STM32芯片具有处理能力更强,运行速度更快,存储空间更多的优点,同时STM32单片机具有更多的外设,例如USB、CAN、SPI、I2C等。由于STM32单片机允许使用I2C通信协议,所以本系统采用了OLED显示屏,OLED显示屏相比于LED共阳数码管,除了可以显示数字之外,还可以显示中英文,同时可显示的内容得到了大幅的提升。此外东南大学的系统仅仅停留在座位监测,对于图书馆占座现象和座位资源分配不均问题的解决帮助很小,而本系统实现了监测系统与上位机的信息传递功能,可以配合上位系统的可视化管理,很好的解决上述问题。
Figure 2.OLED module wiring diagram
图2.OLED模块接线图
STM32F103C8T6型芯片用于处理红外传感器采集的信息,并对外部连接设施进行控制,实现芯片和上位系统的信号传递。本系统将STM32芯片的I/O口与显示模块连接,使用I2C通信协议进行数据传递,每个红外传感器均通过单总线协议与STM32芯片进行通信,这一通信方式有效降低了系统的复杂性并减少了所需的I/O端口数量,同时将读取到的信号传递到显示模块,可视化地展示每个座位的状态,即被占用(显示为1)或未被占用(显示为0),并将此信号通过串口通信传输到上位机。
本系统需要显示当前座位的预约和使用信息,故选用OLED模块。OLED显示模块采用0.96寸四引脚OLED。而I2C接口模式仅需2根线便可控制OLED,故选择I2C接口模式[7],采取GPIO口模拟I2C通信协议。OLED具体接线如图2所示,其中GND接地,VCC接3.3 V供电;SCL接B8,SDA接B9实现I2C通信。
本系统采用反射式红外传感器,接线如图3所示,其中GND接地,VCC接3.3 V供电;DO接B13输入信号。红外传感器持续检测座位使用情况并向STM32芯片传输信号,此过程每秒重复执行,确保STM32芯片能够实时接收并更新座位的使用状态信息。
Figure 3.Infrared sensor module
图3.红外传感器模块
在本座位监测系统中,数据传输的需求相对简单,主要涉及二进制状态信息——即座位被占用或空置的实时数据。鉴于此,系统设计采用了串口通信作为数据传输手段。串口通信的优势在于其简洁性和成本效益,能够在最小化硬件需求的情况下实现数据的序列化传输;仅通过发送(TXD)和接收(RXD)两根信号线,便能完成从STM32至上位计算机的数据通信。
为了实现STM32芯片与上位机之间的连接,本系统采用了USB转TTL (USB to TTL)的转换设备。该设备的主要功能是将USB信号转换为TTL电平信号,从而允许STM32通过USB接口与上位机进行串行通信。STM32与TTL的接线图4所示,其中GND代表地线,A9引脚连接到接收数据线RXD,而A10引脚连接到发送数据线TXD。这种连接配置确保了数据能够双向传输,即STM32可以向上位机发送数据,同时也能接收来自上位机的指令或数据,便于上位机系统对STM32芯片进行操作。
当红外传感器检测到人体存在时,STM32将编码为“1”的信号通过串口通信发送至上位机,表示相应的座位正被占用。相反,若红外传感器未检测到人体,则STM32发送编码为“0”的信号,表示座位当前处于未被占用的状态。
Figure 4.Serial communication wiring diagram
图4.串口通信接线图
4. 系统软件设计
本系统软件设计主要分为三大部分,以模块化的方式编写程序[8],程序流程图如图5所示。
1) 第一部分为红外检测模块,其用于检测座位使用情况。
2) 第二部分为显示模块,用于实时显示座位的使用情况。
3)第三部分为串口通信模块,其用于实时将座位使用情况传输至上位机。
Figure 5.Program flow chart
图5.程序流程图
4.1. 红外检测模块软件设计
首先设置打开STM32中GPIOB的时钟,并定义一个结构体,命名为GPIO_InitStructure,接着初始化B13引脚,模式选择为IPU上拉输入,输出速度设定为50 MHz。为了方便书写和使用,定义InfraredSensor_get()函数,其使用内置函数GPIO_ReadInputDataBit (GPIOB, GPIO_Pin_13)返回连接在B13端口的红外传感器的值。
4.2. 显示模块软件设计
设置STM32与显示模块连接的I/O,对I/O口进行初始化,本文使用宏定义OLED_MODE设置I/O口为开漏模式,SCL、SDA引脚均设置为开漏模式,将I2C设置为快捷模式。然后,初始化OLED,初始化代码使用模块自带的默认初始化参数[2]。最后,完成的函数包括OLED_ShowHexNum()显示十六进制数字;OLED_ShowNum (uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)显示十进制正数等,本系统中主要使用OLED_ShowNum()在OLED屏上显示红外传感器信号。
4.3. 串口通信模块软件设计
首先设置打开STM32中GPIOB的时钟,输出类型设置为复用推挽输出,波特率采用9600,8字长,停止位长度1,无校验位,硬件流控制,只需要发送。然后,初始化Serial,初始化代码使用模块自带的默认初始化参数。最后,完成的函数包括Serial_SendByte() (发送单个字符);Serial_SendArray() (发送数组);Serial_SendString() (发送字符串);Serial_SendNumber (uint32_t Number, uint8_t Length) (发送十进制数字)。本系统主要使用Serial_SendNumber()向上位机传输信号,故上位机在接收信号时需选择文本模式接收。
4.4. 主函数软件设计
首先声明“Delay.h”(延时)“OLED.h”(OLED显示)“InfraredSensor.h”(红外传感器)“Serial.h”(串口通信)等四个头文件,使得在主函数中可以调用这些模块中的函数。
构建循环while (1),使程序持续运行,再使用InfraredSensor_get()返回红外传感器的值x,判断红外传感器的值,然后使用OLED_ShowNum (1, 1, x, 1)将红外传感器的结果显示于OLED显示屏并使用Serial_SendNumber (x, 1)将此结果通过串口通信发送至上位机。
5. 运行调试结果
传感器检测到座位被使用时,结果如图6(a)~(c)所示。手指挡住红外光发射器,模拟座位有人使用,红外传感器接收端接收到光信号,接收指示灯亮起;OLED显示屏显示“1”;上位机接收信号为“1”。
(a) (b) (c)
Figure6.Seats are used. (a) Physical image of sensory organ; (b) OLED display screen; (c) Serial communication result
图6.座位被使用。(a) 传感器实物图;(b) OLED显示屏;(c) 串口通信结果
传感器未检测到座位被使用时,结果图7(a)~(c)所示。手指未挡住红外光发射器,模拟座位无人使用,红外传感器接收端未接收到光信号,接收指示灯关闭;OLED显示屏显示“0”;上位机接收信号为“0”。
(a) (b) (c)
Figure7.Seats are unused. (a) Physical image of sensory organ; (b) OLED display screen; (c) Serial communication result
图7.座位未被使用。(a) 传感器实物图;(b) OLED显示屏;(c) 串口通信结果
6. 结语
本项目的宗旨是为了解决传统图书馆座位管理方式中存在的座位资源浪费等问题,提高座位利用率。在此设计了一款基于STM32C8T6的图书馆座位监测系统,此系统实现了用红外传感器检测座位使用情况,并将情况上传至上位机,可配合上位机程序实现图书馆座位的预约与监测。虽然该系统还存在一些问题,但通过持续的技术研究和用户反馈,我们有信心能够不断改进系统,未来还可以在本系统的基础上添加压敏传感器、摄像头识别模块等以提升系统的监测准确度,并可增加校园卡刷卡入座功能,避免出现预约座位与实际使用座位不符的情况出现,同时也可增加开关装置,在不需要使用的时候可以关闭系统以节约能源,使其更好地服务于图书馆和读者。希望本研究能够为相关领域提供有价值的参考,辅助图书馆座位管理向智能化、信息化的方向发展。