1 緒論1.1 課題來(lái)源及背景人類(lèi)社會(huì)從猿類(lèi)時(shí)代進(jìn)化到現(xiàn)在的高科技時(shí)代,人們的生活需求也一直在改變,從對(duì)基本溫飽的需求轉(zhuǎn)變?yōu)楝F(xiàn)在的健康需求,正在逐步升華。2013年 11 月,有關(guān)調(diào)查報(bào)告指出:我國(guó)有近 65%的人群是處于亞健康狀態(tài)的,這一特殊人群雖然沒(méi)有直接表現(xiàn)出明確的疾病,但是他們內(nèi)在活力卻不斷下降,長(zhǎng)此以往,會(huì)非常容易引起各種疾病,因此,這部分人群特別需健全、便捷、舒適的家庭健康監(jiān)護(hù)及醫(yī)療保健服務(wù)[1]。然而目前在醫(yī)院中使用的大型醫(yī)療監(jiān)護(hù)設(shè)備無(wú)法滿(mǎn)足在家庭對(duì)這部分特殊群體的健康監(jiān)測(cè),需要開(kāi)發(fā)設(shè)計(jì)一種更加舒適、便捷、廉價(jià)、人性化的智能化家庭健康監(jiān)護(hù)系統(tǒng)來(lái)適應(yīng)人們對(duì)健康監(jiān)護(hù)設(shè)備的應(yīng)用需求。
繼互聯(lián)網(wǎng)之后,互聯(lián)網(wǎng)+的時(shí)代也漸漸到來(lái),智能這個(gè)詞也唄使用的越來(lái)越廣泛,有關(guān)的智能技術(shù)也逐漸浮現(xiàn)出來(lái),并且相當(dāng)多的領(lǐng)域也開(kāi)始使用智能技術(shù)[2]。“智能化”正在慢慢地使人們的生活健康方式發(fā)生變化。如今智能化的健康醫(yī)療產(chǎn)品在設(shè)計(jì)方面主要有以下兩種體現(xiàn):①智能化健康醫(yī)療產(chǎn)品在其功能上更加符合人們的需求和愿望。比如,現(xiàn)在的智能電子血壓儀,替代了以往老式的血壓儀,其體積變得更加輕盈,不僅使用場(chǎng)合不再受限制,而且可以隨時(shí)隨地的記錄用戶(hù)和患者自身的血壓狀況,可以幫助其管理自身健康和病情,并且通過(guò)最近3次血壓平均值顯示更精準(zhǔn)。自動(dòng)感應(yīng)高度功能,正確提示使用者的測(cè)量姿勢(shì),獲得準(zhǔn)確精值。并且通過(guò)智能手機(jī)連接應(yīng)用實(shí)時(shí)記錄健康信息。傳統(tǒng)的血壓儀同樣也運(yùn)用的物理及生物技術(shù),但與傳統(tǒng)相比,新型智能血壓儀本質(zhì)性區(qū)別在于它的功能變得智能化,更加滿(mǎn)足人們的需求,實(shí)現(xiàn)了血壓?jiǎn)栴}患者的愿望[3]。②這類(lèi)健康醫(yī)療產(chǎn)品的操作非常便捷,人機(jī)交互友好。友好的人機(jī)交互會(huì)給使用者帶來(lái)不錯(cuò)的使用體驗(yàn)。比如,在以往的醫(yī)療環(huán)境中,化驗(yàn)血尿等常規(guī)檢查的流程極為煩冗,而且等待的排隊(duì)時(shí)間會(huì)讓人失去耐心。現(xiàn)在醫(yī)院中為患者提供的自動(dòng)化驗(yàn)以及自動(dòng)取單機(jī),只需要把取樣放到機(jī)器中,錄入病例里的個(gè)人信息二維碼,機(jī)器會(huì)提示過(guò)多久來(lái)取化驗(yàn)單。取單時(shí)只需把病例上的二維碼掃入機(jī)器,單子便可輕松取出。這種智能化醫(yī)療設(shè)備不僅為患者節(jié)省了時(shí)間,同時(shí)也為醫(yī)護(hù)人員減輕了很多工作負(fù)擔(dān)[4]。
智能化家庭健康監(jiān)護(hù)系統(tǒng)就是一種新型家庭醫(yī)療監(jiān)護(hù)設(shè)備,將人體健康數(shù)據(jù)采集,并且具有數(shù)據(jù)交叉分析與處理以及本地健康問(wèn)題咨詢(xún)和云共享等多種功能,可以將傳統(tǒng)的病人去醫(yī)院就診模式轉(zhuǎn)變?yōu)榭蛻?hù)健康信息實(shí)時(shí)上傳至云端服務(wù)器,同時(shí)也會(huì)傳送給手機(jī)APP,能夠由醫(yī)生對(duì)病人的信息進(jìn)行監(jiān)護(hù)和管理,主動(dòng)上門(mén)就診。
1.2 課題研究?jī)?nèi)容及結(jié)構(gòu)本文設(shè)計(jì)希望通過(guò)前端硬件采集多生理參數(shù),通過(guò)藍(lán)牙遠(yuǎn)程傳輸給手機(jī)APP,從而實(shí)現(xiàn)對(duì)身體健康的遠(yuǎn)程監(jiān)護(hù)。主要的研究工作在于對(duì)多生理參數(shù)同時(shí)采集和藍(lán)牙傳輸系統(tǒng)的設(shè)計(jì)方法,以及對(duì)整體框架進(jìn)行分析,主要從硬件系統(tǒng)設(shè)計(jì)和軟件編程兩個(gè)方面展開(kāi)工作設(shè)計(jì)和開(kāi)發(fā)一個(gè)智能化家庭健康監(jiān)護(hù)系統(tǒng)。整個(gè)系統(tǒng)分為兩個(gè)部分:一是前端硬件,進(jìn)行生理參數(shù)的采集、分析處理以及遠(yuǎn)程傳輸;二是手機(jī)APP客戶(hù)端,負(fù)責(zé)接收前端硬件采集的數(shù)據(jù),并進(jìn)行實(shí)時(shí)顯示。前端硬件包括:ATMEGA2560單片機(jī)、非接觸式紅外測(cè)溫模塊、血氧飽和測(cè)量模塊、BC417143B藍(lán)牙模塊、TFT液晶屏、供電系統(tǒng)。軟件設(shè)計(jì)方面,采用C語(yǔ)言編寫(xiě)Arduino的程序,JAVA語(yǔ)言編寫(xiě)手機(jī)APP程序,實(shí)現(xiàn)與硬件藍(lán)牙對(duì)接,接受數(shù)據(jù)后進(jìn)行實(shí)時(shí)顯示。
本文首先介紹了硬件電路設(shè)計(jì)的思路,然后詳細(xì)闡明了芯片的選擇及其各自的特點(diǎn),也引用了部分有關(guān)該課題設(shè)計(jì)方面的基本知識(shí)。然后敘述了手機(jī)APP的編程方法和過(guò)程,使用流程圖和程序代碼比較直觀(guān)的介紹了本設(shè)計(jì)的編程思路以及需要注意的一些問(wèn)題。最后是硬件和軟件測(cè)試,通過(guò)具體的測(cè)量和控制說(shuō)明智能化家庭健康監(jiān)護(hù)系統(tǒng)開(kāi)發(fā)與設(shè)計(jì)的合理性和完整性。
1.3 主要創(chuàng)新點(diǎn)本課題設(shè)計(jì)主要涉及到多生理參數(shù)的同時(shí)采集以及波形的實(shí)時(shí)顯示,還有硬件設(shè)備與手機(jī)APP通過(guò)藍(lán)牙對(duì)接建立通信鏈路。主要?jiǎng)?chuàng)新之處有以下幾點(diǎn):
(1)在無(wú)線(xiàn)遠(yuǎn)程傳輸上采用2.4GHz的ZigBee模塊和藍(lán)牙模塊,可以實(shí)現(xiàn)移動(dòng)設(shè)備與前端硬件設(shè)備之間的短距離數(shù)據(jù)交換,并且在功耗方面具有極大優(yōu)勢(shì),其自身具有超低功耗的特點(diǎn),此外,傳輸數(shù)據(jù)穩(wěn)定可靠,支持雙向傳輸。
(2)實(shí)現(xiàn)多生理參數(shù)采集,本系統(tǒng)在運(yùn)行時(shí),會(huì)同時(shí)測(cè)量使用者的血氧飽和度、脈搏、體溫,并且將具體的數(shù)值實(shí)時(shí)顯示在液晶屏上,較為直觀(guān)。另外,本系統(tǒng)設(shè)計(jì)為便攜式,配備有可充電的移動(dòng)電源,便于隨身攜帶并使用。
2 硬件電路設(shè)計(jì)2.1 系統(tǒng)硬件電路構(gòu)成本設(shè)計(jì)是以ATMEGA2560單片機(jī)為微處理器,與非接觸式紅外測(cè)溫模塊、血氧飽和度測(cè)量模塊、藍(lán)牙、ZigBee、液晶組成了一個(gè)集多生理參數(shù)數(shù)據(jù)采集、處理、液晶顯示、無(wú)線(xiàn)傳輸、手機(jī)APP顯示為一體的智能化家庭健康監(jiān)護(hù)系統(tǒng)。系統(tǒng)硬件電路主要由紅外測(cè)溫傳感器、血氧飽和度測(cè)量模塊、單片機(jī)、TFT液晶顯示、藍(lán)牙傳輸模塊和ZigBee傳輸模塊組成。其原理圖如圖2.1所示:

圖2.1 硬件原理構(gòu)成圖
生理參數(shù)采集模塊中,在單片機(jī)ATMEGA2560的控制下,非接觸式紅外測(cè)溫傳感器會(huì)先采集外界的溫度并經(jīng)過(guò)模擬轉(zhuǎn)換后通過(guò)單總線(xiàn)接口傳輸給微控制器進(jìn)行判斷處理,然后通過(guò)ZigBee傳輸模塊發(fā)送數(shù)據(jù)給主板上的ZigBee協(xié)調(diào)器。血氧飽和度采集數(shù)據(jù)后通過(guò)串口傳輸給單片機(jī),經(jīng)過(guò)處理后數(shù)據(jù)一方面在模塊上通過(guò)TFT液晶顯示器進(jìn)行數(shù)值和波形的實(shí)時(shí)顯示,另一方面通過(guò)藍(lán)牙無(wú)線(xiàn)模塊發(fā)送到手機(jī)APP客戶(hù)端進(jìn)行顯示。在APP客戶(hù)端接收數(shù)據(jù)時(shí),需要開(kāi)啟手機(jī)藍(lán)牙功能,在客戶(hù)端搜索附近的藍(lán)牙設(shè)備,找到ID為BluetoothBee并輸入連接密碼建立通信鏈路。然后客戶(hù)端就會(huì)收到來(lái)自前端硬件的生理參數(shù)數(shù)據(jù),APP收到監(jiān)護(hù)系統(tǒng)的數(shù)據(jù)后會(huì)判斷該數(shù)據(jù)是否有效,若有效,則在手機(jī)屏幕上顯示出來(lái)。
2.2 Arduino微處理器最小系統(tǒng)本設(shè)計(jì)采用的MCU是ATMEGA2560芯片。ATMEGA2560芯片適用于需要大量IO接口的設(shè)計(jì)。下面主要介紹所用芯片及相應(yīng)電路設(shè)計(jì)。
2.2.1 單片機(jī)控制芯片ATMEGA2560的內(nèi)部資源非常豐富,提供了大量的IO接口,包括有54路數(shù)字IO口,其中有16路可以作為PWM輸出,此外,還有16路模擬采集引腳,每一路模擬輸入在芯片內(nèi)部為10位的A/D數(shù)據(jù)轉(zhuǎn)換器,可以采集多路模擬量[5]。在通用全雙工異步串行口(UART)方面,ATMEGA2560具有3路串行口可以使用,此外,還有一些引腳可以通過(guò)程序修改來(lái)實(shí)現(xiàn)虛擬軟串口,故在串行口通信方面ATMEGA2560具有豐富的資源。
2.2.2 ATMEGA2560單片機(jī)電路設(shè)計(jì)Arduino ATMEGA2560的最小系統(tǒng)電路與STC系列的51單片機(jī)基本類(lèi)似,對(duì)于AREF引腳,是AD轉(zhuǎn)換的參考電壓輸入端,即模擬端口輸入的電壓值是與此處的參考電壓相比較的,開(kāi)發(fā)者可以通過(guò)改變這個(gè)引腳以及程序中的模擬電壓輸入設(shè)置函數(shù),來(lái)實(shí)現(xiàn)測(cè)量電壓范圍的改變[6]。在燒寫(xiě)程序時(shí),可通過(guò)RX0和TX0引腳以及GND引腳與PC機(jī)相連來(lái)實(shí)現(xiàn)。電路設(shè)計(jì)圖如圖2.2所示:

圖2.2 Arduino mega2560電路設(shè)計(jì)圖
2.3 藍(lán)牙無(wú)線(xiàn)通信模塊藍(lán)牙通信技術(shù)是一種工作在2.4 GHz 頻段的無(wú)線(xiàn)通信技術(shù)。目前藍(lán)牙技術(shù)已經(jīng)逐漸趨向成熟。因?yàn)樗{(lán)牙技術(shù)的日趨成熟,在使用和遠(yuǎn)程傳輸方面具有非常好的系統(tǒng)穩(wěn)定性和抗干擾能力。本設(shè)計(jì)使用的藍(lán)牙模塊如下圖2.3所示:



圖2.3 藍(lán)牙傳輸模塊(圖A為正面,圖B為反面)
在局域網(wǎng)范圍內(nèi),可以使用藍(lán)牙無(wú)線(xiàn)傳輸給具有藍(lán)牙功能的設(shè)備發(fā)送數(shù)據(jù),并且可以實(shí)現(xiàn)自主組網(wǎng)。在本設(shè)計(jì)中,藍(lán)牙無(wú)線(xiàn)通信模塊采用的是BC417143B這款芯片,該芯片具有內(nèi)置天線(xiàn)、有超低功耗模式、收發(fā)靈敏度高、成本低、低功耗等優(yōu)點(diǎn),而且只需配備少許外圍器件就可以實(shí)現(xiàn)其強(qiáng)大的功能。
1、主要特性
藍(lán)牙模塊具有全球開(kāi)放的2.4GHz ISM 頻段免許可證;功率等級(jí)為Class 2,其自身為主從一體,抗干擾的能力比較優(yōu)秀,因此非常適合應(yīng)用在工業(yè)控制的場(chǎng)合;具有12路可AT命令編程的輸出IO口,1路帶硬件流控的UART接口,3路8位ADC輸入接口,板載有藍(lán)牙天線(xiàn);無(wú)線(xiàn)串口數(shù)據(jù)透?jìng),其UART兼容3.3~5V的接口,具有128-bit安全校驗(yàn)機(jī)制,符合ROHS等多種國(guó)際認(rèn)證[7];運(yùn)行在可配對(duì)連接模式時(shí),電流最低可達(dá)3.3mA,在通訊模式下最低可達(dá)20mA;低功耗3.0 -3.6V 工作,關(guān)機(jī)模式下為29uA;
2、開(kāi)發(fā)方式
藍(lán)牙模塊的開(kāi)發(fā)方式分為2兩類(lèi):一類(lèi)是基于TI公司的CC2560雙模藍(lán)牙的協(xié)議棧開(kāi)發(fā),即在TI公司開(kāi)放的藍(lán)牙協(xié)議棧上做二次開(kāi)發(fā);一類(lèi)是基于藍(lán)牙透?jìng)髂K的AT指令開(kāi)發(fā),這類(lèi)開(kāi)發(fā)相較前者而言難度稍微小一點(diǎn),是使用串口與藍(lán)牙通信,通過(guò)發(fā)送AT指令的方式來(lái)對(duì)藍(lán)牙模塊進(jìn)行配置以及相關(guān)的控制功能。
本設(shè)計(jì)采用的藍(lán)牙芯片是BC417143,支持藍(lán)牙2.0版本的標(biāo)準(zhǔn)協(xié)議,默認(rèn)波特率為9600b/s。藍(lán)牙芯片與另外一個(gè)藍(lán)牙設(shè)備可以進(jìn)行遠(yuǎn)程無(wú)線(xiàn)通信,同時(shí),藍(lán)牙芯片也可以通過(guò)串口與單片機(jī)進(jìn)行通信,單片機(jī)可以通過(guò)串口通信的方式用AT指令控制藍(lán)牙芯片。
2.4 ZigBee無(wú)線(xiàn)通信模塊ZigBee是一種低功耗局域網(wǎng)通信協(xié)議。該名字是源自蜜蜂的八字舞,蜜蜂之間是通過(guò)飛行和嗡嗡抖動(dòng)自己的翅膀來(lái)與同伴進(jìn)行溝通交流的。ZigBee技術(shù)的突出特點(diǎn)是復(fù)雜度較低、自組網(wǎng)、超低功耗、低成本,非常適用于蜂窩網(wǎng)中的遠(yuǎn)程信息傳輸與自動(dòng)控制,這種協(xié)議也可以嵌入各種MCU中進(jìn)行使用。
本設(shè)計(jì)采用的ZigBee芯片為CC2530芯片,內(nèi)嵌有標(biāo)準(zhǔn)ZigBee協(xié)議棧,在芯片內(nèi)部集成了8051內(nèi)核,是增強(qiáng)型的51單片機(jī)。在ZigBee網(wǎng)絡(luò)中,所有的節(jié)點(diǎn)設(shè)備分為3種類(lèi)型,一種是協(xié)調(diào)器,一種是路由器,一種是終端。在同一個(gè)網(wǎng)絡(luò)中,需要一個(gè)協(xié)調(diào)器來(lái)啟動(dòng)并維護(hù)整個(gè)網(wǎng)絡(luò),這個(gè)協(xié)調(diào)器負(fù)責(zé)所在網(wǎng)絡(luò)中的各個(gè)節(jié)點(diǎn)設(shè)備的16位地址分配(為自動(dòng)分配)[8]。路由模塊的作用是在協(xié)調(diào)器模塊啟動(dòng)后,協(xié)助其維護(hù)整個(gè)網(wǎng)絡(luò)中的設(shè)備,同時(shí),路由模塊也可以作為信息傳遞的中轉(zhuǎn)站,使得信息傳遞的距離更遠(yuǎn)。而終端設(shè)備即處于網(wǎng)絡(luò)邊緣的設(shè)備,一般用于控制器,執(zhí)行來(lái)自路由器或協(xié)調(diào)器的命令。
ZigBee網(wǎng)絡(luò)的組建方式各種各樣,有星狀,網(wǎng)狀,樹(shù)狀等等。星狀網(wǎng)絡(luò),是以協(xié)調(diào)器為中心,向四周發(fā)散開(kāi)來(lái),連接路由設(shè)備或者終端設(shè)備。網(wǎng)狀網(wǎng)絡(luò),是由協(xié)調(diào)器、路由器組成的一個(gè)類(lèi)似蜘蛛網(wǎng)般的網(wǎng)狀網(wǎng)絡(luò),路由與協(xié)調(diào)器之間可以互發(fā)互收數(shù)據(jù)。
本設(shè)計(jì)使用的ZigBee模塊為無(wú)線(xiàn)透?jìng)髂J,通過(guò)軟件配置模塊的PAN ID,即網(wǎng)絡(luò)號(hào),用于分辨不同的網(wǎng)絡(luò),所以在同一個(gè)網(wǎng)絡(luò)中的設(shè)備的PAN ID需要設(shè)置為同一個(gè)ID[9]。其次,需要設(shè)置ZigBee的串口通信波特率,用于與外部單片機(jī)的通信。ZigBee模塊的實(shí)物圖如下圖2.4所示:
圖2.4 ZigBee模塊的實(shí)物圖(圖A為正面,圖B為反面)
每個(gè)ZigBee模塊在出廠(chǎng)時(shí),就有一個(gè)終身屬于它的64位地址,例如這個(gè)ZigBee模塊的唯一64位地址為0x0013a20040e830dd,這個(gè)唯一地址可以用于在一個(gè)網(wǎng)絡(luò)中的唯一識(shí)別,也可以作為數(shù)據(jù)接收終端地址。
2.5 紅外測(cè)溫模塊MLX90614是一個(gè)應(yīng)用于非接觸式的紅外溫度傳感器,其集成了紅外探測(cè)熱電堆芯片與信號(hào)處理專(zhuān)用集成芯片,且全部都封裝在TO-39。17位ADC、低噪聲放大器和強(qiáng)大的DSP處理單元的全集成,使傳感器實(shí)現(xiàn)了高分辨率,高精度的測(cè)量。處理好的被測(cè)目標(biāo)溫度和環(huán)境溫度均存儲(chǔ)在MLX90302的RAM內(nèi),分辨率為0.01 ˚C。傳感器的測(cè)量結(jié)果均出廠(chǎng)校準(zhǔn)化,數(shù)據(jù)接口為數(shù)字式的PWM和SMBus(System Management Bus) 輸出。傳感器出廠(chǎng)默認(rèn),上電復(fù)位時(shí)為SMBus通信[10]。
對(duì)于MLX90614芯片而言,引出了4個(gè)引腳,它們分別為VSS、SCL/Vz、PWM/SDA、VDD。接地端為VSS,接地端也與金屬封裝連通,使得信號(hào)更好,SCL/Vz是SMBus串行時(shí)鐘的輸入端。 VDD為電源的輸入端。
對(duì)于脈寬調(diào)制,PWM的數(shù)位帶寬為10bit,PWM的輸出周期為1.024ms,輸出高電位電壓值時(shí),I=2mA,輸出低電位電壓值時(shí),I=2mA,輸出驅(qū)動(dòng)電流為7mA,輸出反向電流為13.5mA。對(duì)于SMBus標(biāo)準(zhǔn)雙線(xiàn)的參數(shù)如下表2.5所示:
表2.5 SMBus標(biāo)準(zhǔn)雙線(xiàn)的參數(shù)
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
主設(shè)備接收信號(hào) 準(zhǔn)備時(shí)間 | 第八個(gè)SCL時(shí)鐘下降沿,主設(shè)備 | | | | |
主設(shè)備接收信號(hào) 保持時(shí)間 | 第九個(gè)SCL時(shí)鐘下降沿,主設(shè)備 | | | | |
子設(shè)備接收信號(hào) 準(zhǔn)備時(shí)間 | 第八個(gè)SCL時(shí)鐘下降沿,子設(shè)備 | | | | |
子設(shè)備接收信號(hào) 保持時(shí)間 | 第九個(gè)SCL時(shí)鐘下降沿,主設(shè)備 | | | | |
在自然界中,通過(guò)對(duì)某物體自身的紅外輻射收集并測(cè)量可以較精確的得出該物體的體表溫度。本設(shè)計(jì)使用的紅外測(cè)溫模塊由光電探測(cè)器、光學(xué)系統(tǒng)、信號(hào)處理和信號(hào)放大器及輸出等部分組成。紅外測(cè)溫的原理大致如下圖2.6所示:

圖2.6 紅外測(cè)溫原理圖
MLX90614系列測(cè)溫模塊是由Melexis公司生產(chǎn)的,用于非接觸式紅外測(cè)溫非常方便。這家公司生產(chǎn)的所有模塊在出廠(chǎng)前都進(jìn)行了必要的校驗(yàn),使得紅外測(cè)溫模塊可以直接輸出線(xiàn)性信號(hào),免去了復(fù)雜的校正過(guò)程。
環(huán)境溫度和目標(biāo)溫度由81101內(nèi)置的一個(gè)熱電偶測(cè)定測(cè)量,兩路溫度信號(hào)經(jīng)由放大器放大后,再由一個(gè)17-bit的模數(shù)轉(zhuǎn)換器和較強(qiáng)大的數(shù)字信號(hào)處理單元后輸出。
MLX90614的SMBus協(xié)議:
1 7 1 1 8 1 1
S Start condition(起始位)
Sr Repeated start cordition(重復(fù)起始位)
Rd Read(讀標(biāo)志位)
Wr Write(寫(xiě)標(biāo)志位)
A Acknowledge(應(yīng)答位)
S Stop Condition(停止位)
PEC Packet Error Code(出錯(cuò)數(shù)據(jù)包)
數(shù)據(jù)傳輸時(shí)序圖入下圖2.7所示:

圖2.7 數(shù)據(jù)傳輸時(shí)序圖
PWM/SDA為數(shù)據(jù)腳,若數(shù)據(jù)腳需要變化,將SCL引腳拉低300ns之后即可。而數(shù)據(jù)被捕獲需要在SCL為上升沿的時(shí)刻。數(shù)據(jù)傳輸時(shí),16bit數(shù)據(jù)需分兩次傳輸,每個(gè)字節(jié)均按照高位(MSB)在前,低位(LSB)在后的順序傳輸。
2.6 血氧飽和度傳感器2.6.1血氧飽和度測(cè)量原理血氧飽和度在進(jìn)行測(cè)量時(shí),使用兩個(gè)發(fā)光二極管,發(fā)射的波長(zhǎng)分別為660nm和940nm,在手指的上下兩端分別放置發(fā)射管和接受管。發(fā)射管發(fā)射的光波透過(guò)手指后會(huì)在另一端被接受管接受,因?yàn)槿梭w的內(nèi)部組織對(duì)于這種光的吸收系數(shù)是恒定的,所以此時(shí)的光波會(huì)有一定的衰減,通過(guò)衰減程度再配合一定的計(jì)算方法,我們便可以得出測(cè)量者的血氧飽和度為多少,如圖2.8所示

圖2.8 血氧飽和度測(cè)量原理
2.6.2 血氧飽和度探頭血氧飽和度探頭是測(cè)定人體血液中的氧濃度即血氧飽和度的一種儀器,傳感器由兩只發(fā)光管和一只光電管組成,在外科手術(shù)或危重病人的監(jiān)護(hù)中可及時(shí)了解血液中氧含量。
在本設(shè)計(jì)中發(fā)射管采用的是660~905nm波長(zhǎng)的發(fā)射管,接收管為235。這種血氧飽和度探頭為數(shù)字血氧探頭,其傳輸出來(lái)的信號(hào)為數(shù)字信號(hào)[11]。在采集模塊上,使用了一塊STM32核心芯片進(jìn)行初步的采集以及處理,然后通過(guò)UART接口與atmega2560芯片相連,將數(shù)據(jù)傳輸過(guò)去,由atmega2560進(jìn)行下一步的處理。其中數(shù)據(jù)傳輸協(xié)議入下表2.5.2所示:
與單片機(jī)進(jìn)行數(shù)據(jù)傳輸時(shí)是默認(rèn)設(shè)置:波特率為9600b/s;每秒發(fā)送50個(gè)數(shù)據(jù)包,每個(gè)數(shù)據(jù)包含有5個(gè)字節(jié)。
字節(jié)0:
字節(jié)1:
字節(jié)2:
字節(jié)3:
字節(jié)4:
2.7 SD卡存儲(chǔ)模塊SD卡即安全數(shù)碼卡,是繼MMC之后發(fā)展的一種快閃記憶器的新一代記憶設(shè)備,目前已經(jīng)被廣泛應(yīng)用在許多設(shè)備上。SD卡擁有大容量、速數(shù)據(jù)傳輸快、移動(dòng)靈活性強(qiáng)以及高安全性等優(yōu)點(diǎn)。
SD卡使用的電壓為3.3V。同時(shí),若在SPI模式下,需要注意的是,SPI通信的引腳均需要外加10~100K左右的上拉電阻才能保證其正常工作[12]。
SD卡有5個(gè)寄存器,如下表2.9所示:
表2.9 SD卡寄存器
| | |
| | |
| | |
| | 卡操作條件相關(guān)的信息數(shù)據(jù) |
| | |
| | |
操作SD卡的6條重要命令:
SD卡初始化過(guò)程:
- 初始化與SD卡連接的硬件條件;
- 上電延時(shí);
- 復(fù)位卡,進(jìn)入IDLE狀態(tài);
- 發(fā)送CMD8,檢查是否支持2.0協(xié)議;
- 根據(jù)不同協(xié)議檢查SD卡;
- 取消片選,發(fā)送多于8個(gè)CLK,結(jié)束初始化;
SD卡讀取數(shù)據(jù):
- 發(fā)送CMD17;
- 接收卡響應(yīng)R1;
- 接收數(shù)據(jù)起始令牌0XFE;
- 接收數(shù)據(jù);
- 接收2個(gè)字節(jié)CRC,若不用CRC,這兩個(gè)字節(jié)在讀取后可丟掉;
- 禁止片選,發(fā)多于8個(gè)CLK;
SD卡存儲(chǔ)數(shù)據(jù):
- 發(fā)送CMD24;
- 接收卡響應(yīng)R1;
- 發(fā)送寫(xiě)數(shù)據(jù)起始令牌0XFE;
- 發(fā)送數(shù)據(jù);
- 發(fā)送2字節(jié)的偽CRC;
- 禁止片選,發(fā)多于8個(gè)CLK;
在本設(shè)計(jì)中,由ATMEGA2560采集血氧飽和、脈率、體溫的數(shù)據(jù),進(jìn)行處理后,在每次測(cè)量完畢后,這些數(shù)據(jù)會(huì)以TXT文件存儲(chǔ)到SD卡中,便于之后的數(shù)據(jù)分析。
3 系統(tǒng)軟件編程設(shè)計(jì)3.1 軟件開(kāi)發(fā)環(huán)境3.1.1 Arduino IDE簡(jiǎn)介Arduino是一款基于ATMEL AVR單片機(jī)的控制器平臺(tái),便捷靈活而且較為容易上手。Arduino是一個(gè)開(kāi)源的系統(tǒng),除了不能使用Arduino作為商標(biāo),任何人或公司都可以利Arduino公布的文檔來(lái)制作屬于自己的電子物品,而且Arduino的價(jià)格低廉,非常受?chē)?guó)內(nèi)外廣大的電子愛(ài)好者歡迎[13]。
Arduino具有特定的標(biāo)準(zhǔn)擴(kuò)展口,可以在擴(kuò)展口上使用各種傳感器來(lái)采集或控制周邊事物,例如窗簾上的步進(jìn)電機(jī)、房間的照明燈、室溫等等[14]。這款芯片可以通過(guò)Arduino特有的API(應(yīng)用程序編程接口)函數(shù)來(lái)編寫(xiě)自己的程序。編譯生成二進(jìn)制文件,燒錄編譯文件都可以使用Arduino IDE軟件完成[15]。
Arduino IDE的編程界面如下圖3.1所示:
Arduino IDE的編程方式與51單片機(jī)是相似的。在軟件編程界面有兩個(gè)空的函數(shù):void setup()和void loop(),前者中需要填寫(xiě)程序的初始化部分,后者為整個(gè)程序的主循環(huán)內(nèi)容[16]。編寫(xiě)完程序后,就要進(jìn)入下載部分。Arduino的核心板具有ISP功能。這個(gè)功能可以在不改變硬件連接,即使硬件仍然在運(yùn)行內(nèi)部代碼時(shí),不需要分離任何電路也可以立即下載新的程序代碼,這樣就可以節(jié)省很多開(kāi)發(fā)時(shí)間[17]。在Arduino的芯片內(nèi)部都有一個(gè)bootloader,這個(gè)bootloader可以幫助MCU加載程序,當(dāng)單片機(jī)在復(fù)位時(shí),首先會(huì)跳轉(zhuǎn)到bootloader中判斷之后進(jìn)入的數(shù)據(jù)是否屬于程序代碼,若為程序代碼就將其安置到內(nèi)存的剩余空間中。所以因?yàn)橛衎ootloader的存在,使得Arduinod 程序代碼非常便于下載[18]。

圖3.1 Arduino IDE界面
3.2 軟件各模塊程序設(shè)計(jì)3.2.1 血氧飽和及心率數(shù)值采集 血氧飽和度測(cè)量模塊在采集到血氧數(shù)值后,會(huì)通過(guò)串口(UART)的方式發(fā)送給單片機(jī),其格式在上文已經(jīng)有過(guò)介紹,血氧模塊回以每秒50個(gè)數(shù)據(jù)包的速度發(fā)送數(shù)據(jù),每個(gè)數(shù)據(jù)包包含有5個(gè)字節(jié)的數(shù)據(jù),其中有3個(gè)字節(jié)的數(shù)據(jù)是我們所必須的,一個(gè)字節(jié)是探頭監(jiān)測(cè)位,需要通過(guò)判斷這個(gè)位的數(shù)據(jù)來(lái)判斷傳感器是否連接成功[19];一個(gè)字節(jié)是血氧飽和度的數(shù)值,共有8位,將這8位2進(jìn)制數(shù)值轉(zhuǎn)換成10進(jìn)制的數(shù)值,即血氧飽和度的數(shù)值;一個(gè)字節(jié)是描述心率的數(shù)值,與血氧飽和度一樣,將二進(jìn)制轉(zhuǎn)換為10進(jìn)制即可顯示出來(lái)。所以在單片機(jī)處理時(shí),需要定義一個(gè)數(shù)組來(lái)存儲(chǔ)我們所需的字節(jié)[20]。
3.2.2 體溫溫度數(shù)值采集非接觸式紅外溫度傳感器是采用的SMBus協(xié)議進(jìn)行讀取、寫(xiě)入數(shù)據(jù)操作的。
讀器件的數(shù)據(jù)格式(命令決定是讀RAM或EEPROM)如下圖3.2所示:
圖3.2 讀數(shù)據(jù)格式
寫(xiě)器件的數(shù)據(jù)格式(命令決定是寫(xiě)RAM或EEPROM)如下圖3.3所示:
圖3.3 寫(xiě)數(shù)據(jù)格式
在主程序中調(diào)用函數(shù)readObjectTempC();即可讀取溫度的數(shù)值。
3.2.3 藍(lán)牙無(wú)線(xiàn)通信本設(shè)計(jì)使用的藍(lán)牙通信模塊為AT指令開(kāi)發(fā),可以通過(guò)AT指令修改串口通信的波特率,設(shè)置配對(duì)碼等。具體的AT指令如下:
1、設(shè)置和查詢(xún)配對(duì)碼:
AT+PSWD = <Param>
Param: 配對(duì)碼
2、設(shè)置和查詢(xún)串口參數(shù):
AT+UART = <Param1>,<Param2>,<Param3>
Param1:波特率(bits/s)
Param2:停止位
Param3:校驗(yàn)位
3、設(shè)置和查詢(xún)模塊角色:
AT+ROLE = <Param>
Param :0——從角色(slave),被動(dòng)連接,可以與任何藍(lán)牙適配器連接通信
1——主角色(master),主動(dòng)連接,建立通信數(shù)據(jù)傳輸通道
2——回環(huán)角色(slave--loop),被動(dòng)連接,接收主設(shè)備發(fā)送數(shù)據(jù)并返回給主設(shè)備
在進(jìn)行程序設(shè)計(jì)之前可以先通過(guò)AT指令將模塊的參數(shù)配置完成,然后在程序中設(shè)置好波特率后即可直接使用串口發(fā)送函數(shù),將數(shù)據(jù)通過(guò)串口發(fā)送給藍(lán)牙模塊,然后藍(lán)牙模塊會(huì)自動(dòng)再將數(shù)據(jù)遠(yuǎn)程發(fā)送給手機(jī)APP端[21]。
整個(gè)系統(tǒng)的程序設(shè)計(jì)流程圖如下圖3.4所示:
圖3.4 系統(tǒng)程序設(shè)計(jì)流程圖
3.2.4 ZigBee無(wú)線(xiàn)通信本設(shè)計(jì)使用的局域網(wǎng)無(wú)線(xiàn)通信模塊為美國(guó)DIGI的一種ZigBee通信模塊,其內(nèi)置有ZigBee協(xié)議棧,可以使用DIGI提供的X-CTU軟件通過(guò)AT指令的方式配置ZigBee模塊的相關(guān)參數(shù),包括通信波特率、運(yùn)行模式(協(xié)調(diào)器或路由或終端)、網(wǎng)絡(luò)ID、發(fā)送數(shù)據(jù)的目的地址等等[22]。
X-CTU軟件可以配置ZigBee模塊,界面如下圖3.5所示:
圖3.5 X-CTU界面
左上角的兩個(gè)按鈕用于發(fā)現(xiàn)設(shè)備,將ZigBee模塊通過(guò)串口與電腦端連接后,即可使用該功能發(fā)現(xiàn)設(shè)備進(jìn)行下一步的配置,MAC尋找界面如下圖3.6所示:
圖3.6 MAC尋找界面
在這個(gè)界面讀出模塊后,會(huì)顯示一些基本參數(shù),比如此串口號(hào)和模塊的64為地址。然后點(diǎn)擊Add selected devices,即可進(jìn)入?yún)?shù)讀取/配置界面,如下圖3.7所示:
圖3.7 讀取/配置參數(shù)界面
在設(shè)置參數(shù)時(shí),主要設(shè)置以下參數(shù):首先為模塊波特率,用于與單片機(jī)之間的通信,本設(shè)計(jì)中設(shè)置為115200;然后設(shè)置PAN ID,這個(gè)ID用于加入網(wǎng)絡(luò),當(dāng)多個(gè)ZigBee模塊的PAN ID相同時(shí),便能實(shí)現(xiàn)自組網(wǎng),形成局域網(wǎng)絡(luò)進(jìn)行通信;最后為發(fā)送數(shù)據(jù)的目的地址,在本設(shè)計(jì)中,是終端設(shè)備發(fā)送數(shù)據(jù)給協(xié)調(diào)器,故在終端設(shè)備中需要設(shè)置協(xié)調(diào)器的64位唯一地址[23]。也可以在協(xié)調(diào)器上設(shè)置終端的64位唯一地址,使用協(xié)調(diào)器給終端發(fā)送數(shù)據(jù)。
3.3 Android監(jiān)護(hù)軟件設(shè)計(jì)3.3.1 系統(tǒng)的開(kāi)發(fā)環(huán)境與安裝本設(shè)計(jì)開(kāi)發(fā)android程序是采用的eclipse環(huán)境,eclipse編譯器是一款比較強(qiáng)大的APP開(kāi)發(fā)軟件,相較其他的開(kāi)發(fā)平臺(tái)而言,具有比較大的優(yōu)勢(shì),比如界面的操作簡(jiǎn)單,在編寫(xiě)程序的過(guò)程中可以非常清晰、直觀(guān)地發(fā)現(xiàn)問(wèn)題[24]。
開(kāi)發(fā)android軟件是采用的eclipse軟件,安裝時(shí),先在官網(wǎng)eclipse.org中下載安裝包,分為32位與64位,注意要與電腦配置一致。下載完安裝包后,解壓并運(yùn)行eclipse.exe[25],F(xiàn)在首先需要安裝java環(huán)境,第一要設(shè)置工作環(huán)境,選擇你希望安裝的盤(pán),點(diǎn)擊OK。如下圖3.8所示:

圖3.8 設(shè)置工作環(huán)境
然后創(chuàng)建項(xiàng)目,選擇file->new->java project,如下圖3.9所示:
圖3.9 創(chuàng)建項(xiàng)目
鍵入項(xiàng)目名,點(diǎn)擊finish。完成項(xiàng)目創(chuàng)建后,點(diǎn)擊Java按鈕,然后在菜單的左側(cè)選擇test項(xiàng)目,右鍵點(diǎn)擊new->class,鍵入工程名,完成。最后在代碼框中就可以開(kāi)始敲代碼開(kāi)發(fā)了。
3.3.2 Android應(yīng)用程序開(kāi)發(fā)過(guò)程Android應(yīng)用程序的設(shè)計(jì)分為以下幾個(gè)過(guò)程:在程序運(yùn)行時(shí),會(huì)開(kāi)啟一個(gè)主線(xiàn)程,用于主界面的顯示,然后需要搜索手機(jī)附近開(kāi)啟的藍(lán)牙設(shè)備,搜索到相關(guān)的藍(lán)牙設(shè)備后即可連接,在連接時(shí)會(huì)開(kāi)啟一個(gè)子線(xiàn)程用于socket連接。當(dāng)建立與設(shè)備的連接后,會(huì)不斷接收來(lái)自前端藍(lán)牙設(shè)備發(fā)送的多參數(shù)生理數(shù)據(jù)值,每次接收到數(shù)據(jù)后,程序會(huì)首先判斷該數(shù)據(jù)是否為有效數(shù)據(jù),若是,則在屏幕上顯示出來(lái),若不是,則繼續(xù)監(jiān)測(cè)數(shù)據(jù)。
程序設(shè)計(jì)的流程圖如下圖3.10所示

圖3.10 APP程序流程圖
3.3.3 主要應(yīng)用模塊的實(shí)現(xiàn)首先進(jìn)入APP界面后,會(huì)進(jìn)行一系列的初始化過(guò)程,進(jìn)入界面后會(huì)有一個(gè)搜索按鈕,用于發(fā)現(xiàn)周?chē)目蛇B接藍(lán)牙設(shè)備。
點(diǎn)擊搜索按鈕后,在界面會(huì)出現(xiàn)一個(gè)設(shè)備列表,用于展現(xiàn)發(fā)現(xiàn)的所有藍(lán)牙設(shè)備,此時(shí),選擇我們的前端藍(lán)牙設(shè)備“BluetoothBee”,進(jìn)行連接,連接過(guò)程是一個(gè)基于socket通信的連接,因?yàn)槠湎鄬?duì)來(lái)說(shuō)耗時(shí)較長(zhǎng),故不能運(yùn)行在主線(xiàn)程,所以開(kāi)辟了另外一個(gè)子線(xiàn)程供手機(jī)與藍(lán)牙設(shè)備進(jìn)行連接。當(dāng)手機(jī)APP與前端藍(lán)牙設(shè)備建立連接后,即可開(kāi)始讀取數(shù)據(jù)。
讀取完數(shù)據(jù)后需要進(jìn)行解析數(shù)據(jù),然后會(huì)在界面上顯示相應(yīng)的生理參數(shù)。
手機(jī)APP的界面以及生理參數(shù)數(shù)值顯示實(shí)物圖如下圖3.11:
圖3.11 APP界面
在APP客戶(hù)端顯示的數(shù)據(jù)都是根據(jù)主控板采集的數(shù)據(jù)實(shí)時(shí)變化的,可以方便使用者非常直觀(guān)的看到自己的生理參數(shù)數(shù)值。
4 系統(tǒng)整體功能測(cè)試4.1 智能化家庭健康監(jiān)護(hù)系統(tǒng)實(shí)物圖智能化家庭健康監(jiān)護(hù)系統(tǒng)是一個(gè)便攜式的多生理參數(shù)實(shí)時(shí)監(jiān)測(cè)系統(tǒng),在整套系統(tǒng)中包含有主控板ATMEGA2560、Arduino模塊、血氧飽和度測(cè)量模塊、紅外測(cè)溫模塊、藍(lán)牙傳輸模塊、ZigBee無(wú)線(xiàn)傳輸模塊、TFT液晶屏、充電模塊、升壓模塊、充電電池。在實(shí)際使用時(shí),進(jìn)行血氧飽和度、心率、體溫的參數(shù)測(cè)量,并且每次測(cè)量時(shí)都會(huì)將數(shù)據(jù)實(shí)時(shí)傳入手機(jī)APP端進(jìn)行顯示,可以讓使用者很直觀(guān)的看到測(cè)量的具體參數(shù)。對(duì)于電源,采用的是充放電電池,并設(shè)計(jì)有充電電源口,當(dāng)電池電量不足時(shí)可以通過(guò)這個(gè)接口充電,使用起來(lái)非常方便。具體的實(shí)物圖如下圖4.1所示:
圖4.1 系統(tǒng)整機(jī)圖
對(duì)于紅外測(cè)溫模塊,在另外一個(gè)節(jié)點(diǎn)設(shè)備上,打開(kāi)電源后,模塊會(huì)自動(dòng)采集目標(biāo)體溫,然后通過(guò)ZigBee模塊傳輸給主系統(tǒng)板上的ZigBee協(xié)調(diào)器,實(shí)物圖如下圖4.2所示:

圖4.2 紅外測(cè)溫從機(jī)圖
在進(jìn)行測(cè)量的時(shí)候,按下電源開(kāi)關(guān),然后手指戴上血氧探頭,幾秒鐘過(guò)后,即可同步成功,然后在液晶屏上面會(huì)有血氧的波形圖和血氧值、心率值、體溫值的顯示。在TFT液晶屏上的效果圖如下圖4.3所示,屏幕上方左邊為BMP(心率),中間為SPO(血氧飽和度),右邊為T(mén)EMP(體溫):
圖4.3 TFT液晶屏顯示
在手機(jī)APP上的顯示界面如下圖4.4所示,手機(jī)通過(guò)藍(lán)牙接收到的數(shù)據(jù)在屏幕上進(jìn)行顯示,包括心跳、血氧、體溫的具體數(shù)值,并根據(jù)前端設(shè)備的實(shí)時(shí)采集進(jìn)行更新:
圖4.4 實(shí)測(cè)效果圖
總結(jié)與展望本課題設(shè)計(jì)的智能化家庭健康監(jiān)護(hù)系統(tǒng)采取了硬件與軟件相結(jié)合的開(kāi)發(fā)方法。在整個(gè)設(shè)計(jì)的過(guò)程中需要我對(duì)單片機(jī)開(kāi)發(fā)、PCB繪制調(diào)試、C/C++編程語(yǔ)言、JAVA語(yǔ)言都有一定程度的了解。與此同時(shí),需要學(xué)會(huì)查找相關(guān)的資料文件,熟悉各個(gè)芯片的開(kāi)發(fā)使用方法以及它們的電氣特性等等,這些資料對(duì)于開(kāi)發(fā)者來(lái)說(shuō),是非常重要的第一步。整個(gè)課題設(shè)計(jì)的過(guò)程也同時(shí)是我再次學(xué)習(xí)、鞏固、加深的過(guò)程,對(duì)“溫故而知新”這句話(huà)也有了更深一步的理解。我們只有在不斷學(xué)習(xí),不斷鞏固,不斷思考,才能不斷進(jìn)步,掌握的知識(shí)技能才能越來(lái)越牢靠,并且在實(shí)踐過(guò)程中需要我們本著實(shí)事求是的心態(tài)去做事,善于發(fā)現(xiàn)并解決問(wèn)題,有意識(shí)培養(yǎng)自己解決問(wèn)題的能力,為今后的學(xué)習(xí)和工作打下良好的基礎(chǔ)。
作者在最初進(jìn)行本課題的設(shè)計(jì)時(shí)遇到了很多的艱難困阻。首先是血氧飽和度的數(shù)據(jù)一直無(wú)法同步,因?yàn)閱纹瑱C(jī)無(wú)法采用串口中斷的方式,所以一直是采用的串口查詢(xún)的方式來(lái)接收數(shù)據(jù),這就導(dǎo)致時(shí)不時(shí)會(huì)丟包,而不能完全同步。其次,在單片機(jī)設(shè)計(jì)方面,沒(méi)有接觸過(guò)TFT液晶屏的開(kāi)發(fā),所以當(dāng)采集到生理數(shù)值時(shí),需要在液晶屏上顯示出具體數(shù)值,同時(shí)還需要實(shí)時(shí)繪制血氧飽和度的波形,這一部分在程序設(shè)計(jì)上也花費(fèi)了很大精力才得以解決。再就是android APP開(kāi)發(fā)方面,因?yàn)樽髡咭恢倍际鞘褂肅語(yǔ)言開(kāi)發(fā)單片機(jī)程序,而完全沒(méi)有接觸過(guò)軟件APP的開(kāi)發(fā),所以從零開(kāi)始學(xué)習(xí)java語(yǔ)言,了解并熟悉eclipse開(kāi)發(fā)環(huán)境也是難點(diǎn)之一。
本文在設(shè)計(jì)上有兩大特點(diǎn):一是采用主從一體的藍(lán)牙傳輸模塊進(jìn)行遠(yuǎn)程的數(shù)據(jù)傳輸。這種無(wú)線(xiàn)通信方式是使用的很頻繁,也深受大眾喜愛(ài)的一種通信方式,其使用起來(lái)非常便捷,而且傳輸數(shù)據(jù)穩(wěn)定可靠,同時(shí)還具有低功耗模式,適用于便攜式設(shè)備。二是系統(tǒng)采集的多生理參數(shù)除了會(huì)在設(shè)備本身的TFT液晶屏上顯示出來(lái),還會(huì)通過(guò)藍(lán)牙將數(shù)據(jù)發(fā)送給APP客戶(hù)端,在手機(jī)上進(jìn)行實(shí)時(shí)的顯示。
最后,本文雖然實(shí)現(xiàn)了智能化家庭健康監(jiān)護(hù)系統(tǒng)的生理參數(shù)采集、顯示、無(wú)線(xiàn)傳輸功能,但仍然存在很多問(wèn)題有待改進(jìn),而且在功能上還有很多是可以繼續(xù)完善的。在生理參數(shù)采集部分,可以加入心電的采集、分析,在無(wú)線(xiàn)傳輸部分可以使用WIFI或其他可以接入互聯(lián)網(wǎng)的設(shè)備,讓前端系統(tǒng)采集的生理數(shù)據(jù)能夠傳輸?shù)皆贫朔⻊?wù)器,與醫(yī)院進(jìn)行合作,使醫(yī)院的主治醫(yī)師能夠查看我們的生理數(shù)據(jù),從而能夠在日常飲食或生活習(xí)慣上給予適當(dāng)?shù)慕ㄗh,使得全社會(huì)人的身體都能夠更加健康。在系統(tǒng)的供電部分可以設(shè)計(jì)的再微小點(diǎn),不用占據(jù)很大的空間,同時(shí)也能提供足夠的電量。通過(guò)上述改進(jìn)措施,此智能化家庭健康監(jiān)護(hù)系統(tǒng)將會(huì)具備更加強(qiáng)大的實(shí)用價(jià)值以及商業(yè)價(jià)值。
參考文獻(xiàn)[1] 劉翔, 朱士俊, 李信春. 我國(guó)遠(yuǎn)程醫(yī)療發(fā)展現(xiàn)狀、難點(diǎn)和對(duì)策分析[J]. 中國(guó)信息界, 2006(4):60-63.
[2] 吳明, 張振忠. 中國(guó)農(nóng)村合作醫(yī)療發(fā)展模式的制度分析[J]. 中國(guó)衛(wèi)生資源, 2000(3):104-107.
[3] 鄔寬明. 單片機(jī)外圍器件實(shí)用手冊(cè)--數(shù)據(jù)傳輸接口器件分冊(cè)(第2版)[M]. 北航大學(xué)出版社, 2005.
[4] 劉坤, 趙紅波, 張憲棟. 51單片機(jī)C語(yǔ)言應(yīng)用開(kāi)發(fā)技術(shù)大全[M]. 人民郵電出版社, 2011.
[5] 陸垂偉, 毛雪濤, 戴翔宇,等. 遠(yuǎn)程串行數(shù)據(jù)通信技術(shù)的實(shí)現(xiàn)方法及其應(yīng)用[J]. 計(jì)算機(jī)應(yīng)用研究, 2002, 19(3):23-24.
[6] 石東海. 單片機(jī)數(shù)據(jù)通信技術(shù)從入門(mén)到精通[M]. 西安電子科技大學(xué)出版社, 2002.
[7] 高潮. TFT液晶顯示驅(qū)動(dòng)電路與電源優(yōu)化設(shè)計(jì)方法[J]. 深圳信息職業(yè)技術(shù)學(xué)院學(xué)報(bào), 2007, 5(2):14-18.
[8] 原羿, 蘇鴻根. 基于ZigBee技術(shù)的無(wú)線(xiàn)網(wǎng)絡(luò)應(yīng)用研究[J]. 計(jì)算機(jī)應(yīng)用與軟件, 2004, 21(6):89-91.
[9] 屈景輝 李傳偉. TEECHART應(yīng)用技術(shù)詳解--快速圖表制作工具[M]. 水利水電出版社, 2008.
[10] 繆璐璐. 基于Arduino平臺(tái)開(kāi)發(fā)交互式產(chǎn)品原型的研究[D]. 上海交通大學(xué), 2013.
[11] 惠特. Arduino技術(shù)內(nèi)幕[M]. 人民郵電出版社, 2013.
[12] 李莉, 劉剛. 基于藍(lán)牙技術(shù)的溫室環(huán)境監(jiān)測(cè)系統(tǒng)設(shè)計(jì)[J]. 農(nóng)業(yè)機(jī)械學(xué)報(bào), 2006, 37(10):97-100.
[13] 龔建偉. Visual C++/Turbo C 串口通信編程實(shí)踐[M]. 電子工業(yè)出版社, 2004.
[14] 何希才. 數(shù)字移動(dòng)通信技術(shù)及應(yīng)用[M]. 機(jī)械工業(yè)出版社, 2003.
[15] 鐘君, 蔡黎明, 于涌. 基于MLX90614的無(wú)線(xiàn)溫度采集系統(tǒng)設(shè)計(jì)[J]. 傳感器與微系統(tǒng), 2015, 34(3):87-89.
[16] 封瑜, 葛萬(wàn)成. 基于ZigBee技術(shù)的無(wú)線(xiàn)傳感器網(wǎng)絡(luò)構(gòu)建與應(yīng)用[J]. 電子工程師, 2007, 33(3):21-23.
[17] 許一萍. Zigbee技術(shù)在無(wú)線(xiàn)傳感器網(wǎng)絡(luò)中的應(yīng)用研究[D]. 復(fù)旦大學(xué), 2008.
[18] 張利江, 郭進(jìn)利, 宋亞娟. 遠(yuǎn)程醫(yī)療監(jiān)護(hù)的現(xiàn)狀與發(fā)展[J]. 新農(nóng)村:黑龍江, 2011(2):138-139.
[19] 諸強(qiáng), 王學(xué)民, 胡賓,等. 無(wú)線(xiàn)遠(yuǎn)程醫(yī)療系統(tǒng)[J]. 北京生物醫(yī)學(xué)工程, 2004, 23(3):225-227.
[20] 張利江, 郭進(jìn)利, 宋亞娟. 遠(yuǎn)程醫(yī)療監(jiān)護(hù)的現(xiàn)狀與發(fā)展[J]. 新農(nóng)村:黑龍江, 2011(2):138-139.
[21] 范曉武. 基于嵌入式設(shè)備的家庭健康監(jiān)護(hù)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J]. 浙江工業(yè)大學(xué)學(xué)報(bào), 2010, 38(3):289-293.
[22] Roll J S, Froma W. Systemic training for healthcare professionals: the Chicago Center For Family Health approach.[J]. Family Process, 2005, 44(3):283-301.
[23] Heydon A, Mcdonald J. Measurement of family health teams is underdeveloped.[J]. Sedimentology, 2011, 183(14):1628-1628.
[24] 朱新建, 吳寶明, 卓豫,等. 多參數(shù)家庭健康監(jiān)護(hù)實(shí)時(shí)檢測(cè)的方法[J]. 中國(guó)組織工程研究與臨床康復(fù), 2007(1):121-123.
[25] 黃永健, 王偉, 謝廣明,等. 物聯(lián)網(wǎng)家庭健康監(jiān)護(hù)系統(tǒng)[J]. 兵工自動(dòng)化, 2013(11):87-90.
附錄A
1. 主控板程序:
- #include <UTFT.h>
- #include <SPI.h>
- #include <SD.h>
- #include <SoftwareSerial.h>
- #include <Wire.h>
- #include <Adafruit_MLX90614.h>
-
- Adafruit_MLX90614 mlx = Adafruit_MLX90614();
- SoftwareSerial mySerial(6, 7);
-
- // Declare which fonts we will be using
- extern uint8_t SmallFont[];
- UTFT myGLCD(QD220A,A2,A1,A5,A4,A3); //初始化液晶的類(lèi)
- File myFile; / /初始化SD卡的類(lèi)
- extern uint8_t BigFont[];
- int data[5];
- char str[9];
- int buf[220],buf1[4];
- int y1=0; //判斷是否為第一次畫(huà)線(xiàn)
- int y2=45;
- int x=1, x2=0;
- int r=0,time=0;
- long a=0,t1=0;
-
- void setup()
- {
- myGLCD.InitLCD(); //液晶屏初始化
- myGLCD.setFont(SmallFont); //設(shè)置液晶屏上字的大小
- Serial.begin(9600); //ZigBee波特率
- Serial1.begin(9600); //調(diào)試串口
- mySerial.begin(115200); //血氧飽和度通信
- mlx.begin(); //初始化紅外測(cè)溫模塊
-
- myGLCD.fillScr(255,255,255); //清屏
-
- if (!SD.begin(53)) { //檢測(cè)SD卡是否讀取成功
- return;
- }
- myFile = SD.open("SPO2.txt", FILE_WRITE);
- myGLCD.setColor(0,255,255); //設(shè)置字體顏色
- myGLCD.setBackColor(255, 0, 0); //設(shè)置背景顏色
- myGLCD.print("BMP:", 5, 1);
- myGLCD.print("SPO:", 70, 1);
- myGLCD.print("TEMP:", 130, 1);
- }
-
- void loop() {
- if (Serial1.available()){ //采用循環(huán)查詢(xún)方式檢測(cè)串口是否有數(shù)據(jù)
- for(int i=0;i<5;i++){ //采用for循環(huán)連續(xù)讀取5個(gè)字節(jié)數(shù)據(jù)
- data[i] = Serial1.read(); //讀一個(gè)字節(jié)數(shù)據(jù)
- delay(1);
- }
- }
- Serial.println(data[4]);
- if(data[3]<120&&data[3]>50){ //判斷數(shù)據(jù)是否已經(jīng)同步,為有效數(shù)據(jù)
- y1=data[1];
- if(a==1){ //若滿(mǎn)屏,則開(kāi)始清理歷史數(shù)據(jù),即消除部分波形
- myGLCD.setColor(255,255,255);
- if(t1==1){
- myGLCD.drawLine(1,135-buf[209],2,135-buf[1]); //第一次畫(huà)波形,兩點(diǎn)連線(xiàn)
- t1=0;
- }
- myGLCD.drawLine(x+1,135-buf[x],x+2,135-buf[x+1]); //兩點(diǎn)連線(xiàn),繪制波形
- }
- if(x<210){ //若沒(méi)有滿(mǎn)屏,則繼續(xù)繪制波形
- myGLCD.setColor(0,255,255);
- myGLCD.drawLine(x,135-y2,x+1,135-y1);
- y2=y1;
- buf[x]=y1;
- x++;
- time++;
- }else{
- x=1;a=1;t1=1;
- }
- }
- if(time==100){
- myGLCD.setBackColor(255, 0, 0);
- String b = (String)data[3];
- myGLCD.print(b, 35, 1); //在液晶屏上顯示心率的數(shù)值
- b = (String)data[4];
- myGLCD.print(b, 100, 1); //在液晶上顯示血氧飽和度的數(shù)值
- b = (String)mlx.readObjectTempC();
- myGLCD.print(b, 168, 1); //在液晶上顯示溫度的數(shù)值
- delay(20);
- mySerial.print(data[3]); //通過(guò)串口發(fā)送將心率的數(shù)值發(fā)送給藍(lán)牙
- mySerial.print(",");
- mySerial.print(data[4]); //將血氧飽和度的數(shù)值發(fā)送給藍(lán)牙
- mySerial.print(",");
- mySerial.print(b); //將體溫的數(shù)值發(fā)送給藍(lán)牙
- mySerial.print(" ");
- time=0;
- }
- }
- 2. 紅外測(cè)溫讀取數(shù)據(jù)部分代碼:
- #define MLX90614_TOBJ1 0x07
-
- uint16_t read16(uint8_t a)
- {
- uint16_t ret;
- uint8_t pec;
- Wire.beginTransmission(_addr); // 開(kāi)始發(fā)送數(shù)據(jù)給設(shè)備
- Wire.write(a); // 發(fā)送寄存器地址給傳遞參數(shù)
- Wire.endTransmission(false); // 結(jié)束數(shù)據(jù)傳送
- Wire.requestFrom(_addr, (uint8_t)3);// 發(fā)送讀取的n字節(jié)數(shù)據(jù)
- ret = Wire.read(); // 接受數(shù)據(jù)
- ret |= Wire.read() << 8; // 接受數(shù)據(jù)
- pec = Wire.read();
- return ret;
- }
- float readTemp(uint8_t reg)
- {
- float temp;
- temp = read16(reg);
- temp *= .02;
- temp -= 273.15;
- return temp;
- }
- double readObjectTempC(void)
- {
- return readTemp(MLX90614_TOBJ1);
- }
-
- 2. APP客戶(hù)端初始化代碼:
- private void init() {
- list = new ArrayList<SiriListItem>();
- mAdapter = new ChatListAdapter(this, list);
- mListView = (ListView) findViewById(R.id.list);
- mListView.setAdapter(mAdapter);
- mListView.setFastScrollEnabled(true);
- mListView.setOnItemClickListener(mDeviceClickListener);
-
- IntentFilterdiscoveryFilter=new IntentFilter(BluetoothDevice.ACTION_FOUND);
- this.registerReceiver(mReceiver, discoveryFilter);
- // Register for broadcasts when discovery has finished
- IntentFilter foundFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
- this.registerReceiver(mReceiver, foundFilter);
-
- Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();
- if (pairedDevices.size() > 0) {
- for (BluetoothDevice device : pairedDevices) {
- list.add(new SiriListItem(device.getName() + "\n" + device.getAddress(), true));
- mAdapter.notifyDataSetChanged();
- mListView.setSelection(list.size() - 1);
- }
- } else {
- list.add(new SiriListItem("沒(méi)有設(shè)備已經(jīng)配對(duì)", true));
- mAdapter.notifyDataSetChanged();
- mListView.setSelection(list.size() - 1);
- }
-
- seachButton = (Button)findViewById(R.id.start_seach);
- seachButton.setOnClickListener(seachButtonClickListener);
-
- serviceButton = (Button)findViewById(R.id.start_service);
- serviceButton.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View arg0) {
- Bluetooth.serviceOrCilent=ServerOrCilent.SERVICE;
- Bluetooth.mTabHost.setCurrentTab(1);
- }
- });
- }
- 3. 發(fā)現(xiàn)藍(lán)牙模塊:
- private OnClickListener seachButtonClickListener = new OnClickListener() {
- public void onClick(View arg0) {
- if(mBtAdapter.isDiscovering())
- {
- mBtAdapter.cancelDiscovery();
- seachButton.setText("重新搜索");
- }
- else
- { list.clear();
- mAdapter.notifyDataSetChanged();
-
- Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();
- if (pairedDevices.size() > 0) {
- for (BluetoothDevice device : pairedDevices) {
- list.add(new SiriListItem(device.getName() + "\n" + device.getAddress(), true));
- mAdapter.notifyDataSetChanged();
- mListView.setSelection(list.size() - 1);
- }
- } else {
- list.add(new SiriListItem("No devices have been paired", true));
- mAdapter.notifyDataSetChanged();
- mListView.setSelection(list.size() - 1);
- }
- /* 開(kāi)始搜索 */
- mBtAdapter.startDiscovery();
- seachButton.setText("停止搜索");
- }
- }
- };
-
- 4. 連接藍(lán)牙模塊
- // 開(kāi)啟客戶(hù)端
- private class clientThread extends Thread {
- public void run() {
- try {
- // 創(chuàng)建一個(gè)Socket連接:只需要服務(wù)器在注冊(cè)時(shí)的UUID號(hào)
- socket = device.createRfcommSocketToServiceRecord(UUID
- .fromString("00001101-0000-1000-8000-00805F9B34FB"));
- // 連接
- Message msg2 = new Message();
- msg2.obj = "請(qǐng)稍候,正在連接服務(wù)器:" + Bluetooth.BlueToothAddress;
- msg2.what = 0;
- LinkDetectedHandler.sendMessage(msg2);
-
- socket.connect();
-
- Message msg = new Message();
- msg.obj = "已經(jīng)連接上服務(wù)端!可以發(fā)送信息。";
- msg.what = 0;
- LinkDetectedHandler.sendMessage(msg);
- // 啟動(dòng)接受數(shù)據(jù)
- mreadThread = new readThread();
- mreadThread.start();
- } catch (IOException e) {
- Log.e("connect", "", e);
- Message msg = new Message();
- msg.obj = "連接服務(wù)端異常!斷開(kāi)連接重新試一試。";
- msg.what = 0;
- LinkDetectedHandler.sendMessage(msg);
- }
- }
- };
-
- 讀取數(shù)據(jù):
- // 讀取數(shù)據(jù)
- private class readThread extends Thread {
- public void run() {
- byte[] buffer = new byte[1024];
- int bytes;
- InputStream mmInStream = null;
- try {
- mmInStream = socket.getInputStream();
- } catch (IOException e1) {
- e1.printStackTrace();
- }
- while (true) {
- byte[] buffer1 = new byte[128];
- int count;
- try {
- count = mmInStream.read(buffer1);
- Message msg = new Message();
- msg.obj = new String(buffer1, 0, count, "UTF-8");
- msg.what = 1;
- LinkDetectedHandler.sendMessage(msg);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- 6. 解析并顯示數(shù)據(jù):
- public void setdata(String string)
- {
- String[] s = string.split(",");
- int s_0 = 0, s_1 = 0, s_2 = 0;
-
- if (s.length == 3 && s[0] != null && !s[0].equals("")
- && s[1] != null && !s[1].equals("") && s[2] != null
- && !s[2].equals("")) {
- s_0 = Integer.parseInt(s[0].trim());
- s_1 = Integer.parseInt(s[1].trim());
- double d = Double.parseDouble(s[2]);
- s_2 = (int)d;
- }
- if (s.length == 3 && s_0 > 49 && s_0 < 121 && s_1 > 94 && s_1 < 100
- && s_2 > 20 && s_2 < 40) {
- chat_textview.setText("心跳:" + s[0] + "\n血氧:" + s[1] + "\n體溫:"
- + s[2]);
- }
- }
復(fù)制代碼