楊森杰 林錦鋒 馬凱創(chuàng) 邱斌
摘 ?要:心率與血氧含量是反映人體健康的關(guān)鍵生理指標(biāo),傳統(tǒng)心率血氧檢測(cè)儀存在穿戴不方便、抗干擾能力差以及智能信息化不高的局限性。針對(duì)以上不足,設(shè)計(jì)一種基于STM32微處理器和Android系統(tǒng)的便攜式無(wú)線傳輸心率血氧檢測(cè)儀,該系統(tǒng)采用MAX30102傳感器實(shí)現(xiàn)人體生理血氧和心率信號(hào)的采集,通過(guò)STM32F103C8T6單片機(jī)對(duì)信號(hào)進(jìn)行實(shí)時(shí)采樣及信號(hào)處理,通過(guò)ESP8266 WiFi模塊構(gòu)建無(wú)線傳輸網(wǎng)絡(luò),利用Java語(yǔ)言在Eclipse平臺(tái)設(shè)計(jì)APP上位機(jī)用于心率血氧生理數(shù)據(jù)的實(shí)時(shí)顯示與存儲(chǔ),方便用戶(hù)實(shí)時(shí)了解自身的生理參數(shù)變化及便于對(duì)生理數(shù)據(jù)進(jìn)行后期分析研究。實(shí)驗(yàn)結(jié)果表明,該系統(tǒng)APP上位機(jī)能夠遠(yuǎn)程無(wú)線接收并實(shí)時(shí)顯示心率血氧數(shù)據(jù)曲線,智能化水平較高并具有較強(qiáng)的實(shí)用性。
關(guān)鍵詞:心率;血氧飽和度;無(wú)線便攜;智能化
中圖分類(lèi)號(hào):TN949.6 ? ? ? 文獻(xiàn)標(biāo)志碼:A ? ? ? ? 文章編號(hào):2095-2945(2020)28-0047-04
Abstract: Heart rate and blood oxygen saturation are key physiological indicators that reflect human health. Traditional heart rate and blood oxygen detectors have the limitations of inconvenience, poor anti-interference ability, and low intelligence information. In view of the above shortcomings, a wireless portable detection system is designed based on STM32 microprocessor and Android. The system uses MAX30102 sensor to collect physiological oxygen and heart rate signals. STM32F103C8T6 single-chip is used to sample and process for real-time signal. A wireless transmission network is constructed by ESP8266 WiFi module. An APP host computer on the Eclipse platform is designed for display and storage by using the Java language, which is convenient to understand users' physiological parameter changes and research the physiological data. The experimental results show that the APP host computer of the system can remotely receive and display the data curve of heart rate and blood oxygen saturation in real time with a high level of intelligence and practicability.
Keywords: heart rate; blood oxygen saturation; wireless portable; intelligence
引言
隨著現(xiàn)代科技的不斷發(fā)展,人們?cè)谧非笪镔|(zhì)生活質(zhì)量的同時(shí)也不斷關(guān)注自身的健康狀況?,F(xiàn)如今,為滿足人們想隨時(shí)隨地監(jiān)測(cè)身體狀況的需求,便攜式可穿戴設(shè)備應(yīng)運(yùn)而生[1-3]。心率與血氧飽和度(SaO2)是反應(yīng)人體生理機(jī)能是否健康的關(guān)鍵指標(biāo)[4]。其中心率是指心臟每分鐘搏動(dòng)的次數(shù),是反映人體循環(huán)系統(tǒng)機(jī)能的重要參數(shù)。血氧飽和度是氧合血紅蛋白(HbO2)在總血紅蛋白(Hb)中的占比,即血氧在血液中的濃度,它是呼吸循環(huán)的一個(gè)重要生理參數(shù),監(jiān)測(cè)血氧飽和度可以對(duì)肺的血紅蛋白攜氧能力進(jìn)行評(píng)估。因此經(jīng)常性的對(duì)心率和血氧飽和度進(jìn)行監(jiān)測(cè),及時(shí)了解身體機(jī)能狀況,對(duì)身體異常有重要的預(yù)警作用[5]。
本設(shè)計(jì)以光電容積脈搏波測(cè)量原理為理論指導(dǎo)[6],采
用基于STM32微處理器和Android系統(tǒng)開(kāi)發(fā)的便攜式無(wú)線傳輸心率血氧檢測(cè)儀具有攜帶方便、遠(yuǎn)程通信、抗干擾性能強(qiáng)、智能化顯示與分析等特點(diǎn),適用于家庭社區(qū)的血氧飽和度以及心率的監(jiān)測(cè)。
1 心率血氧測(cè)量原理
SaO2的檢測(cè)原理是利用660nm的紅光和940nm的紅外光經(jīng)動(dòng)脈血中Hb和HbO2吸收,進(jìn)一步分析被吸收后的光信號(hào)由此計(jì)算SaO2值[7]。通過(guò)朗伯-比爾公式計(jì)算紅光(R)和紅外光(IR)的吸收強(qiáng)度比[8],計(jì)算公式如式(1)所示。其中,ACR、DCR、ACIR、DCIR分別表示紅光和紅外光在心臟收縮過(guò)程中的交流分量和心臟舒張過(guò)程中直流分量。
2 系統(tǒng)硬件總體設(shè)計(jì)方案
本系統(tǒng)主要由MAX30102高靈敏度血氧和心率生物傳感器、STM32F103C8T6單片機(jī)最小系統(tǒng)、LCD液晶顯示器模塊、ESP8266 WiFi無(wú)線傳輸模塊、Android智能手機(jī)等組成,系統(tǒng)結(jié)構(gòu)如圖1所示。系統(tǒng)工作流程首先是利用MAX30102傳感器實(shí)現(xiàn)人體生理血氧和心率信號(hào)的實(shí)時(shí)采集,單片機(jī)對(duì)采集信號(hào)進(jìn)行實(shí)時(shí)處理與命令控制;然后通過(guò)ESP8266 WiFi模塊構(gòu)建無(wú)線傳輸網(wǎng)絡(luò),按通信協(xié)議收發(fā)數(shù)據(jù);最后利用Java語(yǔ)言在Eclipse平臺(tái)設(shè)計(jì)智能手機(jī)APP上位機(jī)軟件用于心率血氧生理數(shù)據(jù)的實(shí)時(shí)顯示與存儲(chǔ)。
3 系統(tǒng)軟件設(shè)計(jì)
本系統(tǒng)的軟件設(shè)計(jì)主要包括硬件控制部分軟件設(shè)計(jì)以及信號(hào)處理與分析軟件設(shè)計(jì)。硬件控制部分的軟件設(shè)計(jì)在結(jié)構(gòu)上分為主控程序、WiFi模塊、LCD顯示程序、STM32與MAX30102的數(shù)據(jù)處理程序。系統(tǒng)工作后首先對(duì)各個(gè)程序模塊進(jìn)行初始化,對(duì)各個(gè)模塊進(jìn)行數(shù)據(jù)讀取。采用C語(yǔ)言在Keil5開(kāi)發(fā)環(huán)境中對(duì)單片機(jī)部分的軟件進(jìn)行開(kāi)發(fā)。系統(tǒng)軟件設(shè)計(jì)總體流程圖如圖2所示。
3.1 ESP8266無(wú)線傳輸軟件設(shè)計(jì)
本設(shè)計(jì)利用ESP8266 WiFi模塊構(gòu)建無(wú)線傳輸網(wǎng)絡(luò),實(shí)現(xiàn)將心率、血氧飽和度信息無(wú)線發(fā)送至智能移動(dòng)設(shè)備的APP上位機(jī),用于心率血氧生理數(shù)據(jù)的實(shí)時(shí)顯示與存儲(chǔ),方便用戶(hù)實(shí)時(shí)了解自身的生理參數(shù)變化及便于對(duì)生理數(shù)據(jù)進(jìn)行后期分析研究。本設(shè)計(jì)采用ESP8266 的AP工作模式,即將ESP8266模塊作為熱點(diǎn),移動(dòng)設(shè)備或者PC設(shè)備通過(guò)WiFi直接模塊進(jìn)行通信,實(shí)現(xiàn)局域網(wǎng)無(wú)線傳輸與控制。其中,模塊的初始化設(shè)置實(shí)現(xiàn)過(guò)程代碼信息如下:
//連接端口號(hào):8086,可以自行更改為其他端口
const u8* portnum= "60000";
//WIFI設(shè)定為AP模式,要設(shè)定其他模式在此配置
const u8* WIFIap_ssid="ESP8266-01";
//對(duì)外SSID號(hào),無(wú)線信號(hào)的名稱(chēng)
const u8* WIFIap_encryption="wpawpa2_aes";
//設(shè)置為WPA/WPA2/AES加密方式
const u8* WIFIap_password="12345678";
//WIFI無(wú)線密碼
無(wú)線數(shù)據(jù)傳輸函數(shù)代碼設(shè)計(jì)如下:
u8 atk_8266_send_data(u8 *data,u8 *ack,u16 waittime)
{ ? ? ?u8 res=0;
USART1_RX_STA=0;
UART1_Send_DATA(data); ?//發(fā)送數(shù)據(jù)
if(ack&&waittime) ? //需要等待應(yīng)答
{ ? while(--waittime) ? //等待倒計(jì)時(shí)
{ delay_ms(10);
if(USART1_RX_STA&0X8000)
//接收到想要的應(yīng)答
{ if(atk_8266_check_cmd(ack))break;
//得到有效數(shù)據(jù)后跳出執(zhí)行
USART1_RX_STA=0;}
} if(waittime==0)res=1;
} return res;}
其中,data表示要發(fā)送的數(shù)據(jù),ack為應(yīng)答結(jié)果,如果為空,表示不需要等待應(yīng)答;waittime表示等待時(shí)間,如果返回值res為0,表示數(shù)據(jù)發(fā)送成功。
3.2 APP上位機(jī)軟件設(shè)計(jì)
本節(jié)詳細(xì)介紹在Eclipse平臺(tái)設(shè)計(jì)APP上位機(jī),用于心率血氧生理數(shù)據(jù)的實(shí)時(shí)繪制與顯示。WiFi無(wú)線傳輸數(shù)據(jù)后,將其放在Android的服務(wù)中。主程序需要獲取服務(wù)中獲取的數(shù)據(jù),同時(shí)使用通知模式,即當(dāng)服務(wù)中數(shù)據(jù)讀取模塊獲取到數(shù)據(jù)后通知主程序去處理,主程序一直等待服務(wù)的數(shù)據(jù)返回。獲取到數(shù)據(jù)之后,對(duì)數(shù)據(jù)進(jìn)行解析處理并圖形化顯示,其實(shí)時(shí)顯示的設(shè)計(jì)流程圖如圖3所示。
本設(shè)計(jì)除了將WiFi獲取到的數(shù)據(jù)通過(guò)數(shù)字顯示出來(lái)以外還能使其通過(guò)屏幕點(diǎn)坐標(biāo)進(jìn)行圖形化顯示。本設(shè)計(jì)中APP在主界面上放置了兩個(gè)Text View來(lái)實(shí)現(xiàn)血氧飽和度和心率的顯示,當(dāng)完成血氧飽和度和心率的計(jì)算后,更新Text View的值,達(dá)到動(dòng)態(tài)和實(shí)時(shí)顯示的效果。在主線程中完成動(dòng)態(tài)顯示Android繪制圖像,利用Android Surface View 實(shí)現(xiàn)異步線程圖形繪制。實(shí)時(shí)動(dòng)態(tài)繪制心率與血氧曲線的設(shè)計(jì)流程如圖4所示。
其中Android Surface View曲線核心程序如下:
public void setXYMultipleSeriesRenderer(double maxX, double maxY,)
……
XYMultipleSeriesRenderer();
//創(chuàng)建新的對(duì)象,繼承父類(lèi)
……
multipleSeriesRenderer.setRange(new double[]{X, maxX, Y,maxY });
//x y軸初始的范圍
multipleSeriesRenderer.setLabelsColor(labelColor);
multipleSeriesRenderer.setXLabels(18);
//X軸顯示的坐標(biāo)個(gè)數(shù)(下標(biāo)識(shí))
multipleSeriesRenderer.setYLabels(25);
//Y軸顯示的坐標(biāo)個(gè)數(shù)
multipleSeriesRenderer.setPanLimits(new double[]{0,10
000,0,250});//設(shè)置拉動(dòng)的范圍
……
multipleSeriesRenderer.setPointSize(5f);//曲線描點(diǎn)尺寸
multipleSeriesRenderer.setFitLegend(true);//調(diào)整合適