黃寧,陳乙德
(中山大學新華學院信息科學學院,東莞 523133)
近年來,消費級的可穿戴設(shè)備逐漸走進人們生活,有一部分諸如小米手環(huán)、華為手表之類的可穿戴設(shè)備集成了心率監(jiān)測的功能。然而這些可穿戴設(shè)備普遍存在續(xù)航時間短、無法監(jiān)測體溫、功能冗雜、成本偏高等缺陷[1]。這是由于廠商在可穿戴設(shè)備上集成了過多的功能所導致的。換言之,市面上并不存在一款專注生命體征監(jiān)測的可穿戴設(shè)備。本文介紹了一種低成本、長續(xù)航、高可靠性、專注于生命體征監(jiān)測的可穿戴設(shè)備[2]。
為了提升系統(tǒng)續(xù)航,降低充電頻率,故而硬件應(yīng)該在滿足基本需求的前提下盡可能簡化,同時硬件也應(yīng)當考慮到功耗控制。因此藍牙模塊選取了BT04 藍牙從機模塊。由于系統(tǒng)對精度要求不高,為降低實現(xiàn)難度,溫度傳感器選取了LM35 溫度傳感器模塊。系統(tǒng)控制器采用了集成有ATmega2560 芯片的Mega2560,Mega2560 具有同時具有54 路數(shù)字輸入/輸出口(其中15 路可作為PWM 輸出),15 路模擬輸入,4 路UART接口,預留了極大的升級余地。
圖1 系統(tǒng)硬件設(shè)計框圖
LM35 是由National Semiconductor 所生產(chǎn)的溫度感測器,其輸出電壓與攝氏溫標呈線性關(guān)系,轉(zhuǎn)換公式如下,0°C 時輸出為0V,每升高1°C,輸出電壓增加10mV。
心率測量采用的是PulseSensor 模塊,這一模塊集成了光電變換器和光源兩部分,降低了系統(tǒng)的實現(xiàn)難度。這一模塊的原理是當心臟跳動時人體組織會周期性地出現(xiàn)透光率的改變,通過監(jiān)測透光率的變化就能測量心率,即光電容積法。
光電容積法的原理是監(jiān)測心臟周期性收縮舒張導致動脈內(nèi)血液充盈程度變化從而進行脈搏測量。進而導致人體組織透光率發(fā)生改變。光電容積法的光源一般采用波長為500nm-700nm 的發(fā)光二極管,這一波長對動脈血中氧和血紅蛋白有選擇性。
血管內(nèi)血液充盈程度變化將導致血液的透光能力發(fā)生改變,此時光電變換器通過接收反射從人體組織反射的特定波長的光線,將光信號轉(zhuǎn)變?yōu)殡娦盘柌⑼ㄟ^硬件電路將電信號進行處理后輸出。因為脈搏和動脈血管容積都會隨著心臟的搏動而周期性變化,所以根據(jù)電信號變化周期就能得到脈搏率[3]。
圖2 脈搏數(shù)據(jù)讀取流程圖
數(shù)據(jù)傳輸考慮到穩(wěn)定性、功耗等多方面因素采用的是藍牙技術(shù)[4],由于無需充當藍牙主機,采用的是BT04-A 藍牙從機模塊,支持藍牙V3.0+EDR、藍牙Class 2、UART 接口,內(nèi)置PCB 射頻天線,使用3.3V 電源供電。
應(yīng)用運行在Android API 大于等于22 的Android系統(tǒng)上,低于此API 有可能出現(xiàn)未知問題。軟件主要由數(shù)據(jù)接收模塊、藍牙控制模塊以及數(shù)據(jù)顯示模塊構(gòu)成。
為保證長時間穩(wěn)定接收來自硬件的消息,因而需要創(chuàng)建線程進行專門的數(shù)據(jù)讀取,加上由于Android 特性,無法在主線程中執(zhí)行耗時操作[5],故而使用Service內(nèi)建線程的方法實現(xiàn)數(shù)據(jù)讀取。
數(shù)據(jù)接收模塊通過回調(diào)的方式實現(xiàn)與數(shù)據(jù)顯示模塊之間的通訊。
/***數(shù)據(jù)接收模塊內(nèi)代碼****/
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;
}
/***數(shù)據(jù)顯示模塊內(nèi)代碼****/
bleBinder=(BleListenService.BleBinder)service;
bleBinder.getService().setThisCallback(new BleListen-Service.Callback(){
@Override
public void onDataChange(String data){
//實現(xiàn)onDataChange 方法
Message msg=new Message();//新建消息對象
Bundle bundle=new Bundle();
bundle.putString("data",data);
msg.setData(bundle);
handler.sendMessage(msg);
//將數(shù)據(jù)發(fā)送至模塊內(nèi)的handler 做進一步處理
}
});
圖3 數(shù)據(jù)讀取流程圖
藍牙控制模塊包含簡化后的藍牙工具類、藍牙廣播接收器,以及一個進行數(shù)據(jù)測試的輸入框,同時創(chuàng)建了一個顯示界面以便用戶使用進行操作。藍牙控制模塊負責實現(xiàn)藍牙連接、藍牙搜索、藍牙配對及藍牙相關(guān)權(quán)限的申請。
private final BroadcastReceiver mReceiver1;
mReceiver1=new BroadcastReceiver(){
@Override
public void onReceive(Context context,Intent intent){
String mAction1=intent.getAction();
BluetoothDevice mDevice1;
//與發(fā)現(xiàn)設(shè)備的廣播進行比對
if (BluetoothDevice.ACTION_FOUND.equals(mAction1)){
//獲取設(shè)備的詳細信息
mDevice1=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
String s1=mDevice.getBondState();
//判斷搜索到的設(shè)備是否配對
if(s1!=BluetoothDevice.BOND_BONDED){
s1=mDevice1.getBleName()+":"+mDevice1.get-BleAddress()
bluetoothDevices.add("未配對"+s1);
}
}
}
};
圖4 藍牙操作界面
圖5 藍牙設(shè)備搜索流程圖
數(shù)據(jù)顯示模塊內(nèi)實現(xiàn)了回調(diào)接口,在onRestart 函數(shù)調(diào)用時將現(xiàn)有服務(wù)進行綁定,通過回調(diào)接口實現(xiàn)跨線程通訊,依賴handle 實例對數(shù)據(jù)進行處理并將主界面顯示進行更新。
圖6 數(shù)據(jù)顯示界面
系統(tǒng)測試存在于開發(fā)的各階段,測試需要覆蓋每個模塊,一方面是為了保障模塊能夠正常運行,另一方面是為了保障系統(tǒng)符合設(shè)計需求。
表1 測試環(huán)境搭建
在表1 所示的測試環(huán)境中,對設(shè)計功能進行測試,得到如表2 的結(jié)果。
表2 系統(tǒng)功能測試
為更貼合實際情況,實驗?zāi)M了用戶手持Android設(shè)備時的場景。測試通過統(tǒng)計來自從機的數(shù)據(jù)包編號,Android 應(yīng)用接收到的數(shù)據(jù)包個數(shù),計算不同距離下傳輸中的丟包率。實驗結(jié)果如表3 所示。
根據(jù)表3 可得到以下結(jié)論。Android 設(shè)備與硬件距離在150cm 以內(nèi)可確保數(shù)據(jù)過程中的穩(wěn)定性,而150cm 的通信距離完全滿足本系統(tǒng)應(yīng)用要求,因此這一系統(tǒng)在正常使用中的穩(wěn)定性滿足要求。
表3 傳輸穩(wěn)定性測試
本文實現(xiàn)了采用可穿戴設(shè)備與手機應(yīng)用協(xié)同工作的構(gòu)想,其主要是結(jié)合可穿戴設(shè)備的浪潮,在Arduino與Android 平臺上進行開發(fā)的。通過Android Studio 與Arduino IDE 這兩個集成開發(fā)環(huán)境,使用Java 與C 語言的一個子集進行完成了系統(tǒng)的開發(fā)。系統(tǒng)的穩(wěn)定性和和可靠性較好,基本可以實現(xiàn)“使用戶能夠便捷且實時的了解到自己的生命體征”這一設(shè)計目標。