楊森杰 林錦鋒 馬凱創(chuàng) 邱斌
摘 ?要:心率與血氧含量是反映人體健康的關鍵生理指標,傳統心率血氧檢測儀存在穿戴不方便、抗干擾能力差以及智能信息化不高的局限性。針對以上不足,設計一種基于STM32微處理器和Android系統的便攜式無線傳輸心率血氧檢測儀,該系統采用MAX30102傳感器實現人體生理血氧和心率信號的采集,通過STM32F103C8T6單片機對信號進行實時采樣及信號處理,通過ESP8266 WiFi模塊構建無線傳輸網絡,利用Java語言在Eclipse平臺設計APP上位機用于心率血氧生理數據的實時顯示與存儲,方便用戶實時了解自身的生理參數變化及便于對生理數據進行后期分析研究。實驗結果表明,該系統APP上位機能夠遠程無線接收并實時顯示心率血氧數據曲線,智能化水平較高并具有較強的實用性。
關鍵詞:心率;血氧飽和度;無線便攜;智能化
中圖分類號:TN949.6 ? ? ? 文獻標志碼:A ? ? ? ? 文章編號: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
引言
隨著現代科技的不斷發(fā)展,人們在追求物質生活質量的同時也不斷關注自身的健康狀況。現如今,為滿足人們想隨時隨地監(jiān)測身體狀況的需求,便攜式可穿戴設備應運而生[1-3]。心率與血氧飽和度(SaO2)是反應人體生理機能是否健康的關鍵指標[4]。其中心率是指心臟每分鐘搏動的次數,是反映人體循環(huán)系統機能的重要參數。血氧飽和度是氧合血紅蛋白(HbO2)在總血紅蛋白(Hb)中的占比,即血氧在血液中的濃度,它是呼吸循環(huán)的一個重要生理參數,監(jiān)測血氧飽和度可以對肺的血紅蛋白攜氧能力進行評估。因此經常性的對心率和血氧飽和度進行監(jiān)測,及時了解身體機能狀況,對身體異常有重要的預警作用[5]。
本設計以光電容積脈搏波測量原理為理論指導[6],采
用基于STM32微處理器和Android系統開發(fā)的便攜式無線傳輸心率血氧檢測儀具有攜帶方便、遠程通信、抗干擾性能強、智能化顯示與分析等特點,適用于家庭社區(qū)的血氧飽和度以及心率的監(jiān)測。
1 心率血氧測量原理
SaO2的檢測原理是利用660nm的紅光和940nm的紅外光經動脈血中Hb和HbO2吸收,進一步分析被吸收后的光信號由此計算SaO2值[7]。通過朗伯-比爾公式計算紅光(R)和紅外光(IR)的吸收強度比[8],計算公式如式(1)所示。其中,ACR、DCR、ACIR、DCIR分別表示紅光和紅外光在心臟收縮過程中的交流分量和心臟舒張過程中直流分量。
2 系統硬件總體設計方案
本系統主要由MAX30102高靈敏度血氧和心率生物傳感器、STM32F103C8T6單片機最小系統、LCD液晶顯示器模塊、ESP8266 WiFi無線傳輸模塊、Android智能手機等組成,系統結構如圖1所示。系統工作流程首先是利用MAX30102傳感器實現人體生理血氧和心率信號的實時采集,單片機對采集信號進行實時處理與命令控制;然后通過ESP8266 WiFi模塊構建無線傳輸網絡,按通信協議收發(fā)數據;最后利用Java語言在Eclipse平臺設計智能手機APP上位機軟件用于心率血氧生理數據的實時顯示與存儲。
3 系統軟件設計
本系統的軟件設計主要包括硬件控制部分軟件設計以及信號處理與分析軟件設計。硬件控制部分的軟件設計在結構上分為主控程序、WiFi模塊、LCD顯示程序、STM32與MAX30102的數據處理程序。系統工作后首先對各個程序模塊進行初始化,對各個模塊進行數據讀取。采用C語言在Keil5開發(fā)環(huán)境中對單片機部分的軟件進行開發(fā)。系統軟件設計總體流程圖如圖2所示。
3.1 ESP8266無線傳輸軟件設計
本設計利用ESP8266 WiFi模塊構建無線傳輸網絡,實現將心率、血氧飽和度信息無線發(fā)送至智能移動設備的APP上位機,用于心率血氧生理數據的實時顯示與存儲,方便用戶實時了解自身的生理參數變化及便于對生理數據進行后期分析研究。本設計采用ESP8266 的AP工作模式,即將ESP8266模塊作為熱點,移動設備或者PC設備通過WiFi直接模塊進行通信,實現局域網無線傳輸與控制。其中,模塊的初始化設置實現過程代碼信息如下:
//連接端口號:8086,可以自行更改為其他端口
const u8* portnum= "60000";
//WIFI設定為AP模式,要設定其他模式在此配置
const u8* WIFIap_ssid="ESP8266-01";
//對外SSID號,無線信號的名稱
const u8* WIFIap_encryption="wpawpa2_aes";
//設置為WPA/WPA2/AES加密方式
const u8* WIFIap_password="12345678";
//WIFI無線密碼
無線數據傳輸函數代碼設計如下:
u8 atk_8266_send_data(u8 *data,u8 *ack,u16 waittime)
{ ? ? ?u8 res=0;
USART1_RX_STA=0;
UART1_Send_DATA(data); ?//發(fā)送數據
if(ack&&waittime) ? //需要等待應答
{ ? while(--waittime) ? //等待倒計時
{ delay_ms(10);
if(USART1_RX_STA&0X8000)
//接收到想要的應答
{ if(atk_8266_check_cmd(ack))break;
//得到有效數據后跳出執(zhí)行
USART1_RX_STA=0;}
} if(waittime==0)res=1;
} return res;}
其中,data表示要發(fā)送的數據,ack為應答結果,如果為空,表示不需要等待應答;waittime表示等待時間,如果返回值res為0,表示數據發(fā)送成功。
3.2 APP上位機軟件設計
本節(jié)詳細介紹在Eclipse平臺設計APP上位機,用于心率血氧生理數據的實時繪制與顯示。WiFi無線傳輸數據后,將其放在Android的服務中。主程序需要獲取服務中獲取的數據,同時使用通知模式,即當服務中數據讀取模塊獲取到數據后通知主程序去處理,主程序一直等待服務的數據返回。獲取到數據之后,對數據進行解析處理并圖形化顯示,其實時顯示的設計流程圖如圖3所示。
本設計除了將WiFi獲取到的數據通過數字顯示出來以外還能使其通過屏幕點坐標進行圖形化顯示。本設計中APP在主界面上放置了兩個Text View來實現血氧飽和度和心率的顯示,當完成血氧飽和度和心率的計算后,更新Text View的值,達到動態(tài)和實時顯示的效果。在主線程中完成動態(tài)顯示Android繪制圖像,利用Android Surface View 實現異步線程圖形繪制。實時動態(tài)繪制心率與血氧曲線的設計流程如圖4所示。
其中Android Surface View曲線核心程序如下:
public void setXYMultipleSeriesRenderer(double maxX, double maxY,)
……
XYMultipleSeriesRenderer();
//創(chuàng)建新的對象,繼承父類
……
multipleSeriesRenderer.setRange(new double[]{X, maxX, Y,maxY });
//x y軸初始的范圍
multipleSeriesRenderer.setLabelsColor(labelColor);
multipleSeriesRenderer.setXLabels(18);
//X軸顯示的坐標個數(下標識)
multipleSeriesRenderer.setYLabels(25);
//Y軸顯示的坐標個數
multipleSeriesRenderer.setPanLimits(new double[]{0,10
000,0,250});//設置拉動的范圍
……
multipleSeriesRenderer.setPointSize(5f);//曲線描點尺寸
multipleSeriesRenderer.setFitLegend(true);//調整合適