




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
[6],VCC引腳連接到STM32F103C8T6的5V電源引腳。D0-D7引腳分別連接到STM32單片機(jī)的PA0-PA7引腳。RS引腳連接到STM32單片機(jī)的PC13引腳,該引腳為寄存器選擇腳,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。RW引腳連接到STM32單片機(jī)的PC14引腳,該引腳為讀寫信號線,高電平時進(jìn)行讀操作,低電平時進(jìn)行寫操作。當(dāng)RS和RW共同為低電平時可以寫入指令或顯示地址;當(dāng)RS為低電平,RW為高電平時,可以讀忙信號;當(dāng)RS為高電平,RW為低電平時,可以寫入數(shù)據(jù)。EN引腳連接到STM32單片機(jī)的PC15引腳,該引腳為使能端,當(dāng)EN端由高電平跳變?yōu)榈碗娖綍r,液晶模塊執(zhí)行命令。LCD1602原理如圖4-14所示。圖4-14LCD顯示模塊的原理圖4.8蜂鳴器模塊電路當(dāng)系統(tǒng)檢測到的參數(shù)指標(biāo)超過設(shè)定好的報警閾值后,蜂鳴器報警裝置就會發(fā)出刺耳的響聲來提示,蜂鳴器報警裝置采用的是發(fā)光二極管,如果體溫、心率和血氧各個參數(shù)其中一個超過報警閾值后,LED燈便亮起報警,方便觀察。給人們對自身生命體征信號檢測帶來了極大的便利。蜂鳴器模塊原理如圖4-15所示。圖4-15蜂鳴器模塊原理圖
5系統(tǒng)實(shí)現(xiàn)5.1心率血氧采集STM32單片機(jī)向MAX30102模塊發(fā)送初始化配置命令,MAX30102向測量對象發(fā)送紅色信號,MAX30102使用接收傳感器檢測反射信號。下一步,將由STM32單片機(jī)進(jìn)行處理檢測,以確定其有效性。如圖5-1所示為心率、血氧飽和度數(shù)據(jù)采集軟件的流程。圖5-1心率血氧采集流程圖調(diào)用計算心率、計算血氧飽和度的函數(shù),將原始數(shù)據(jù)轉(zhuǎn)換成實(shí)際的心率、血氧飽和度。然后將心率、血氧飽和度同時顯示在LCD屏幕上和手機(jī)客戶端,方便用戶查看,再根據(jù)心率、血氧飽和度是否超過預(yù)設(shè)閾值來觸發(fā)警報,以提醒用戶可能存在的異常情況。心率和血氧飽和度數(shù)據(jù)采集處理實(shí)現(xiàn)如代碼5-1所示。代碼5-1采集和處理數(shù)據(jù)//將前50組樣本數(shù)據(jù)丟棄,并將后100組數(shù)據(jù)移到緩沖區(qū)頂部for(i=50;i<150;i++){//移動紅光傳感器數(shù)據(jù)到緩沖區(qū)頂部aun_red_buffer[i-50]=aun_red_buffer[i];//移動紅外傳感器數(shù)據(jù)到緩沖區(qū)頂部aun_ir_buffer[i-50]=aun_ir_buffer[i];}//讀取下一批50組樣本數(shù)據(jù),并計算LED亮度for(i=100;i<150;i++){//從MAX30102FIFO中讀取數(shù)據(jù)到紅外和紅光傳感器緩沖區(qū)maxim_max30102_read_fifo((aun_ir_buffer+i),(aun_red_buffer+i));//計算LED亮度if(aun_red_buffer[i]>aun_red_buffer[i-1])//比較當(dāng)前和前一組紅光傳感器數(shù)據(jù){//計算亮度下降un_brightness-=(aun_red_buffer[i]-aun_red_buffer[i-1])*MAX_BRIGHTNESS/(un_max-un_min);//保證亮度不會小于0if(un_brightness<0)un_brightness=0;}else{//計算亮度上升un_brightness+=(aun_red_buffer[i-1]-aun_red_buffer[i])*MAX_BRIGHTNESS/(un_max-un_min);//保證亮度不會大于最大亮度值if(un_brightness>MAX_BRIGHTNESS)un_brightness=MAX_BRIGHTNESS;}}5.2體溫采集DS18B20是三腳溫度傳感器,通過單總線通信傳輸采集到的體溫信息。體溫采集流程為單片機(jī)斷開數(shù)據(jù)線至少480uS,用15-60uS松開數(shù)據(jù)線,直到DS18B20收到信號。溫度傳感器DS18B20收到信號后斷開至少60-240uS的數(shù)據(jù)線,主機(jī)檢測到數(shù)據(jù)線發(fā)送ROM命令,主機(jī)須發(fā)送連接ROM命令到系統(tǒng)的DS18B20。SCM使用RAM來執(zhí)行DS18B20中的RAM操作,比如讀取和設(shè)置寄存器值。得到實(shí)際測量人體溫度后,如果超過設(shè)定閾值時蜂鳴器將會報警。如圖5-2為體溫采集流程。圖5-2體溫采集流程圖使能DS18B20使用的GPIO端口時鐘,然后配置GPIO引腳為推挽輸出模式,設(shè)置輸出速度為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的響應(yīng),如果超時則返回初始化失敗的狀態(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響應(yīng)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ù)時序產(chǎn)生時鐘信號,如代碼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ā)送開始轉(zhuǎn)換命令、讀取溫度值的原始數(shù)據(jù)并轉(zhuǎn)換為實(shí)際溫度值,最終返回,如代碼5-6所示。代碼5-6讀取溫度值floatReadTemperature(void){unsignedcharTPH;unsignedcharTPL;shorti16=0;floatf32=0;//初始化DS18B20并開始轉(zhuǎn)換溫度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ù)傳輸將電源和單片機(jī)連接供電,WIFI模塊進(jìn)行初始化,采集的體溫,心率和血氧飽和度數(shù)據(jù)經(jīng)過STM32單片機(jī)處理后,手機(jī)客戶端連接到ESP8266建立的熱點(diǎn)連接,成功連接后ESP8266實(shí)時傳輸體溫、心率和血氧飽和度數(shù)據(jù)到手機(jī)客戶端,手機(jī)客戶端即可查看檢測到的體溫、心率和血氧飽和度的數(shù)據(jù),WIFI數(shù)據(jù)傳輸流程如圖5-3所示。圖5-3數(shù)據(jù)傳輸流程圖初始化ESP8266,定義一個WIFI網(wǎng)絡(luò)的名稱yi和密碼12345678,用于創(chuàng)建WIFI熱點(diǎn),使手機(jī)能夠通過客戶端軟件連接到ESP8266WIFI模塊,并且通過WIFI將體溫,心率和血氧飽和度數(shù)據(jù)傳輸?shù)绞謾C(jī)客戶端,如代碼5-7所示。代碼5-7WIFI模塊voidESP8266_Init(void){uart1_Init(115200);//初始化串口1,波特率設(shè)置為115200ESP8266_Clear();//清空ESP8266緩沖區(qū)while(ESP8266_SendCmd("AT\r\n\r","OK",200))//發(fā)送指令并等待“OK”響應(yīng),最長等待時間為200毫秒delay_ms(500);//延時500毫秒while(ESP8266_SendCmd("AT+CWMODE=2\r\n","OK",200))delay_ms(500);while(ESP8266_SendCmd("AT+CWSAP=\"yi\",\"12345678\",5,3\r\n","OK",200))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ù)顯示LCD1602顯示屏啟動后,屏幕會顯示load字符提示等待初始化完成,等待幾秒顯示屏初始化完成后,顯示屏顯示心率,血氧飽和度和體溫三項數(shù)據(jù)。在軟件算法方面,通過MAX30102的心率、血氧飽和度模塊、DS18B20的溫度模塊向LCD顯示屏發(fā)送控制信號,WIFI模塊將數(shù)據(jù)無線傳輸?shù)绞謾C(jī)客戶端進(jìn)行實(shí)時監(jiān)控,顯示模塊工作流程如圖5-4所示。圖5-4顯示模塊流程圖LCD設(shè)置為命令模式,命令數(shù)據(jù)寫入LCD的數(shù)據(jù)總線,并通過使能腳告知LCD數(shù)據(jù)已準(zhǔn)備好,最后關(guān)閉使能,如代碼5-8所示。代碼5-8發(fā)送命令voidLCD_Write_Com(unsignedcharcom){LCD1602_RS=0;//選擇發(fā)送命令delay_us(1);LCD1602_RW=0;//設(shè)置為寫模式delay_us(1);LCD1602_EN=1;//使能LCDdelay_us(1);GPIO_Write(GPIOA,(GPIO_ReadOutputData(GPIOA)&0XFF00)+Dao_xu(com));//向引腳寫入反轉(zhuǎn)后的命令數(shù)據(jù)delay_us(100);LCD1602_EN=0;//關(guān)閉使能}LCD設(shè)置為數(shù)據(jù)模式,要發(fā)送的數(shù)據(jù)寫入LCD的數(shù)據(jù)總線,并通過使能腳告知LCD數(shù)據(jù)已準(zhǔn)備好,最后關(guān)閉使能,如代碼5-9所示。代碼5-9發(fā)送數(shù)據(jù)voidLCD_Write_Data(unsignedcharData){LCD1602_RS=1;//選擇發(fā)送數(shù)據(jù)delay_us(1);LCD1602_RW=0;//設(shè)置為寫模式delay_us(1); LCD1602_EN=1;//使能LCDdelay_us(1);GPIO_Write(GPIOA,(GPIO_ReadOutputData(GPIOA)&0XFF00)+Dao_xu(Data));//向引腳寫入反轉(zhuǎn)后的數(shù)據(jù)delay_us(100);LCD1602_EN=0;//關(guān)閉使能}根據(jù)參數(shù)確定顯示的行(y)和列(x),將單個字符或者字符串寫入LCD顯示屏,如代碼5-10所示。代碼5-10寫入字符voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s){if(y==0){LCD_Write_Com(0x80+x);//設(shè)置顯示位置在第一行}else{LCD_Write_Com(0xC0+x);//設(shè)置顯示位置在第二行}while(*s)//循環(huán)直到遇到字符串結(jié)束符{LCD_Write_Data(*s);//逐字符寫入顯示數(shù)據(jù)s++;//指針移動到下一個字符}}voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData){if(y==0){LCD_Write_Com(0x80+x);//設(shè)置顯示位置在第一行}else{LCD_Write_Com(0xC0+x);//設(shè)置顯示位置在第二行}LCD_Write_Data(Data);//寫入要顯示的字符}voidLCD_Clear(void){LCD_Write_Com(0x01);//發(fā)送清屏命令delay_ms(5);//延時等待清屏完成}初始化GPIO引腳為輸出模式,發(fā)送一系列初始化命令給LCD,包括設(shè)置為8位數(shù)據(jù)接口、顯示2行、關(guān)閉顯示、清屏、設(shè)置光標(biāo)移動等,如代碼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);//設(shè)置為8位數(shù)據(jù)接口,顯示2行,5x7點(diǎn)陣delay_ms(5);LCD_Write_Com(0x08);//關(guān)閉顯示delay_ms(5);LCD_Write_Com(0x01);//清屏delay_ms(5);LCD_Write_Com(0x06);//光標(biāo)移動設(shè)置delay_ms(5);LCD_Write_Com(0x0C);//開啟顯示,不顯示光標(biāo)delay_ms(5);}5.5客戶端軟件實(shí)現(xiàn)首先手機(jī)端運(yùn)行客戶端軟件,點(diǎn)擊連接按鈕。連接到STM32單片機(jī)的ESP8266數(shù)據(jù)傳輸模塊。當(dāng)連接成功后,手機(jī)客戶端等待接收STM32單片機(jī)發(fā)送的數(shù)據(jù)。接收到數(shù)據(jù)后,根據(jù)數(shù)據(jù)內(nèi)容更新界面顯示,同時可以發(fā)送控制命令到STM32單片機(jī),如修改閾值。客戶端軟件工作流程和軟件界面分別如圖5-5,圖5-6所示。圖5-5客戶端軟件流程圖圖5-6軟件界面打開軟件,主活動代碼會初始化界面和布局,軟件啟動時會請求所需的權(quán)限,如果未獲得位置權(quán)限,則將其添加到權(quán)限列表中,并請求權(quán)限。獲取位置權(quán)限后,繼續(xù)獲取手機(jī)系統(tǒng)的WIFI服務(wù)權(quán)限,并檢查WIFI是否啟用。如果WIFI未啟用,顯示打開WIFI失敗提示用戶。創(chuàng)建了一個新的線程,在這個線程中檢查WIFI是否已經(jīng)啟用,如果沒有,則嘗試啟用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();在用戶觸摸屏幕時檢查是否需要隱藏軟鍵盤。當(dāng)用戶點(diǎn)擊屏幕時,首先獲取當(dāng)前獲取焦點(diǎn)的控件。如果需要隱藏軟鍵盤,就會清除控件的焦點(diǎn),使光標(biāo)消失,并且隱藏軟鍵盤,如代碼5-13所示。代碼5-13檢查是否需要隱藏軟鍵盤publicbooleandispatchTouchEvent(MotionEventev){if(ev.getAction()==MotionEvent.ACTION_DOWN){Viewv=getCurrentFocus();if(isShouldHideKeyboard(v,ev)){v.clearFocus();//清除Edittext的焦點(diǎn)從而讓光標(biāo)消失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網(wǎng)絡(luò)。當(dāng)連接成功時,會彈出一個消息提示連接成功了,否則彈出連接失敗,如代碼5-14所示。代碼5-14WIFI連接提示//響應(yīng)startActivityForResult()返回的結(jié)果publicvoidonActivityResult(intrequestCode,intresultCode,Intentdata){if(requestCode==REQUEST_CONNECT_DEVICE&&resultCode==Activity.RESULT_OK){//連接結(jié)果,由DeviceListActivity設(shè)置返回//直接連接特定的WIFI網(wǎng)絡(luò)Stringssid="yi";Stringpassword="12345678";//連接WiFibooleanconnected=connectToWifi(ssid,password);//根據(jù)連接結(jié)果顯示提示信息Toast.makeText(this,connected?"連接WIFI成功!":"連接WIFI失??!",Toast.LENGTH_SHORT).show();}}//連接WIFI的方法privatebooleanconnectToWifi(Stringssid,Stringpassword){//設(shè)置WIFI配置信息WifiConfigurationwifiConfig=newWifiConfiguration();wifiConfig.SSID="\""+ssid+"\"";wifiConfig.preSharedKey="\""+password+"\"";//獲取WIFI管理器WifiManagerwifiManager=(WifiManager)getApplicationContext().getSystemService(Context.WIFI_SERVICE);//添加WIFI網(wǎng)絡(luò)配置,并獲取網(wǎng)絡(luò)IDintnetworkId=wifiManager.addNetwork(wifiConfig);//如果成功添加網(wǎng)絡(luò)配置if(networkId!=-1){//斷開當(dāng)前連接wifiManager.disconnect();//啟用指定網(wǎng)絡(luò)wifiManager.enableNetwork(networkId,true);//重新連接WIFI網(wǎng)絡(luò)returnwifiManager.reconnect();}returnfalse;}當(dāng)有新消息到達(dá)時,檢查消息內(nèi)容是否包含特定的標(biāo)記,這些標(biāo)記代表著不同的健康指標(biāo),比如心率、血氧飽和度、體溫。發(fā)現(xiàn)消息中包含了這些標(biāo)記,便從消息中提取相應(yīng)的數(shù)值,并將這些數(shù)值更新到客戶端界面上,以便用戶可以清楚地看到當(dāng)前的健康狀態(tài),讓用戶可以方便地實(shí)時監(jiān)測自己的健康指標(biāo),提升了用戶對健康狀況的感知和管理,如代碼5-15所示。代碼5-15數(shù)據(jù)展示Handlerhandler=newHandler(){publicvoidhandleMessage(Messagemsg){super.handleMessage(msg);processMessage(smsg);smsg="";//清空smsg,以便下一次接收數(shù)據(jù)時使用}privatevoidprocessMessage(Stringmessage){intintIndex1=message.indexOf("$hear:");if(intIndex1!=-1){setTextForTextView(R.id.textViewHeartrate,message,intIndex1);}intintIndex2=message.indexOf("$spo2:");if(intIndex2!=-1){setTextForTextView(R.id.textViewSpo2,message,intIndex2);}intintIndex3=message.indexOf("$temp:");if(intIndex3!=-1){setTextForTextView(R.id.textViewTemperature,message,intIndex3);}}privatevoidsetTextForTextView(inttextViewId,Stringmessage,intindex){Stringstr=message;TextViewtextView=findViewById(textViewId);textView.setText(str.substring(index+6,str.indexOf("#",index)));}};當(dāng)用戶點(diǎn)擊連接按鈕時,如果WIFI未開啟,則會提示用戶打開WIFI并嘗試打開WIFI。如果WIFI已經(jīng)可用且尚未連接設(shè)備,則會打開一個設(shè)備列表頁面進(jìn)行設(shè)備搜索。當(dāng)用戶點(diǎn)擊斷開連接按鈕時,如果當(dāng)前已經(jīng)建立了連接,則會關(guān)閉連接,停止數(shù)據(jù)傳輸,并彈出消息提示W(wǎng)IFI已斷開。當(dāng)用戶點(diǎn)擊退出按鈕時,會安全地關(guān)閉連接并退出應(yīng)用,以避免異常情況發(fā)生。這些按鈕的作用是控制與設(shè)備的連接狀態(tài),包括連接設(shè)備、斷開連接和安全退出應(yīng)用。這樣用戶就可以方便地管理與設(shè)備的通信,并保證在退出應(yīng)用時不會出現(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){//如果未連接設(shè)備,打開設(shè)備列表頁面進(jìn)行搜索startActivityForResult(newIntent(this,DeviceListActivity.class),REQUEST_CONNECT_DEVICE);}}publicvoidonDisconnectionClicked(Viewview){if(_socket!=null){//關(guān)閉連接try{Toast.makeText(this,"WIFI斷開",Toast.LENGTH_SHORT).show();bRun=false;//停止數(shù)據(jù)接收線程_socket.close();_socket=null;}catch(IOExceptione){}}}publicvoidonExitButtonClicked(Viewview){if(_socket!=null){//安全關(guān)閉連接try{bRun=false;//停止數(shù)據(jù)接收線程_socket.close();_socket=null;}catch(IOExceptione){}}finish();//退出應(yīng)用}當(dāng)用戶點(diǎn)擊發(fā)送調(diào)整閾值的指令時,會先檢查是否連接上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連接將閾值設(shè)置命令傳輸給STM32單片機(jī)。當(dāng)用戶點(diǎn)擊發(fā)送按鈕時,程序會從界面上獲取用戶輸入的各項數(shù)據(jù),并將其按照一定的格式打包成一個字節(jié)數(shù)組。接著,通過WIFI連接將命令發(fā)送給STM32單片機(jī)。STM32單片機(jī)收到數(shù)據(jù)后,可以根據(jù)這些數(shù)據(jù)進(jìn)行相應(yīng)的處理,比如根據(jù)用戶設(shè)置的范圍進(jìn)行健康狀態(tài)監(jiān)測或警報等,如代碼5-18所示。代碼5-18發(fā)送閾值設(shè)置//獲取心率最小值、最大值、體溫最小值、最大值和血氧最小值的輸入框文本視圖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);//獲取輸入框中的文本內(nèi)容并轉(zhuǎn)換為字符串finalStringstr1=edit0.getText().toString();finalStringstr2=edit1.getText().toString();finalStringstr3=edit2.getText().toString();finalStringstr4=edit3.getText().toString();finalStringstr5=edit4.getText().toString();//在新線程中執(zhí)行網(wǎng)絡(luò)操作,以避免阻塞UI線程newThread(newRunnable(){publicvoidrun(){//將數(shù)據(jù)格式化成字符串,并發(fā)送到服務(wù)器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硬件測試硬件測試首先要檢查溫度模塊、心率血氧模塊,數(shù)據(jù)傳輸模塊是否有故障,LCD顯示屏是否可以顯示完整,蜂鳴器是否可以正常響應(yīng),USB接口供電電壓是否滿足設(shè)計要求,PCB線路需要避免交叉,布線不僅要協(xié)調(diào),還要美觀,使整個系統(tǒng)設(shè)計清晰易懂。硬件測試如圖6-1所示,各功能模塊正常。圖6-1硬件測試圖6.2軟件測試使用Keil5編程軟件對整個系統(tǒng)的各個模塊進(jìn)行編譯,將溫度檢測程序、心率血氧檢測程序、顯示程序、無線傳輸程序、報警程序五大部分分開編寫,軟件調(diào)試出現(xiàn)代碼問題就便于查看和糾正,全部程序無誤就可以統(tǒng)一調(diào)試,最后還需該系統(tǒng)的局域網(wǎng)與無線傳輸模塊保持一致,手機(jī)端客戶端就能實(shí)時接收到采集的生命特征信號,確保軟件調(diào)試的可靠穩(wěn)定性,整個系統(tǒng)的數(shù)據(jù)讀取、傳輸和檢測各個功能都可以進(jìn)行。軟件編譯測試結(jié)果如圖6-2所示,軟件編譯成功無報錯。圖6-2軟件測試圖6.3測試結(jié)果系統(tǒng)軟硬件開發(fā)完成后,需要啟動軟件運(yùn)行,打開手機(jī)WIFI功能,將無線接入點(diǎn)連接到ESP8266數(shù)據(jù)傳輸模塊,然后將指尖放在MAX30102傳感器上進(jìn)行心率和血氧飽和度檢測,再用手握住DS18B20
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)藥制造中農(nóng)藥原料的微生物污染控制技術(shù)考核試卷
- 談判中的供應(yīng)鏈產(chǎn)品生命周期談判考核試卷
- 期末模擬試卷(含解析)-五年級數(shù)學(xué)下冊(蘇教版)
- 網(wǎng)紅營銷策略在藝術(shù)與文化推廣中的作用考核試卷
- 庭院石景與水景節(jié)能環(huán)保材料應(yīng)用考核試卷
- 期末考點(diǎn)突破:任務(wù)型閱讀20篇-外研版(三起)六年級英語下學(xué)期專項訓(xùn)練(含答案解析)
- 青海省西寧市2025年中考二模語文試題(含答案)
- 化學(xué)反應(yīng)速率 同步練習(xí)題-人教版高中化學(xué)選擇性必修1
- 汽車發(fā)動機(jī)模擬題及參考答案
- 餐(飲)具消毒及供應(yīng)、配送服務(wù)方案投標(biāo)文件
- 物業(yè)管理服務(wù)機(jī)構(gòu)設(shè)置及運(yùn)作流程
- 2024年-2025年全國環(huán)保產(chǎn)業(yè)職業(yè)技能競賽(工業(yè)廢水處理工)考試題庫
- 四環(huán)素類抗菌藥物兒科臨床應(yīng)用專家共識(2024年版)
- 心肺復(fù)蘇術(shù)課件2024新版
- 公司工程施工與監(jiān)管制度
- 2023-2024學(xué)年北京牛欄山一中高一分班考數(shù)學(xué)試題及答案
- 特立帕肽治療骨質(zhì)疏松性骨折中國專家共識(2024版)解讀
- 2024米面油采購合同范本
- DL∕T 2553-2022 電力接地系統(tǒng)土壤電阻率、接地阻抗和地表電位測量技術(shù)導(dǎo)則
- DL∕T 1344-2014 干擾性用戶接入電力系統(tǒng)技術(shù)規(guī)范
評論
0/150
提交評論