电梯安全性检测系统终端软件的设计与实现
发布时间:2019-02-28 点击次数:次
电梯检测中需要检测的量主要包括电梯运行过程中的噪声、速度、加速度和震动情况,以及轿厢的温湿度和亮度、电梯开关门情况等。将传感器信息应用到电梯的智能诊断,利用集多种模块于一体的智能检测系统检测电梯运行时的状态信息, 能更加有效且准确地测量电梯安全性信息。通过对电梯运行时的一些参数的采集处理来掌握电梯的安全性信息, 获得电梯准确的运行状态和可能存在的故障隐患, 帮助相关检测人员对当前电梯的安全性问题作出有效评估, 从而减少因电梯存在故障隐患而可能造成的事故,这适应了智能建筑的需要。
1 软件总体设计
本系统软件设计采用模块化的设计思想, 即将各功能模块分由各个子项目来完成, 然后由宏定义来决定某个模块是否在主程序中被定义、初始化、配置以及调用。这样整个项目不仅思路清晰、便于修改维护,更有利于整体升级。系统的软件设计主要包括:初始化模块、测量板检测模块和BLE 蓝牙通信模块。整个终端软件的模块框架图如图1 所示。
图1 软件模块化设计
初始化模块主要是完成对CC2640 的所使用资源的初始化以及通信协议及属性配置文件的初始化。其中使用资源初始化主要包括串口、OLED、外部存储器等UART、SPI 外设资源的初始化,定时器配置的各周期事件的初始化,以及宏管理决定的各检测模块的初始化; 通信协议及属性配置文件的初始化主要完成对GAP 连接管理的配置以及GATT 的配置。通信模块主要包括特征值通道属性设置、蓝牙接收及发送程序,另外还涉及到数据的格式转化。本系统总共配置了七个特征值通道:通道一负责通过蓝牙接收手机端发送的数据, 进而通过此通道接收值时所触发的事件执行对应处理的事件; 通道二至七则分别负责将温度、湿度、光照强度、声音、距离、加速度通过蓝牙上传至手机端。另外,在传输之前,需要将各个检测值对应的数据类型转换为通道传输所使用的值数据类型。
2 初始化模块软件设计
系统以CC2640 为核心的测量板控制电梯状态采集模块实时采集电梯的状态信息,并负责数据处理及输出。首先,统一加入各检测模块头文件的宏定义, 接着是SimpleBLEPeripheral_init(),通过ICall_registerApp()登记注册ICALL 后,配置了数个服务给任务,同时也配置系列硬件和软件的设置和参数,如:配置一些定期执行的事件的时钟,初始化GATT 客户端,注册各种Profile 中的回调函数,设置GAPRole,设置蓝牙配对管理,设置GAP 层,配置硬件模块如LCD、SPI 等。在初始化函数之后,任务函数会进入一个无限循环中, 它将会保持阻塞并等待一个信号量发送一个新的消息给进程。任务流程如图2 所示。
图2 任务流程图
3 检测模块设计
检测模块主要包括测距、光照强度检测、温度检测、声音检测和加速度检测模块,下面将分别介绍这几个模块的设计与实现。
3.1 测距模块设计
测距选用US100 测距模块,由于CC2640 这个片上资源只有一个硬件UART,若使用US100 的串口测距模式,则需要通过Sensor Controller Studio (SCS) 软件配置产生虚拟UART以供使用。开启UART 模拟设备,并设置US100 支持的波特率9600,使能RX 后必须使能通告事件(RX FIFO 满事件和RX 超时事件),保证事件触发后进入回调函数,从而发送信号量。在周期循环处理函数中,先用初始化的虚拟串口发送0x55,再等待信号量就绪,串口收到数据后会进入回调函数,发送信号量使其就绪,此时便可直接从scifUartRxGetChar()中获取数据。scifUartTxPutChar发送0x55 通知US100 准备接收数据后, 调用Semaphore_pend()来检查资源在使用前是否已经准备好,若有RX FIFO 满事件,则进入回调函数中Semaphore_post()信号量来触发,避免Semaphore_pend()一直等待。其中,scifClear-AlertIntSource()用来清除通告事件源。最后,(US_Dist[0] << 8)+US_Dist便是最终的检测结果。
3.2 光照强度检测
光照强度选用BH1750FVI 模块。首先,设置SCL 对应管脚输出模式,使用PIN_setConfig()自由切换SDA 管脚的输入输出模式。初始化SCL、SDA 为输出模式,使用CPUdelay()设定准确延时之后,利用SCL、SDA 的管脚的高低电平变化与适当延时构建IIC 各种时序函数, 如:IIC_Start、IIC_Stop、IIC_Wait_Ack、IIC_Ack、IIC_NAck、IIC_Write_Byte、IIC_Read_Byte, 分别对应功能:开启、关闭、等待接收响应应答、应答、不应答、写、读。IIC写RD_DEVICE_ADDR 地址后,等待响应应答后,就可依次读取并存取光强检测数值的高八位与低八位。最后,(float)multiple_read_i2c() / 1.2f 便是最终的光照强度检测结果。
3.3 温度检测模块
温度检测选用DHT11 模块,进入数据接收状态后,首先得保证主机端口为输入模式,在50 μs 低电平间隙后,通过判断高电平的时间来判断数据为是1 还是0。本系统使用了一种简单的方式: 在50 μs 低电平间隙之后延时大于28 μs 的时间,再判断数据端口输入高低电平情况,从而可知数据位为1 或0,若延时30 μs 后端口输入高电平,则数据位为1,反之则为0。
依次获取40 bit 数据,其中,第一、二个Byte 分别是湿度的整数、小数部分,第三、四个Byte 分别是温度的整数、小数部分,第五个Byte 则是前四个的Byte 的校验和。通过判断前四个Byte和的低八位与第五个Byte 是否相等, 来判断此次通信是否成功。若相等,则给温湿度赋值,若不相等,则给温湿度赋0,并将函数返回值置0。
3.4 声音检测模块
CC2640 的ADC 为12 位ADC, 且ADC 功能在RF core内部,由M0 核控制,CC2640 的ADC 有两种初始化方式,一种是使用Sensor controller Studio 去控制实现ADC 的基本功能,另一种则是使用官方的driverlib 去驱动ADC,本系统使用官方驱动库来实现ADC 的基本功能。使用官方库配置ADC,首先需要添加driverlib / aux_adc.h、driverlib / aux_wuc.h 驱动库头文件,然后开启时钟并等待时钟被使能,配置INPUT 管脚后,便是最关键的AUXADCEnableSync()函数。本系统对于该函数所选的第一个参数为AUXADC_REF_FIXED, 决定了ADC 的采样参考电压为4.3 V;第二个参数为采样时间,倒数则是采样频率;第三个参数就决定了本系统是手动触发采样,另外还可以配置为初始化后自动采样。手动触发采样后,便可以通过AUXADCReadFifo()直接读取采样值。在整个ADC 采样函数中,初始化之前开启时钟,获取采样值后关闭时钟,相当于在检测过程中才使用有关ADC 的资源, 非采样过程保证不开启任何关于ADC 的配置。这样能最大程度上实现测量板的低功耗。
3.5 加速度检测模块
加速度检测选用MPU6050 模块。首先,在板级文件Board.c中添加I2C 外设, 声明I2C 句柄和参数结构体作为局部变量,初始化结构体参数,设置参数为400 kHz 速率I2C 及I2C 模式。将接收、发送缓存区清掉之后开启I2C。由于在无加速度的情况下静态测量时发现,三轴方向的加速度都存在初始值,这样在测量方面就给了一个起始误差。因此, 本系统在初始化后便获取了1 000 次起始值,取各轴平均值作为偏移量,循环周期执行函数中调用加速度传感器模块获取的值都需要减去对应轴的偏移量,此过程流程图如图3 所示。
图3 MPU6050 模块程序流程图
4 通信模块设计
应用开始时都需要添加必须的GATT 服务,因此,需要建立一个全局的AddService 函数以便被应用层调用,类似协议栈中的GGS_AddService 和GATTServApp_AddService。在应用层调用来初始化属性表, 命名为SimpleProfile_Addservice(),主要包含以下三个功能: 为客户端特征值配置数组分配内存,使用来自上一次绑定连接的信息来初始化客户端特征值配置数组和将属性表通过GATTServApp 添加到协议栈管理的性表中。
Profile 必须定义读写回调函数,这样当一个Profile 的属性被写或被读,协议栈就可以调用对应的函数。注册回调函数后,每当有读写请求时,回调函数将会执行特征值的读写操作。当接收到一个来自GATT 客户端的读某个给定的属性的请求后,协议栈就会检查属性权限,如果属性是可读的,调用Profile 的读回调函数。当接收到一个来自GATT 客户端的关于某一给定的属性的写请求后,协议栈就会检查属性的权限,如果属性是可写的,就调用Profile 的写回调函数。应用层可以通过调用设置和获取抽象函数来写/ 读Profile 包含的特征值。另外,调用设置函数写被配置为Notify 或Indicated 的特征值时, 应该检查通知/指示的逻辑。
该系统改变了以往繁复的人工操作,具有一定的实际意义。
1 软件总体设计
本系统软件设计采用模块化的设计思想, 即将各功能模块分由各个子项目来完成, 然后由宏定义来决定某个模块是否在主程序中被定义、初始化、配置以及调用。这样整个项目不仅思路清晰、便于修改维护,更有利于整体升级。系统的软件设计主要包括:初始化模块、测量板检测模块和BLE 蓝牙通信模块。整个终端软件的模块框架图如图1 所示。
图1 软件模块化设计
初始化模块主要是完成对CC2640 的所使用资源的初始化以及通信协议及属性配置文件的初始化。其中使用资源初始化主要包括串口、OLED、外部存储器等UART、SPI 外设资源的初始化,定时器配置的各周期事件的初始化,以及宏管理决定的各检测模块的初始化; 通信协议及属性配置文件的初始化主要完成对GAP 连接管理的配置以及GATT 的配置。通信模块主要包括特征值通道属性设置、蓝牙接收及发送程序,另外还涉及到数据的格式转化。本系统总共配置了七个特征值通道:通道一负责通过蓝牙接收手机端发送的数据, 进而通过此通道接收值时所触发的事件执行对应处理的事件; 通道二至七则分别负责将温度、湿度、光照强度、声音、距离、加速度通过蓝牙上传至手机端。另外,在传输之前,需要将各个检测值对应的数据类型转换为通道传输所使用的值数据类型。
2 初始化模块软件设计
系统以CC2640 为核心的测量板控制电梯状态采集模块实时采集电梯的状态信息,并负责数据处理及输出。首先,统一加入各检测模块头文件的宏定义, 接着是SimpleBLEPeripheral_init(),通过ICall_registerApp()登记注册ICALL 后,配置了数个服务给任务,同时也配置系列硬件和软件的设置和参数,如:配置一些定期执行的事件的时钟,初始化GATT 客户端,注册各种Profile 中的回调函数,设置GAPRole,设置蓝牙配对管理,设置GAP 层,配置硬件模块如LCD、SPI 等。在初始化函数之后,任务函数会进入一个无限循环中, 它将会保持阻塞并等待一个信号量发送一个新的消息给进程。任务流程如图2 所示。
图2 任务流程图
3 检测模块设计
检测模块主要包括测距、光照强度检测、温度检测、声音检测和加速度检测模块,下面将分别介绍这几个模块的设计与实现。
3.1 测距模块设计
测距选用US100 测距模块,由于CC2640 这个片上资源只有一个硬件UART,若使用US100 的串口测距模式,则需要通过Sensor Controller Studio (SCS) 软件配置产生虚拟UART以供使用。开启UART 模拟设备,并设置US100 支持的波特率9600,使能RX 后必须使能通告事件(RX FIFO 满事件和RX 超时事件),保证事件触发后进入回调函数,从而发送信号量。在周期循环处理函数中,先用初始化的虚拟串口发送0x55,再等待信号量就绪,串口收到数据后会进入回调函数,发送信号量使其就绪,此时便可直接从scifUartRxGetChar()中获取数据。scifUartTxPutChar发送0x55 通知US100 准备接收数据后, 调用Semaphore_pend()来检查资源在使用前是否已经准备好,若有RX FIFO 满事件,则进入回调函数中Semaphore_post()信号量来触发,避免Semaphore_pend()一直等待。其中,scifClear-AlertIntSource()用来清除通告事件源。最后,(US_Dist[0] << 8)+US_Dist便是最终的检测结果。
3.2 光照强度检测
光照强度选用BH1750FVI 模块。首先,设置SCL 对应管脚输出模式,使用PIN_setConfig()自由切换SDA 管脚的输入输出模式。初始化SCL、SDA 为输出模式,使用CPUdelay()设定准确延时之后,利用SCL、SDA 的管脚的高低电平变化与适当延时构建IIC 各种时序函数, 如:IIC_Start、IIC_Stop、IIC_Wait_Ack、IIC_Ack、IIC_NAck、IIC_Write_Byte、IIC_Read_Byte, 分别对应功能:开启、关闭、等待接收响应应答、应答、不应答、写、读。IIC写RD_DEVICE_ADDR 地址后,等待响应应答后,就可依次读取并存取光强检测数值的高八位与低八位。最后,(float)multiple_read_i2c() / 1.2f 便是最终的光照强度检测结果。
3.3 温度检测模块
温度检测选用DHT11 模块,进入数据接收状态后,首先得保证主机端口为输入模式,在50 μs 低电平间隙后,通过判断高电平的时间来判断数据为是1 还是0。本系统使用了一种简单的方式: 在50 μs 低电平间隙之后延时大于28 μs 的时间,再判断数据端口输入高低电平情况,从而可知数据位为1 或0,若延时30 μs 后端口输入高电平,则数据位为1,反之则为0。
依次获取40 bit 数据,其中,第一、二个Byte 分别是湿度的整数、小数部分,第三、四个Byte 分别是温度的整数、小数部分,第五个Byte 则是前四个的Byte 的校验和。通过判断前四个Byte和的低八位与第五个Byte 是否相等, 来判断此次通信是否成功。若相等,则给温湿度赋值,若不相等,则给温湿度赋0,并将函数返回值置0。
3.4 声音检测模块
CC2640 的ADC 为12 位ADC, 且ADC 功能在RF core内部,由M0 核控制,CC2640 的ADC 有两种初始化方式,一种是使用Sensor controller Studio 去控制实现ADC 的基本功能,另一种则是使用官方的driverlib 去驱动ADC,本系统使用官方驱动库来实现ADC 的基本功能。使用官方库配置ADC,首先需要添加driverlib / aux_adc.h、driverlib / aux_wuc.h 驱动库头文件,然后开启时钟并等待时钟被使能,配置INPUT 管脚后,便是最关键的AUXADCEnableSync()函数。本系统对于该函数所选的第一个参数为AUXADC_REF_FIXED, 决定了ADC 的采样参考电压为4.3 V;第二个参数为采样时间,倒数则是采样频率;第三个参数就决定了本系统是手动触发采样,另外还可以配置为初始化后自动采样。手动触发采样后,便可以通过AUXADCReadFifo()直接读取采样值。在整个ADC 采样函数中,初始化之前开启时钟,获取采样值后关闭时钟,相当于在检测过程中才使用有关ADC 的资源, 非采样过程保证不开启任何关于ADC 的配置。这样能最大程度上实现测量板的低功耗。
3.5 加速度检测模块
加速度检测选用MPU6050 模块。首先,在板级文件Board.c中添加I2C 外设, 声明I2C 句柄和参数结构体作为局部变量,初始化结构体参数,设置参数为400 kHz 速率I2C 及I2C 模式。将接收、发送缓存区清掉之后开启I2C。由于在无加速度的情况下静态测量时发现,三轴方向的加速度都存在初始值,这样在测量方面就给了一个起始误差。因此, 本系统在初始化后便获取了1 000 次起始值,取各轴平均值作为偏移量,循环周期执行函数中调用加速度传感器模块获取的值都需要减去对应轴的偏移量,此过程流程图如图3 所示。
图3 MPU6050 模块程序流程图
4 通信模块设计
应用开始时都需要添加必须的GATT 服务,因此,需要建立一个全局的AddService 函数以便被应用层调用,类似协议栈中的GGS_AddService 和GATTServApp_AddService。在应用层调用来初始化属性表, 命名为SimpleProfile_Addservice(),主要包含以下三个功能: 为客户端特征值配置数组分配内存,使用来自上一次绑定连接的信息来初始化客户端特征值配置数组和将属性表通过GATTServApp 添加到协议栈管理的性表中。
Profile 必须定义读写回调函数,这样当一个Profile 的属性被写或被读,协议栈就可以调用对应的函数。注册回调函数后,每当有读写请求时,回调函数将会执行特征值的读写操作。当接收到一个来自GATT 客户端的读某个给定的属性的请求后,协议栈就会检查属性权限,如果属性是可读的,调用Profile 的读回调函数。当接收到一个来自GATT 客户端的关于某一给定的属性的写请求后,协议栈就会检查属性的权限,如果属性是可写的,就调用Profile 的写回调函数。应用层可以通过调用设置和获取抽象函数来写/ 读Profile 包含的特征值。另外,调用设置函数写被配置为Notify 或Indicated 的特征值时, 应该检查通知/指示的逻辑。
该系统改变了以往繁复的人工操作,具有一定的实际意义。