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

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

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



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

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

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

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

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

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

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

圖4.2 紅外測溫從機圖
在進行測量的時候,按下電源開關(guān),然后手指戴上血氧探頭,幾秒鐘過后,即可同步成功,然后在液晶屏上面會有血氧的波形圖和血氧值、心率值、體溫值的顯示。在TFT液晶屏上的效果圖如下圖4.3所示,屏幕上方左邊為BMP(心率),中間為SPO(血氧飽和度),右邊為TEMP(體溫):
圖4.3 TFT液晶屏顯示
在手機APP上的顯示界面如下圖4.4所示,手機通過藍牙接收到的數(shù)據(jù)在屏幕上進行顯示,包括心跳、血氧、體溫的具體數(shù)值,并根據(jù)前端設(shè)備的實時采集進行更新:
圖4.4 實測效果圖
總結(jié)與展望本課題設(shè)計的智能化家庭健康監(jiān)護系統(tǒng)采取了硬件與軟件相結(jié)合的開發(fā)方法。在整個設(shè)計的過程中需要我對單片機開發(fā)、PCB繪制調(diào)試、C/C++編程語言、JAVA語言都有一定程度的了解。與此同時,需要學會查找相關(guān)的資料文件,熟悉各個芯片的開發(fā)使用方法以及它們的電氣特性等等,這些資料對于開發(fā)者來說,是非常重要的第一步。整個課題設(shè)計的過程也同時是我再次學習、鞏固、加深的過程,對“溫故而知新”這句話也有了更深一步的理解。我們只有在不斷學習,不斷鞏固,不斷思考,才能不斷進步,掌握的知識技能才能越來越牢靠,并且在實踐過程中需要我們本著實事求是的心態(tài)去做事,善于發(fā)現(xiàn)并解決問題,有意識培養(yǎng)自己解決問題的能力,為今后的學習和工作打下良好的基礎(chǔ)。
作者在最初進行本課題的設(shè)計時遇到了很多的艱難困阻。首先是血氧飽和度的數(shù)據(jù)一直無法同步,因為單片機無法采用串口中斷的方式,所以一直是采用的串口查詢的方式來接收數(shù)據(jù),這就導致時不時會丟包,而不能完全同步。其次,在單片機設(shè)計方面,沒有接觸過TFT液晶屏的開發(fā),所以當采集到生理數(shù)值時,需要在液晶屏上顯示出具體數(shù)值,同時還需要實時繪制血氧飽和度的波形,這一部分在程序設(shè)計上也花費了很大精力才得以解決。再就是android APP開發(fā)方面,因為作者一直都是使用C語言開發(fā)單片機程序,而完全沒有接觸過軟件APP的開發(fā),所以從零開始學習java語言,了解并熟悉eclipse開發(fā)環(huán)境也是難點之一。
本文在設(shè)計上有兩大特點:一是采用主從一體的藍牙傳輸模塊進行遠程的數(shù)據(jù)傳輸。這種無線通信方式是使用的很頻繁,也深受大眾喜愛的一種通信方式,其使用起來非常便捷,而且傳輸數(shù)據(jù)穩(wěn)定可靠,同時還具有低功耗模式,適用于便攜式設(shè)備。二是系統(tǒng)采集的多生理參數(shù)除了會在設(shè)備本身的TFT液晶屏上顯示出來,還會通過藍牙將數(shù)據(jù)發(fā)送給APP客戶端,在手機上進行實時的顯示。
最后,本文雖然實現(xiàn)了智能化家庭健康監(jiān)護系統(tǒng)的生理參數(shù)采集、顯示、無線傳輸功能,但仍然存在很多問題有待改進,而且在功能上還有很多是可以繼續(xù)完善的。在生理參數(shù)采集部分,可以加入心電的采集、分析,在無線傳輸部分可以使用WIFI或其他可以接入互聯(lián)網(wǎng)的設(shè)備,讓前端系統(tǒng)采集的生理數(shù)據(jù)能夠傳輸?shù)皆贫朔⻊?wù)器,與醫(yī)院進行合作,使醫(yī)院的主治醫(yī)師能夠查看我們的生理數(shù)據(jù),從而能夠在日常飲食或生活習慣上給予適當?shù)慕ㄗh,使得全社會人的身體都能夠更加健康。在系統(tǒng)的供電部分可以設(shè)計的再微小點,不用占據(jù)很大的空間,同時也能提供足夠的電量。通過上述改進措施,此智能化家庭健康監(jiān)護系統(tǒng)將會具備更加強大的實用價值以及商業(yè)價值。
參考文獻[1] 劉翔, 朱士俊, 李信春. 我國遠程醫(yī)療發(fā)展現(xiàn)狀、難點和對策分析[J]. 中國信息界, 2006(4):60-63.
[2] 吳明, 張振忠. 中國農(nóng)村合作醫(yī)療發(fā)展模式的制度分析[J]. 中國衛(wèi)生資源, 2000(3):104-107.
[3] 鄔寬明. 單片機外圍器件實用手冊--數(shù)據(jù)傳輸接口器件分冊(第2版)[M]. 北航大學出版社, 2005.
[4] 劉坤, 趙紅波, 張憲棟. 51單片機C語言應(yīng)用開發(fā)技術(shù)大全[M]. 人民郵電出版社, 2011.
[5] 陸垂偉, 毛雪濤, 戴翔宇,等. 遠程串行數(shù)據(jù)通信技術(shù)的實現(xiàn)方法及其應(yīng)用[J]. 計算機應(yīng)用研究, 2002, 19(3):23-24.
[6] 石東海. 單片機數(shù)據(jù)通信技術(shù)從入門到精通[M]. 西安電子科技大學出版社, 2002.
[7] 高潮. TFT液晶顯示驅(qū)動電路與電源優(yōu)化設(shè)計方法[J]. 深圳信息職業(yè)技術(shù)學院學報, 2007, 5(2):14-18.
[8] 原羿, 蘇鴻根. 基于ZigBee技術(shù)的無線網(wǎng)絡(luò)應(yīng)用研究[J]. 計算機應(yīng)用與軟件, 2004, 21(6):89-91.
[9] 屈景輝 李傳偉. TEECHART應(yīng)用技術(shù)詳解--快速圖表制作工具[M]. 水利水電出版社, 2008.
[10] 繆璐璐. 基于Arduino平臺開發(fā)交互式產(chǎn)品原型的研究[D]. 上海交通大學, 2013.
[11] 惠特. Arduino技術(shù)內(nèi)幕[M]. 人民郵電出版社, 2013.
[12] 李莉, 劉剛. 基于藍牙技術(shù)的溫室環(huán)境監(jiān)測系統(tǒng)設(shè)計[J]. 農(nóng)業(yè)機械學報, 2006, 37(10):97-100.
[13] 龔建偉. Visual C++/Turbo C 串口通信編程實踐[M]. 電子工業(yè)出版社, 2004.
[14] 何希才. 數(shù)字移動通信技術(shù)及應(yīng)用[M]. 機械工業(yè)出版社, 2003.
[15] 鐘君, 蔡黎明, 于涌. 基于MLX90614的無線溫度采集系統(tǒng)設(shè)計[J]. 傳感器與微系統(tǒng), 2015, 34(3):87-89.
[16] 封瑜, 葛萬成. 基于ZigBee技術(shù)的無線傳感器網(wǎng)絡(luò)構(gòu)建與應(yīng)用[J]. 電子工程師, 2007, 33(3):21-23.
[17] 許一萍. Zigbee技術(shù)在無線傳感器網(wǎng)絡(luò)中的應(yīng)用研究[D]. 復旦大學, 2008.
[18] 張利江, 郭進利, 宋亞娟. 遠程醫(yī)療監(jiān)護的現(xiàn)狀與發(fā)展[J]. 新農(nóng)村:黑龍江, 2011(2):138-139.
[19] 諸強, 王學民, 胡賓,等. 無線遠程醫(yī)療系統(tǒng)[J]. 北京生物醫(yī)學工程, 2004, 23(3):225-227.
[20] 張利江, 郭進利, 宋亞娟. 遠程醫(yī)療監(jiān)護的現(xiàn)狀與發(fā)展[J]. 新農(nóng)村:黑龍江, 2011(2):138-139.
[21] 范曉武. 基于嵌入式設(shè)備的家庭健康監(jiān)護系統(tǒng)的設(shè)計與實現(xiàn)[J]. 浙江工業(yè)大學學報, 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)護實時檢測的方法[J]. 中國組織工程研究與臨床康復, 2007(1):121-123.
[25] 黃永健, 王偉, 謝廣明,等. 物聯(lián)網(wǎng)家庭健康監(jiān)護系統(tǒng)[J]. 兵工自動化, 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); //初始化液晶的類
- File myFile; / /初始化SD卡的類
- extern uint8_t BigFont[];
- int data[5];
- char str[9];
- int buf[220],buf1[4];
- int y1=0; //判斷是否為第一次畫線
- 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(); //初始化紅外測溫模塊
-
- myGLCD.fillScr(255,255,255); //清屏
-
- if (!SD.begin(53)) { //檢測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)查詢方式檢測串口是否有數(shù)據(jù)
- for(int i=0;i<5;i++){ //采用for循環(huán)連續(xù)讀取5個字節(jié)數(shù)據(jù)
- data[i] = Serial1.read(); //讀一個字節(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){ //若滿屏,則開始清理歷史數(shù)據(jù),即消除部分波形
- myGLCD.setColor(255,255,255);
- if(t1==1){
- myGLCD.drawLine(1,135-buf[209],2,135-buf[1]); //第一次畫波形,兩點連線
- t1=0;
- }
- myGLCD.drawLine(x+1,135-buf[x],x+2,135-buf[x+1]); //兩點連線,繪制波形
- }
- if(x<210){ //若沒有滿屏,則繼續(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]); //通過串口發(fā)送將心率的數(shù)值發(fā)送給藍牙
- mySerial.print(",");
- mySerial.print(data[4]); //將血氧飽和度的數(shù)值發(fā)送給藍牙
- mySerial.print(",");
- mySerial.print(b); //將體溫的數(shù)值發(fā)送給藍牙
- mySerial.print(" ");
- time=0;
- }
- }
- 2. 紅外測溫讀取數(shù)據(jù)部分代碼:
- #define MLX90614_TOBJ1 0x07
-
- uint16_t read16(uint8_t a)
- {
- uint16_t ret;
- uint8_t pec;
- Wire.beginTransmission(_addr); // 開始發(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客戶端初始化代碼:
- 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("沒有設(shè)備已經(jīng)配對", 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)藍牙模塊:
- 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);
- }
- /* 開始搜索 */
- mBtAdapter.startDiscovery();
- seachButton.setText("停止搜索");
- }
- }
- };
-
- 4. 連接藍牙模塊
- // 開啟客戶端
- private class clientThread extends Thread {
- public void run() {
- try {
- // 創(chuàng)建一個Socket連接:只需要服務(wù)器在注冊時的UUID號
- socket = device.createRfcommSocketToServiceRecord(UUID
- .fromString("00001101-0000-1000-8000-00805F9B34FB"));
- // 連接
- Message msg2 = new Message();
- msg2.obj = "請稍候,正在連接服務(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);
- // 啟動接受數(shù)據(jù)
- mreadThread = new readThread();
- mreadThread.start();
- } catch (IOException e) {
- Log.e("connect", "", e);
- Message msg = new Message();
- msg.obj = "連接服務(wù)端異常!斷開連接重新試一試。";
- 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]);
- }
- }
復制代碼