版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
[5]。STM32單片機的功能是收集處理從傳感器模塊采集到的有效心率,血氧,體溫信息,并傳送到LCD顯示屏實時顯示檢測到的體溫、心率和血氧飽和度指標。通過MAX30102、DS18B20傳感器模塊功能是獲得體溫、心率和血氧飽和度參數(shù)。當接收到的數(shù)據(jù)參數(shù)超過按鍵模塊設定好的閾值時蜂鳴器模塊立即報警響應,此時WIFI傳感器模塊也同步數(shù)據(jù)發(fā)送到手機,系統(tǒng)框架如圖3-1所示。圖3-1系統(tǒng)硬件框架3.2系統(tǒng)軟件設計方案軟件的整體程序設計流程圖可以將其分為三個部分:第一部分:LCD顯示屏、串口系統(tǒng)、蜂鳴器編程初始化。該模塊包含了LCD初始化、串口初始化、蜂鳴器等,這些都是為以后的函數(shù)實現(xiàn)提供了基礎。第二部分:MAX30102、DS18B20傳感器模塊初始化,進行測量體溫、心率和血氧飽和度。參數(shù)采樣間隔為10ms,STM32F103C8T6芯片模塊采用IIC總線,以1660nm單色光源為光源,實現(xiàn)MAX30102傳感器模塊的數(shù)據(jù)采集,通過DS18B20傳感器模塊復位,將數(shù)據(jù)發(fā)送到ROM和RAM中。這三個過程可以同時進行溫度采集。第三部分:軟件的數(shù)據(jù)顯示,數(shù)據(jù)傳輸和警報功能。體溫、心率、血氧飽和度被顯示在LCD屏幕上,并由WIFI模塊發(fā)送至手機客戶端實時顯示。按鍵可以設定超出臨界值,并在超出閾值臨界點時蜂鳴器立刻發(fā)出警報。系統(tǒng)軟件流程如圖3-2所示圖3-2系統(tǒng)軟件流程圖3.3客戶端軟件設計界面方面需要設計一個直觀友好的用戶界面,可以通過手機應用進行實時監(jiān)測和數(shù)據(jù)顯示。能夠顯示體溫、心率、血氧飽和度的實時數(shù)據(jù)。還要能夠允許用戶設置警報閾值等參數(shù)??蛻舳诵枰軌蚪邮諄碜許TM32健康監(jiān)測系統(tǒng)的數(shù)據(jù),并進行相應的處理和展示。同時,需要重視用戶數(shù)據(jù)的安全和隱私保護,確保用戶數(shù)據(jù)不被非法獲取和濫用,嚴格控制用戶數(shù)據(jù)的訪問權限,只允許授權用戶訪問自己的監(jiān)測數(shù)據(jù)。遵守相關法律法規(guī),明確告知用戶數(shù)據(jù)收集和使用的目的,并取得用戶的同意后再進行數(shù)據(jù)處理和存儲。
4系統(tǒng)硬件選型與集成4.1系統(tǒng)設計和硬件選型4.1.1主控芯片(核心處理器)的選型方案一:51單片機,也稱為8051單片機,是一種經典的8位微控制器,由Intel公司在上世紀80年代推出,后來被多家公司仿制和改進,成為了廣泛應用的微控制器之一。方案二:選擇STM32F103C8T6處理器與芯片功能、芯片價格、芯片功耗、芯片體積平衡有關。程序的內存為64K,需要2V到3.6v的電壓,工作溫度在-40℃到85℃之間。除了完成目標項目所需的功能,還擁有一套豐富的接口和功能,如圖4-1所示。綜上所述本設計選擇方案二STM32單片機作為主控芯片。圖4-1STM32F103C8T6單片機4.1.2顯示數(shù)據(jù)模塊的選型方案一:LCD1602顯示屏利用液晶技術,通過在液晶屏上施加電場來控制液晶分子的排列方式,從而顯示文字和圖形。背光模塊提供白色或藍色LED背光光源,確保在光線暗的環(huán)境中也能清晰顯示內容。LCD1602顯示屏通常搭載HD44780兼容的控制器芯片,這一控制器負責液晶模塊的操作,并與微控制器或其他設備進行通信??刂破魈峁┮幌盗忻詈椭噶?,用于設置顯示內容、光標位置、顯示模式等。該顯示屏通常通過并行接口與微控制器或其他設備連接,常見的接口包括8位和4位并行接口,其中4位并行接口能夠節(jié)省I/O引腳。方案二:SSD1306是一種常用的OLED顯示屏控制器芯片,實物如圖4-2所示,它具有一系列優(yōu)秀的顯示特性,包括高對比度、廣視角和自發(fā)光等,使得它能夠在低功耗下提供清晰的圖像顯示,無需背光。常用于驅動128x64或128x32像素的OLED顯示屏,這種分辨率足夠顯示簡單的圖形和文本。SSD1306芯片支持多種通信接口,包括常用的I2C,這簡化了與微控制器的連接??刂乒δ芊矫妫琒SD1306具有豐富的功能,包括像素級的控制、文本顯示和圖像顯示等,同時支持顯示緩沖區(qū),可以減少在更新顯示時的閃爍。此外,SSD1306芯片具有較低的電源要求,通常在3V到5V之間工作,適用于各種嵌入式系統(tǒng)、電子產品和DIY項目,例如智能手表、傳感器數(shù)據(jù)顯示和小型游戲機等。在使用SSD1306顯示屏時,開發(fā)者通常需要編寫驅動程序來初始化顯示屏并控制其顯示內容。為簡化開發(fā)過程,廠商通常提供相關的驅動庫或示例代碼,這些資源有助于開發(fā)者快速上手并實現(xiàn)自己的項目。綜上所述本設計選擇方案一LCD1602作為數(shù)據(jù)顯示部分。圖4-2LCD顯示屏模塊4.1.3心率、血氧飽和度測量模塊的選型方案一:心率檢測由紅色LED和硫化鎘光阻劑組成(Cd硫化),并由帶有指套的傳輸光電傳感器組成。紅色LED非常穩(wěn)定,通過遮光指套裝置減少了對外界光線的干擾。在測試的時候,手指直接在紅色LED和光電管之間,光電管的電阻隨手指的血量而變化。紅外接收晶體管不能準確識別心率信號,信號放大電路復雜。采集血氧飽和度的光電脈沖傳感器主要由光源、光敏器件和相應的信號調理控制電路組成。方案二:傳感器模塊MAX30102由1.8v和3.3V電源供電,實物如圖4-3所示。與控制器通信模塊配合使用的符合I2C標準的通信接口可以通過待機軟件配置成接近零的功耗,從而顯著降低平均功耗,延長使用壽命。MAX30102感應器模組芯片內嵌了一塊超小型(3.3mmx3.3mmx5.6mm)14位插針光學模組,采用了高度集成的芯片,具有優(yōu)異的性能。該芯片的采樣率高,信噪比高,工作溫度范圍寬(-40~+85℃)。該晶片也能在超低功耗下工作,并能進行程式取樣,降低LED的電流,從而節(jié)省電力。MAX30102傳感器模塊采用PPG的光脈沖頻譜,通過計算機計算出心率和血氧含量,并將其輸入到I2C或UART中,降低了系統(tǒng)的能耗。它還配備了一臺可直接讀取計算機的數(shù)據(jù)。應用范圍:監(jiān)測人類體溫,血氧,心率三項健康參數(shù)指標。綜上所述本設計選擇方案二MAX30102傳感器模塊。圖4-3心率血氧傳感器模塊4.1.4溫度測量模塊的選型方案一:在設計以鉑熱電阻器為基礎的數(shù)碼溫度計時,對大部分導線而言,較高的溫度會使其具有較高的電阻,例如金屬等;對于一些導線,在較高的溫度下,例如碳,其電阻較低。盡管許多導線的電阻都會隨著溫度的改變而改變,所以熱電阻采用的是一種對溫度極為敏感的材質。熱敏電阻器的反應速度很快,但其準確度和銅熱電阻相比要低得多,而且是非線性的,很難分析,但是熱敏電阻器有它的優(yōu)勢。鉑作為一種金屬,其溫敏性能優(yōu)于銅,因而其測量精度也比較高。所以鉑熱電阻器是一種具有很高精確度的熱阻器,但其缺點是昂貴。方案二;DS18B20溫度傳感器實物如圖4-4所示,其通過Keil5簡單的編程就可實現(xiàn)9~12位的數(shù)據(jù)讀取,基于單片機開發(fā)相對容易,一般都能滿足要求,DS18B20溫度傳感器的性能特點如下:S18B20采用了數(shù)字式溫度傳感器的工作原理。它利用溫度與電壓或電阻的關系,通過內置的模數(shù)轉換器將溫度轉換為數(shù)字信號,然后通過數(shù)據(jù)線進行數(shù)字通信。DS18B20可在-55°C至+125°C的范圍內工作,精度為±0.5°C,該傳感器輸出的是數(shù)字信號,直接與數(shù)字設備(如微控制器)連接,無需額外的模數(shù)轉換,只需一個數(shù)據(jù)線即可實現(xiàn)數(shù)據(jù)傳輸。圖4-4體溫傳感器模塊4.1.5無線傳輸數(shù)據(jù)通信模塊的選型方案一:HC-05是一種串口透傳模塊,通過串口通信與主控設備(如微控制器、Arduino等)進行通信。它具有簡單的串口接口,使用藍牙技術實現(xiàn)無線通信,可以將串口數(shù)據(jù)通過藍牙傳輸?shù)搅硪欢?,易于與各種主控設備集成。方案二:ESP8266是一種功能強大的WIFI模塊,實物如圖4-5所示,其UART-WIFI通信技術使其能夠與其他串行設備進行高效通信。內置的TCP/IP協(xié)議賦予了它在串口和WIFI之間進行轉換的能力,從而實現(xiàn)了靈活的網絡連接。ESP8266支持三種主要工作模式:AP、STA和STA+AP。在AP模式下,ESP8266可作為WIFI接入點,創(chuàng)建一個獨立的局域網絡,并為連接到其上的設備分配IP地址。這種模式使ESP8266能夠充當獨立的網絡主節(jié)點,提供網絡連接服務。在STA模式下,ESP8266可以像普通的WIFI客戶端設備一樣連接到現(xiàn)有的WIFI網絡,并通過該網絡訪問互聯(lián)網。這種模式使ESP8266能夠成為現(xiàn)有網絡的一部分,以便通過現(xiàn)有網絡連接到全球互聯(lián)網。在STA+AP模式下,ESP8266可以同時連接到現(xiàn)有的WIFI網絡并充當WIFI接入點。這種模式常用于WIFI中繼或為其他設備提供連接服務,使得ESP8266既能擴展現(xiàn)有網絡的覆蓋范圍,又能夠為周圍設備提供網絡連接的便利??偟膩碚f,ESP8266的多種工作模式和靈活性使其成為各種網絡連接應用的理想選擇,從簡單的局域網絡到復雜的互聯(lián)網連接都能夠得到滿足。圖4-5ESP8266WIFI模塊4.2系統(tǒng)總硬件方案系統(tǒng)的硬件構成涵蓋了多個重要電路組件,包括STM32芯片電路、顯示數(shù)據(jù)電路、心率和血氧飽和度檢測電路、人體溫度檢測電路、無線傳輸數(shù)據(jù)電路以及蜂鳴器電路。在這個系統(tǒng)中,STM32芯片扮演著核心角色,通過與各個傳感器的引腳連接,實現(xiàn)了數(shù)據(jù)采集和控制通信的功能。MAX30102傳感器通過PB0引腳連接,負責采集人體的心率和血氧飽和度數(shù)據(jù),并將其傳輸?shù)街骺匦酒琒TM32,最終呈現(xiàn)在LCD顯示屏上。同時,DS18B20溫度傳感器則通過PB15連接,負責采集體溫數(shù)據(jù),同樣通過STM32芯片發(fā)送到LCD顯示屏。此外,無線WIFI模塊ESP8266通過連接PA0、PA1、PA2和PA3實現(xiàn)了與STM32芯片的通信,實現(xiàn)了無線數(shù)據(jù)傳輸?shù)墓δ堋6澍Q器則通過連接PB9,為系統(tǒng)提供了聲音提示功能。4.3最小單片機系統(tǒng)在單片機系統(tǒng)中,最小單片機系統(tǒng)是保證其工作正常的前提,系統(tǒng)原理如圖4-6所示。也可以說是一個最小的環(huán)境,可以讓一個處理器的工作正常。最小單片機系統(tǒng)包括四部分:STM32F單片機芯片、時鐘電路、復位電路,STM32F單片機芯片可以運行一個工作程序,并進行相應的控制,時鐘電路可以提供一個時鐘電源,用于啟動STM32F單片機芯片,復位電路可以讓每個模塊在一個特殊的初始狀態(tài)下,電源電路提供所需電壓。圖4-6最小單片機系統(tǒng)的原理圖4.3.1STM32F103C8T6單片機STM32F103C8T6作為本裝置的核心控制器,不僅要處理從MAX3012傳感器、DS18B20傳感器檢測的體溫、心率和血氧飽和度三個健康參數(shù),還要傳輸數(shù)據(jù)到LCD顯示屏與手機客戶端,其是管腳較為密集、兼容性強的多功能單片機,在硬件設計中保證裝置正常運行的重要部分,系統(tǒng)原理如圖4-7所示。圖4-7STM32F103C8T6芯片的原理圖4.3.2時鐘電路時鐘電路在系統(tǒng)中扮演著至關重要的角色,通常被稱為晶振電路,其功能在于提供系統(tǒng)的時鐘基準。單片機的指令處理過程必須嚴格按照時鐘進行,這包括指令的提取、解碼、寄存器操作以及指令的交換等步驟。晶體振蕩器則是產生時鐘信號的核心組件,用于驅動STM32F處理器。為了確保時鐘的準確性,晶體振蕩器和電容需要放置在一起,并且靠近晶振管腳。在這個系統(tǒng)中,選擇了8MHz的晶振頻率以及20PF的電容,以便更好地適應晶體振動的特性,從而提高時鐘的穩(wěn)定性和準確性。電路原理如圖4-8所示。圖4-8晶振電路的原理圖4.3.3復位按鍵電路按鍵設計一共有四個,S0是最重要的復位按鍵,當系統(tǒng)出現(xiàn)卡頓或者斷聯(lián)時可以按下S0重啟設備消除故障,一切恢復到初始化,該復位電路用來恢復該電路的工作狀態(tài)。RC復位或單獨的IC復位復位,STM32的復位引腳內置10K電阻器,該電阻器可以由10uf的外部電容器來重新設置。S1按鍵可以選擇想要修改的閾值選項,可以對體溫、心率和血氧的報警閾值進行修改,S2按鍵可以將心率血氧和體溫的閾值設置降低,S3按鍵可以將心率血氧和體溫的閾值設定升高,當測量的參數(shù)超過設置的報警閾值蜂鳴器就會報警,電路原理如圖4-9所示。圖4-9復位按鍵電路的原理圖4.3.4電源電路STM32F103C8T6處理器采用3.3V電壓供電,MAX30102傳感器、DS18b20傳感器、ESP8266WIFI模塊、LCD1602顯示屏等硬件均采用5.0/3.3V電壓供電。由數(shù)據(jù)線連接電腦USB接口或帶有USB口的移動電源供電。STM32F103C8T6處理器串聯(lián)一個1K的電阻和LED1,當系統(tǒng)通電時,LED1會亮起紅燈并且發(fā)出滴的聲響。電源電路原理如圖4-10所示。圖4-10電源電路的原理圖4.4心率、血氧檢測模塊電路本設計部件的硬件電路采用5.5V的電源,其內部的光電探測感應器也能獲得較好的光信號。三個引腳INT、SDA和SCL分別連接到處理器PB12和PB11和PB10引腳,SDA和SCL作為IIC接口,用于向MAX30102的數(shù)據(jù)存儲器進行數(shù)據(jù)傳送。SCL管腳是IIC中的一個時鐘信號接口,它決定了數(shù)據(jù)的快慢,而SDA管腳則是IIC中的數(shù)據(jù)傳送接口,它與SCL時鐘信號進行了同步和調制,并將其與SCL時鐘信號進行了同步和調制。MAX30102心率血氧模塊原理如圖4-11所示。圖4-11心率血氧模塊的原理圖4.5體溫檢測模塊電路DS18B20的檢測器由左至右分別是:VCC、DQ、GND、DQ與STM32F103C8T6控制器PB15管腳相連,DQ和VCC由10K電阻串聯(lián)而成。在檢測到溫度后,將溫度信息傳送給STM32控制器,由STM32進行分析和處理。DS18B20體溫模塊原理如圖4-12所示。圖4-12溫度模塊的原理圖4.6無線傳輸數(shù)據(jù)模塊電路ESP8266WIFI模塊引腳從左到右依次為GND、RXD、TXD、EN和VCC。GND接地,VCC接3.3V的電源,RXD、TXD、EN與STM32F103C8T6處理器PA2、PA3、PA1引腳相連,接收體溫、心率和血氧各個參數(shù)發(fā)送到手機客戶端并持續(xù)不斷顯示參數(shù)變化。ESP8266WIFI模塊原理如圖4-13所示。圖4-13WIFI模塊的原理圖4.7顯示檢測數(shù)據(jù)模塊電路將LCD1602顯示屏的GND引腳連接到STM32F103C8T6的地(GND)引腳,VCC引腳連接到STM32F103C8T6的3.3V電源引腳。D0引腳連接到STM32F103C8T6的PA5引腳。D1引腳連接到STM32F103C8T6的PA7引腳。RST引腳連接到STM32F103C8T6的PB0引腳。DC引腳連接到STM32F103C8T6的PA6引腳。CS引腳連接到STM32F103C8T6的PA4引腳,接收檢測到的體溫、心率和血氧各個參數(shù)并實時顯示,這樣能直接觀察到身體生命特征信號的變化。LCD1602原理如圖4-14所示。圖4-14LCD顯示模塊的原理圖4.8蜂鳴器報警模塊電路當系統(tǒng)檢測到的參數(shù)指標超過我們設定好的報警閾值后,蜂鳴器報警裝置就會發(fā)出刺耳的響聲來提示,蜂鳴器報警裝置采用的是發(fā)光二極管,如果體溫、心率和血氧各個參數(shù)其中一個超過報警閾值后,LED燈便亮起報警,方便觀察。給人們對自身生命體征信號檢測帶來了極大的便利。蜂鳴器報警模塊原理如圖4-15所示。圖4-15蜂鳴器報警模塊原理圖
5系統(tǒng)實現(xiàn)5.1心率血氧采集STM32控制器向MAX30102模塊發(fā)送初始化配置命令,MAX3012向測量對象發(fā)送紅色信號,MAX30102使用接收傳感器檢測反射信號。下一步,ADC接收的模擬信號模塊將STM32檢測數(shù)據(jù)信號處理給STM32,以確定其有效性。如圖5-1所示為心率、血氧飽和度數(shù)據(jù)采集軟件的流程。圖5-1心率血氧采集流程圖調用計算心率、計算血氧飽和度和讀取體溫的函數(shù),將原始數(shù)據(jù)轉換成實際的心率、血氧飽和度和體溫值。調用將心率、血氧飽和度和體溫顯示在LCD屏幕上的函數(shù),使采集到的數(shù)據(jù)顯示在LCD屏幕上,方便用戶查看,再根據(jù)心率、血氧飽和度和體溫是否超過預設閾值來觸發(fā)警報,以提醒用戶可能存在的異常情況。心率血氧初始化和讀取如代碼5-1所示。代碼5-1初始化和讀取數(shù)據(jù)voidInit_MAX30102(void){int32_ti;un_brightness=0;un_min=0x3FFFF;un_max=0;bsp_InitI2C();//初始化I2Cmaxim_max30102_reset();//復位MAX30102maxim_max30102_read_reg(REG_INTR_STATUS_1,&uch_dummy);maxim_max30102_init();//初始化MAX30102n_ir_buffer_length=150;for(i=0;i<n_ir_buffer_length;i++){maxim_max30102_read_fifo((aun_ir_buffer+i),(aun_red_buffer+i));if(un_min>aun_red_buffer[i])un_min=aun_red_buffer[i];//更新最小值if(un_max<aun_red_buffer[i])un_max=aun_red_buffer[i];//更新最大值}un_prev_data=aun_red_buffer[i];//保存前一個紅光數(shù)據(jù),用于計算LED亮度變化maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer,n_ir_buffer_length,aun_red_buffer,&n_spo2,&ch_spo2_valid,&n_heart_rate,&ch_hr_valid);//計算心率和血氧飽和度}5.2體溫采集DS18B20是三只腳溫度傳感器芯片,采集到的數(shù)據(jù)通過通過單總線通信協(xié)議從DS18B20傳感器讀取溫度信息。體溫采集流程為單片機斷開數(shù)據(jù)線至少480uS,用15-60uS松開數(shù)據(jù)線,直到DS18B20收到信號。溫度傳感器DS18B20收到信號后斷開至少60-240uS的數(shù)據(jù)線,主機檢測到數(shù)據(jù)線發(fā)送ROM命令,主機須發(fā)送連接ROM命令到系統(tǒng)的DS18B20。SCM使用RAM來執(zhí)行DS18B20中的RAM操作,比如讀取和設置寄存器值,采集到的數(shù)據(jù)通過通過單總線通信協(xié)議從DS18B20傳感器讀取溫度信息。得到實際測量人體溫度后,如果超限設定閾值時蜂鳴器將會報警。如圖5-2為體溫采集流程。圖5-2體溫采集流程圖使能DS18B20使用的GPIO端口時鐘,然后配置GPIO引腳為推挽輸出模式,設置輸出速度為50MHz,最后將數(shù)據(jù)線置高,如代碼5-2所示。代碼5-2初始化GPIOvoidDS18B20_GPIO_Init(void){//配置DS18B20數(shù)據(jù)線GPIOGPIO_InitTypeDefGPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_DS18B20_PORT,ENABLE);//使能端口時鐘GPIO_InitStructure.GPIO_Pin=DS18B20_GPIO_PIN;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽輸出GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//GPIO速度為50MHzGPIO_Init(DS18B20_GPIO_PORT,&GPIO_InitStructure);//將數(shù)據(jù)線置高GPIO_SetBits(DS18B20_GPIO_PORT,DS18B20_GPIO_PIN);}發(fā)送DS18B20的初始化序列,然后等待DS18B20的響應,如果超時則返回初始化失敗的狀態(tài),如代碼5-3所示。代碼5-3DS18B20初始化u8DS18B20_Init(void){unsignedcharwait=0;//發(fā)送初始化序列DS18B20_IO_OUT();DS18B20_OUT_0;delay_us(750);DS18B20_OUT_1;delay_us(15);DS18B20_IO_IN();//等待DS18B20響應while(READ_DS18B20_IO&&wait++<200)delay_us(1);if(wait>=200)return1;elsewait=0;while(!READ_DS18B20_IO&&wait++<240)delay_us(1);if(wait>=240)return1;elsereturn0;}從DS18B20傳感器中讀取一個字節(jié)的數(shù)據(jù),通過循環(huán)讀取每一位,并根據(jù)時序接收數(shù)據(jù)位,如代碼5-4所示。代碼5-4讀取數(shù)據(jù)unsignedcharDS18B20_ReadByte(void){unsignedchari;unsignedchardat=0;//讀取一個字節(jié)的數(shù)據(jù)for(i=0;i<8;i++){dat>>=1;DS18B20_IO_OUT();DS18B20_OUT_0;delay_us(2);DS18B20_OUT_1;DS18B20_IO_IN();delay_us(12);if(READ_DS18B20_IO)dat|=0x80;delay_us(60);}returndat;}向DS18B20傳感器中寫入一個字節(jié)的數(shù)據(jù),通過循環(huán)寫入每一位,并根據(jù)時序產生時鐘信號,如代碼5-5所示。代碼5-5寫入數(shù)據(jù)voidDS18B20_WriteByte(unsignedchardat){unsignedchari;unsignedchartemp;//寫入一個字節(jié)的數(shù)據(jù)DS18B20_IO_OUT();for(i=1;i<=8;i++){temp=dat&0x01;dat=dat>>1;if(temp){DS18B20_OUT_0;delay_us(2);DS18B20_OUT_1;delay_us(60);}else{DS18B20_OUT_0;delay_us(60);DS18B20_OUT_1;delay_us(2);}}}讀取DS18B20傳感器中的溫度值,包括發(fā)送開始轉換命令、讀取溫度值的原始數(shù)據(jù)并轉換為實際溫度值,最終返回,如代碼5-6所示。代碼5-6讀取溫度值floatReadTemperature(void){unsignedcharTPH;unsignedcharTPL;shorti16=0;floatf32=0;//初始化DS18B20并開始轉換溫度DS18B20_Init();DS18B20_WriteByte(0xCC);DS18B20_WriteByte(0x44);DS18B20_Init();DS18B20_WriteByte(0xCC);DS18B20_WriteByte(0xBE);//讀取溫度值TPL=DS18B20_ReadByte();TPH=DS18B20_ReadByte();i16=0;i16=(TPH<<8)|TPL;f32=i16*0.0625;return(f32);}5.3WIFI數(shù)據(jù)傳輸將電源和單片機連接供電,WIFI模塊進行初始化,然后采集心率血氧和體溫數(shù)據(jù),然后手機打開客戶端軟件,點擊連接按鈕,選擇連接ESP8266WIFI模塊的熱點,當成功連接后會實時顯示檢測到的體溫、心率和血氧飽和度的數(shù)據(jù),WIFI數(shù)據(jù)傳輸流程如圖5-3所示。圖5-3數(shù)據(jù)傳輸流程圖初始化ESP8266,定義一個WIFI網絡的名稱yi和密碼12345678,用于創(chuàng)建WIFI熱點,使手機能夠通過客戶端軟件連接到ESP8266WIFI模塊,并且通過WIFI將心率,血氧和體溫數(shù)據(jù)傳輸?shù)绞謾C客戶端,如代碼5-7所示。代碼5-7WIFI模塊voidESP8266_Init(void){ uart1_Init(115200);//串口初始化 ESP8266_Clear(); while(ESP8266_SendCmd("AT\r\n\r","OK",200))//測試 delay_ms(500); while(ESP8266_SendCmd("AT+CWMODE=2\r\n","OK",200))//服務器搭建在WIFI模塊上 delay_ms(500); while(ESP8266_SendCmd("AT+CWSAP=\"yi\",\"12345678\",5,3\r\n","OK",200))//設置顯示名稱:ESP8266_WIFI,密碼:12345678 delay_ms(500); while(ESP8266_SendCmd("AT+CIPMUX=1\r\n","OK",200))//啟動多連接,建立服務器都需要配置 delay_ms(500); while(ESP8266_SendCmd("AT+CIPSERVER=1,8080\r\n","OK",200))//建立服務器 delay_ms(500);}5.4LCD數(shù)據(jù)顯示STM32控制器使用LCD1602顯示屏顯示.電源啟動后,系統(tǒng)會進行接收有效的信號,再用STM32處理器對所提取的有效信號進行處理,最終得到體溫、心率、血氧飽和度數(shù)據(jù)參數(shù)。在軟件算法方面,通過MAX30102的心率、血氧飽和度模塊、DS18B20的溫度模塊向LCD顯示屏發(fā)送控制信號,WIFI模塊將數(shù)據(jù)無線傳輸?shù)绞謾C客戶端進行實時監(jiān)控,顯示模塊工作流程如圖5-4所示。圖5-4顯示模塊流程圖LCD設置為命令模式,命令數(shù)據(jù)寫入LCD的數(shù)據(jù)總線(A0-A7),并通過使能腳告知LCD數(shù)據(jù)已準備好,最后關閉使能,如代碼5-8所示。代碼5-8發(fā)送命令voidLCD_Write_Com(unsignedcharcom){LCD1602_RS=0;//選擇發(fā)送命令delay_us(1);LCD1602_RW=0;//設置為寫模式delay_us(1);LCD1602_EN=1;//使能LCDdelay_us(1);GPIO_Write(GPIOA,(GPIO_ReadOutputData(GPIOA)&0XFF00)+Dao_xu(com));//向A0-A7引腳寫入反轉后的命令數(shù)據(jù)delay_us(100);LCD1602_EN=0;//關閉使能}LCD設置為數(shù)據(jù)模式,要發(fā)送的數(shù)據(jù)寫入LCD的數(shù)據(jù)總線(A0-A7),并通過使能腳告知LCD數(shù)據(jù)已準備好,最后關閉使能,如代碼5-9所示。代碼5-9發(fā)送數(shù)據(jù)voidLCD_Write_Data(unsignedcharData){LCD1602_RS=1;//選擇發(fā)送數(shù)據(jù)delay_us(1);LCD1602_RW=0;//設置為寫模式delay_us(1); LCD1602_EN=1;//使能LCDdelay_us(1);GPIO_Write(GPIOA,(GPIO_ReadOutputData(GPIOA)&0XFF00)+Dao_xu(Data));//向A0-A7引腳寫入反轉后的數(shù)據(jù)delay_us(100);LCD1602_EN=0;//關閉使能}根據(jù)參數(shù)確定顯示的行(y)和列(x),將單個字符或者字符串寫入LCD顯示屏,如代碼5-10所示。代碼5-10寫入字符串voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s){if(y==0){LCD_Write_Com(0x80+x);//設置顯示位置在第一行}else{LCD_Write_Com(0xC0+x);//設置顯示位置在第二行}while(*s)//循環(huán)直到遇到字符串結束符{LCD_Write_Data(*s);//逐字符寫入顯示數(shù)據(jù)s++;//指針移動到下一個字符}}voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData){if(y==0){LCD_Write_Com(0x80+x);//設置顯示位置在第一行}else{LCD_Write_Com(0xC0+x);//設置顯示位置在第二行}LCD_Write_Data(Data);//寫入要顯示的字符}voidLCD_Clear(void){LCD_Write_Com(0x01);//發(fā)送清屏命令delay_ms(5);//延時等待清屏完成}初始化GPIO引腳為輸出模式,發(fā)送一系列初始化命令給LCD,包括設置為8位數(shù)據(jù)接口、顯示2行、關閉顯示、清屏、設置光標移動等,如代碼5-11所示。代碼5-11初始化LCDvoidLCD_Init(void){//初始化GPIO引腳RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;GPIO_Init(GPIOC,&GPIO_InitStructure);//發(fā)送LCD初始化命令LCD_Write_Com(0x38);//設置為8位數(shù)據(jù)接口,顯示2行,5x7點陣delay_ms(5);LCD_Write_Com(0x08);//關閉顯示delay_ms(5);LCD_Write_Com(0x01);//清屏delay_ms(5);LCD_Write_Com(0x06);//光標移動設置delay_ms(5);LCD_Write_Com(0x0C);//開啟顯示,不顯示光標delay_ms(5);}5.5客戶端軟件實現(xiàn)首先手機端運行客戶端軟件,點擊連接按鈕。連接到STM32單片機的ESP8266WIFI模塊。當連接成功后,手機端等待接收STM32單片機發(fā)送的數(shù)據(jù)。接收到數(shù)據(jù)后,根據(jù)數(shù)據(jù)內容更新界面顯示,同時可以發(fā)送控制命令到STM32單片機,如修改閾值等,客戶端軟件流程,軟件界面分別如圖5-5,圖5-6所示。圖5-5客戶端軟件流程圖圖5-6軟件界面當我們打開軟件,主活動代碼會初始化界面和布局,軟件啟動時會請求所需的權限,如果未獲得位置權限,則將其添加到權限列表中,并請求權限。獲取位置權限后,繼續(xù)獲取手機系統(tǒng)的WIFI服務權限,并檢查WIFI是否啟用。如果WIFI未啟用,顯示打開WIFI失敗提示用戶。創(chuàng)建了一個新的線程,在這個線程中檢查WIFI是否已經啟用,如果沒有,則嘗試啟用WIFI,如代碼5-12所示。代碼5-12啟用WIFIList<String>permissionList=newArrayList<>();If(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.ACCESS_FINE_LOCATION)!=PackageManager.PERMISSION_GRANTED){permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);}if(!permissionList.isEmpty()){String[]permissions=permissionList.toArray(newString[permissionList.size()]);ActivityCompat.requestPermissions(MainActivity.this,permissions,1);}wifiiManager=(WIFIManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);if(!wifiManager.isWIFIEnabled()){Toast.makeText(this,"打開WIFI失敗!",Toast.LENGTH_LONG).show();finish();return;}newThread(){@SuppressLint("MissingPermission")publicvoidrun(){if(!wifiManager.isWIFIiEnabled()){wifiManager.setWIFIEnabled(true);}}}.start();在用戶觸摸屏幕時檢查是否需要隱藏軟鍵盤。當用戶點擊屏幕時,首先獲取當前獲取焦點的控件。如果需要隱藏軟鍵盤,就會清除控件的焦點,使光標消失,并且隱藏軟鍵盤,如代碼5-13所示。代碼5-13檢查是否需要隱藏軟鍵盤publicbooleandispatchTouchEvent(MotionEventev){if(ev.getAction()==MotionEvent.ACTION_DOWN){Viewv=getCurrentFocus();if(isShouldHideKeyboard(v,ev)){v.clearFocus();//清除Edittext的焦點從而讓光標消失hideKeyboard(v.getWindowToken());}}returnsuper.dispatchTouchEvent(ev);}privatevoidhideKeyboard(IBindertoken){if(token!=null){//若token不為空則獲取輸入法管理器使其隱藏輸入法鍵盤InputMethodManagerim=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);im.hideSoftInputFromWindow(token,InputMethodManager.HIDE_NOT_ALWAYS);}}連接到指定的WIFI網絡。當連接成功時,會彈出一個消息提示連接成功了,否則彈出連接失敗,如代碼5-14所示。代碼5-14WIFI連接提示//響應startActivityForResult()返回的結果publicvoidonActivityResult(intrequestCode,intresultCode,Intentdata){if(requestCode==REQUEST_CONNECT_DEVICE&&resultCode==Activity.RESULT_OK){//連接結果,由DeviceListActivity設置返回//直接連接特定的WIFI網絡Stringssid="yi";Stringpassword="12345678";//連接WiFibooleanconnected=connectToWifi(ssid,password);//根據(jù)連接結果顯示提示信息Toast.makeText(this,connected?"連接WIFI成功!":"連接WIFI失??!",Toast.LENGTH_SHORT).show();}}//連接WIFI的方法privatebooleanconnectToWifi(Stringssid,Stringpassword){//設置WIFI配置信息WifiConfigurationwifiConfig=newWifiConfiguration();wifiConfig.SSID="\""+ssid+"\"";wifiConfig.preSharedKey="\""+password+"\"";//獲取WIFI管理器WifiManagerwifiManager=(WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);//添加WIFI網絡配置,并獲取網絡IDintnetworkId=wifiManager.addNetwork(wifiConfig);//如果成功添加網絡配置if(networkId!=-1){//斷開當前連接wifiManager.disconnect();//啟用指定網絡wifiManager.enableNetwork(networkId,true);//重新連接WIFI網絡returnwifiManager.reconnect();}returnfalse;}當有新消息到達時,檢查消息內容是否包含特定的標記,這些標記代表著不同的健康指標,比如心率、血氧飽和度、體溫。發(fā)現(xiàn)消息中包含了這些標記,便從消息中提取相應的數(shù)值,并將這些數(shù)值更新到客戶端界面上,以便用戶可以清楚地看到當前的健康狀態(tài),讓用戶可以方便地實時監(jiān)測自己的健康指標,提升了用戶對健康狀況的感知和管理,如代碼5-15所示。代碼5-15數(shù)據(jù)展示Handlerhandler=newHandler(){publicvoidhandleMessage(Messagemsg){super.handleMessage(msg);intintIndex1=smsg.indexOf("$hear:");if(intIndex1!=-1){Stringstr=smsg;TextViewtextView=findViewById(R.id.textViewHeartrate);textView.setText(str.substring(intIndex1+6,str.indexOf("#",intIndex1)));}intintIndex2=smsg.indexOf("$spo2:");if(intIndex2!=-1){Stringstr=smsg;TextViewtextView=findViewById(R.id.textViewSpo2);textView.setText(str.substring(intIndex2+6,str.indexOf("#",intIndex2)));}intintIndex3=smsg.indexOf("$temp:");if(intIndex3!=-1){Stringstr=smsg;TextViewtextView=findViewById(R.id.textViewTemperature);textView.setText(str.substring(intIndex3+6,str.indexOf("#",intIndex3)));}smsg="";//清空smsg,以便下一次接收數(shù)據(jù)時使用//inTextView.setText(smsg);//scrollView.scrollTo(0,inTextView.getMeasuredHeight());}};當用戶點擊連接按鈕時,如果WIFI未開啟,則會提示用戶打開WIFI并嘗試打開WIFI。如果WIFI已經可用且尚未連接設備,則會打開一個設備列表頁面進行設備搜索。當用戶點擊斷開連接按鈕時,如果當前已經建立了連接,則會關閉連接,停止數(shù)據(jù)傳輸,并彈出消息提示WIFI已斷開。當用戶點擊退出按鈕時,會安全地關閉連接并退出應用,以避免異常情況發(fā)生。這些按鈕的作用是控制與設備的連接狀態(tài),包括連接設備、斷開連接和安全退出應用。這樣用戶就可以方便地管理與設備的通信,并保證在退出應用時不會出現(xiàn)異常情況,如代碼5-16所示。代碼5-16按鍵控制publicvoidonConnectButtonClicked(Viewview){if(!_wifi.isEnabled()){//如果WIFI不可用,提示用戶打開WIFI并返回Toast.makeText(this,"打開WIFI中...",Toast.LENGTH_SHORT).show();_wifi.enable();return;}if(_socket==null){//如果未連接設備,打開設備列表頁面進行搜索startActivityForResult(newIntent(this,DeviceListActivity.class),REQUEST_CONNECT_DEVICE);}}publicvoidonDisconnectionClicked(Viewview){if(_socket!=null){//關閉連接try{Toast.makeText(this,"WIFI斷開",Toast.LENGTH_SHORT).show();bRun=false;//停止數(shù)據(jù)接收線程_socket.close();_socket=null;}catch(IOExceptione){}}}publicvoidonExitButtonClicked(Viewview){if(_socket!=null){//安全關閉連接try{bRun=false;//停止數(shù)據(jù)接收線程_socket.close();_socket=null;}catch(IOExceptione){}}finish();//退出應用}當用戶點擊發(fā)送調整閾值的指令時,會先檢查是否連接上WIFI模塊,如果連接為空,顯示一條短暫的消息提醒用戶連接WIFI模塊。再檢查各個文本輸入框是否為空,如果為空則顯示一條短暫的消息提醒用戶輸入數(shù)據(jù),如代碼5-17所示。代碼5-17發(fā)送檢查publicvoidonSendButtonClicked(Viewview){//檢查客戶端套接字和客戶端打印寫入器是否為空if(clientSocket==null||clientPrintWriter==null){//如果為空,顯示一個短暫的提示消息,并返回Toast.makeText(this,"請先連接",Toast.LENGTH_SHORT).show();return;}//檢查輸入框中是否有數(shù)據(jù)if(edit0.getText().length()==0||edit1.getText().length()==0||edit2.getText().length()==0||edit3.getText().length()==0||edit4.getText().length()==0){//如果有任何一個輸入框為空,顯示一個短暫的提示消息,并返回Toast.makeText(this,"請先輸入數(shù)據(jù)",Toast.LENGTH_SHORT).show();return;}}用戶在界面上輸入的一系列數(shù)據(jù),如心率范圍、體溫范圍、血氧飽和度范圍,通過WIFI連接將閾值設置命令傳輸給STM32單片機。當用戶點擊發(fā)送按鈕時,程序會從界面上獲取用戶輸入的各項數(shù)據(jù),并將其按照一定的格式打包成一個字節(jié)數(shù)組。接著,通過WIFI連接將命令發(fā)送給STM32單片機。STM32單片機收到數(shù)據(jù)后,可以根據(jù)這些數(shù)據(jù)進行相應的處理,比如根據(jù)用戶設置的范圍進行健康狀態(tài)監(jiān)測或警報等,如代碼5-18所示。代碼5-18發(fā)送閾值設置//獲取心率最小值、最大值、體溫最小值、最大值和血氧最小值的輸入框文本視圖TextViewedit0=findViewById(R.id.heartrate_min);TextViewedit1=findViewById(R.id.heartrate_max);TextViewedit2=findViewById(R.id.temperature_min);TextViewedit3=findViewById(R.id.temperature_max);TextViewedit4=findViewById(R.id.SPO2_Min);//獲取輸入框中的文本內容并轉換為字符串finalStringstr1=edit0.getText().toString();finalStringstr2=edit1.getText().toString();finalStringstr3=edit2.getText().toString();finalStringstr4=edit3.getText().toString();finalStringstr5=edit4.getText().toString();//在新線程中執(zhí)行網絡操作,以避免阻塞UI線程newThread(newRunnable(){publicvoidrun(){//將數(shù)據(jù)格式化成字符串,并發(fā)送到服務器clientPrintWriter.println("hear_min:"+str1+","+"hear_max:"+str2+","+"temp_min:"+str3+","+"temp_max:"+str4+","+"spo2_min:"+str5+"\r\n");clientPrintWriter.flush();//刷新打印寫入器}}).start();//啟動新線程
6系統(tǒng)測試6.1硬件測試硬件測試首先要檢查溫度模塊、心率血氧模塊,WIFI模塊是否有故障,LCD顯示屏是否可以顯示完整,進行焊接時,要用萬用表逐一檢查各個電容、電阻的焊點是否可以通電,再檢查各個模塊引腳是否有誤觸的地方,檢查以防后面出現(xiàn)漏焊、短路小問題,蜂鳴器是否可以正常響應,USB接口供電電壓是否滿足設計要求,PCB線路需要避免交叉,布線不僅要協(xié)調,還要美觀,使整個系統(tǒng)設計清晰易懂。硬件測試如圖6-1所示,各功能模塊焊接正常。圖6-1硬件測試圖6.2軟件測試軟件測試是整個系統(tǒng)運作的核心條件具
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 2104-2025鋼絲繩包裝、標志及質量證明書的一般規(guī)定
- 中山大學附屬第三醫(yī)院2026年合同人員招聘備考題庫及完整答案詳解一套
- 廣西工藝美術研究院有限公司所屬企業(yè)絹麻所2025年12月招聘備考題庫及一套答案詳解
- 2025年浙江大學中國農村發(fā)展研究院招聘備考題庫及答案詳解一套
- 中電科發(fā)展規(guī)劃研究院有限公司2026屆校園招聘備考題庫有答案詳解
- 中山大學附屬第三醫(yī)院粵東醫(yī)院2026年合同人員招聘備考題庫及答案詳解一套
- 2025年中建二局商務管理部招聘備考題庫及1套完整答案詳解
- 中國科學院空間應用工程與技術中心2026屆校園招聘備考題庫及完整答案詳解1套
- 2025年福建省體育局直屬事業(yè)單位面向退役運動員公開招聘工作人員13人備考題庫有答案詳解
- 中聯(lián)新能源科技開發(fā)公司招聘考試真題2024
- 中西醫(yī)結合糖尿病足分級治療策略
- 《T CMADI 085-2022牙槽骨增量用增材制造個性化鈦網》
- 【MOOC】微處理器與嵌入式系統(tǒng)設計-電子科技大學 中國大學慕課MOOC答案
- 汽車吊吊裝施工方案方案
- GB/T 4340.1-2024金屬材料維氏硬度試驗第1部分:試驗方法
- 速食食品行業(yè)相關投資計劃提議
- 安全操作規(guī)程管理制度(完整版合同模板)
- 賈玲春晚搞笑公司年會小品《真假老師》臺詞劇本完整版
- 涉詐風險賬戶審查表
- 測繪資質分級標準規(guī)定(2014版)
- 家譜序言經典范文(12篇)
評論
0/150
提交評論