基于Android 及Arduino 的可穿戴式生命体征检测系统
2019-11-18黄宁陈乙德
黄宁,陈乙德
(中山大学新华学院信息科学学院,东莞 523133)
0 引言
近年来,消费级的可穿戴设备逐渐走进人们生活,有一部分诸如小米手环、华为手表之类的可穿戴设备集成了心率监测的功能。然而这些可穿戴设备普遍存在续航时间短、无法监测体温、功能冗杂、成本偏高等缺陷[1]。这是由于厂商在可穿戴设备上集成了过多的功能所导致的。换言之,市面上并不存在一款专注生命体征监测的可穿戴设备。本文介绍了一种低成本、长续航、高可靠性、专注于生命体征监测的可穿戴设备[2]。
1 生命体征监测系统设计
为了提升系统续航,降低充电频率,故而硬件应该在满足基本需求的前提下尽可能简化,同时硬件也应当考虑到功耗控制。因此蓝牙模块选取了BT04 蓝牙从机模块。由于系统对精度要求不高,为降低实现难度,温度传感器选取了LM35 温度传感器模块。系统控制器采用了集成有ATmega2560 芯片的Mega2560,Mega2560 具有同时具有54 路数字输入/输出口(其中15 路可作为PWM 输出),15 路模拟输入,4 路UART接口,预留了极大的升级余地。
图1 系统硬件设计框图
LM35 是由National Semiconductor 所生产的温度感测器,其输出电压与摄氏温标呈线性关系,转换公式如下,0°C 时输出为0V,每升高1°C,输出电压增加10mV。
心率测量采用的是PulseSensor 模块,这一模块集成了光电变换器和光源两部分,降低了系统的实现难度。这一模块的原理是当心脏跳动时人体组织会周期性地出现透光率的改变,通过监测透光率的变化就能测量心率,即光电容积法。
光电容积法的原理是监测心脏周期性收缩舒张导致动脉内血液充盈程度变化从而进行脉搏测量。进而导致人体组织透光率发生改变。光电容积法的光源一般采用波长为500nm-700nm 的发光二极管,这一波长对动脉血中氧和血红蛋白有选择性。
血管内血液充盈程度变化将导致血液的透光能力发生改变,此时光电变换器通过接收反射从人体组织反射的特定波长的光线,将光信号转变为电信号并通过硬件电路将电信号进行处理后输出。因为脉搏和动脉血管容积都会随着心脏的搏动而周期性变化,所以根据电信号变化周期就能得到脉搏率[3]。
图2 脉搏数据读取流程图
数据传输考虑到稳定性、功耗等多方面因素采用的是蓝牙技术[4],由于无需充当蓝牙主机,采用的是BT04-A 蓝牙从机模块,支持蓝牙V3.0+EDR、蓝牙Class 2、UART 接口,内置PCB 射频天线,使用3.3V 电源供电。
2 系统软件设计
应用运行在Android API 大于等于22 的Android系统上,低于此API 有可能出现未知问题。软件主要由数据接收模块、蓝牙控制模块以及数据显示模块构成。
2.1 数据接收模块
为保证长时间稳定接收来自硬件的消息,因而需要创建线程进行专门的数据读取,加上由于Android 特性,无法在主线程中执行耗时操作[5],故而使用Service内建线程的方法实现数据读取。
数据接收模块通过回调的方式实现与数据显示模块之间的通讯。
/***数据接收模块内代码****/
private Callback callback=null;
public void setThisCallback(Callback mCallback){
this.callback=mCallback;
}
public static interface Callback{
void onDataChange(String data);//空方法
}
public Callback getThisCallback(){
return callback;
}
/***数据显示模块内代码****/
bleBinder=(BleListenService.BleBinder)service;
bleBinder.getService().setThisCallback(new BleListen-Service.Callback(){
@Override
public void onDataChange(String data){
//实现onDataChange 方法
Message msg=new Message();//新建消息对象
Bundle bundle=new Bundle();
bundle.putString("data",data);
msg.setData(bundle);
handler.sendMessage(msg);
//将数据发送至模块内的handler 做进一步处理
}
});
图3 数据读取流程图
2.2 蓝牙控制模块
蓝牙控制模块包含简化后的蓝牙工具类、蓝牙广播接收器,以及一个进行数据测试的输入框,同时创建了一个显示界面以便用户使用进行操作。蓝牙控制模块负责实现蓝牙连接、蓝牙搜索、蓝牙配对及蓝牙相关权限的申请。
private final BroadcastReceiver mReceiver1;
mReceiver1=new BroadcastReceiver(){
@Override
public void onReceive(Context context,Intent intent){
String mAction1=intent.getAction();
BluetoothDevice mDevice1;
//与发现设备的广播进行比对
if (BluetoothDevice.ACTION_FOUND.equals(mAction1)){
//获取设备的详细信息
mDevice1=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
String s1=mDevice.getBondState();
//判断搜索到的设备是否配对
if(s1!=BluetoothDevice.BOND_BONDED){
s1=mDevice1.getBleName()+":"+mDevice1.get-BleAddress()
bluetoothDevices.add("未配对"+s1);
}
}
}
};
图4 蓝牙操作界面
图5 蓝牙设备搜索流程图
2.3 数据显示模块
数据显示模块内实现了回调接口,在onRestart 函数调用时将现有服务进行绑定,通过回调接口实现跨线程通讯,依赖handle 实例对数据进行处理并将主界面显示进行更新。
图6 数据显示界面
3 系统运行结果及分析
3.1 系统测试
系统测试存在于开发的各阶段,测试需要覆盖每个模块,一方面是为了保障模块能够正常运行,另一方面是为了保障系统符合设计需求。
表1 测试环境搭建
在表1 所示的测试环境中,对设计功能进行测试,得到如表2 的结果。
表2 系统功能测试
3.2 传输稳定性测试
为更贴合实际情况,实验模拟了用户手持Android设备时的场景。测试通过统计来自从机的数据包编号,Android 应用接收到的数据包个数,计算不同距离下传输中的丢包率。实验结果如表3 所示。
根据表3 可得到以下结论。Android 设备与硬件距离在150cm 以内可确保数据过程中的稳定性,而150cm 的通信距离完全满足本系统应用要求,因此这一系统在正常使用中的稳定性满足要求。
表3 传输稳定性测试
4 结语
本文实现了采用可穿戴设备与手机应用协同工作的构想,其主要是结合可穿戴设备的浪潮,在Arduino与Android 平台上进行开发的。通过Android Studio 与Arduino IDE 这两个集成开发环境,使用Java 与C 语言的一个子集进行完成了系统的开发。系统的稳定性和和可靠性较好,基本可以实现“使用户能够便捷且实时的了解到自己的生命体征”这一设计目标。