那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32設(shè)計(jì)的健康檢測設(shè)備(測溫心率計(jì)步)

DS小龍哥-嵌入式技術(shù) ? 來源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2022-05-18 11:00 ? 次閱讀

1. 項(xiàng)目介紹

本文介紹的項(xiàng)目是基于STM32設(shè)計(jì)的健康檢測設(shè)備,支持體溫測量,心率檢測,支持運(yùn)動(dòng)計(jì)步(采用MPU6050陀螺儀實(shí)現(xiàn)),支持WIFI傳輸數(shù)據(jù)到手機(jī)APP打印顯示。

硬件環(huán)境介紹:

MCU采用STM32F103C8T6

心率傳感器采用PulseSensor

體溫檢測傳感器采用紅外測溫傳感器

運(yùn)動(dòng)計(jì)步功能采用MPU6050陀螺儀實(shí)現(xiàn)

OLED顯示屏采用0.96寸中景園電子的OLED顯示屏-SPI接口

編程軟件采用keil5

心率傳感器:

pYYBAGKEYWKAT0UIAAm9PvDra9o451.png

MPU6050傳感器:

poYBAGKEYWOAIVOdAAZXIfF17xw880.png

體溫測溫模塊

pYYBAGKEYWOAGtMqAAWZjg3m_Rk859.png

OLED顯示屏:

poYBAGKEYWOASQ6NAAUlai9dEjg796.png

硬件效果圖:

poYBAGKEYWSAQkKzAAZIonfjrTc602.pngpoYBAGKEYWWALeDwAAYleKezREk132.pngpYYBAGKEYWWALqP8AAW0G6mps-0124.pngpoYBAGKEYWaAeVqAAAbEDcqUABs287.png

工程源碼截圖:

pYYBAGKEYWeAdsfXAAU6Ww8Zqos083.png

項(xiàng)目源碼下載地址: https://download.csdn.net/download/xiaolong1126626497/63992839

視頻演示地址: https://live.csdn.net/v/182607

2. 項(xiàng)目源碼介紹

2.1 計(jì)步功能實(shí)現(xiàn)代碼

計(jì)步功能是通過MPU6050陀螺儀測量計(jì)算得到,下面貼出計(jì)步算法的核心實(shí)現(xiàn)代碼.

/*******************************************************************************
文件名:         stepAlgorithm.c
描述   :        計(jì)步算法
*******************************************************************************/
?
#include "stepAlgorithm.h"
#include "rtc.h"
#include "math.h"
#include "mpu6050.h"
?
#define TRUE 1   
#define FALSE 0
#define VALUE_NUM 4
?
?
sportsInfo_t userSportsInfo;
//存放三軸數(shù)據(jù)  
float oriValues[3] = {0};    
//用于存放計(jì)算閾值的波峰波谷差值  
float tempValue[VALUE_NUM] ={0};  
int tempCount = 0;  
//是否上升的標(biāo)志位  
u8 isDirectionUp = FALSE;  
//持續(xù)上升次數(shù)  
int continueUpCount = 0;  
//上一點(diǎn)的持續(xù)上升的次數(shù),為了記錄波峰的上升次數(shù)  
int continueUpFormerCount = 0;  
//上一點(diǎn)的狀態(tài),上升還是下降  
u8 lastStatus = FALSE;  
//波峰值  
float peakOfWave = 0;  
//波谷值  
float valleyOfWave = 0;  
//此次波峰的時(shí)間  
long timeOfThisPeak = 0;  
//上次波峰的時(shí)間  
long timeOfLastPeak = 0;  
//當(dāng)前的時(shí)間  
long timeOfNow = 0;  
//當(dāng)前傳感器的值  
float gravityNew = 0;  
//上次傳感器的值  
float gravityOld = 0;  
//動(dòng)態(tài)閾值需要?jiǎng)討B(tài)的數(shù)據(jù),這個(gè)值用于這些動(dòng)態(tài)數(shù)據(jù)的閾值  
float initialValue = (float) 1.3;  
//初始閾值  
float ThreadValue = (float) 2.0;
//三軸軸值
accValue_t accValue;
//行走信息:卡路里、里程、步數(shù)
static sportsInfo_t sportsInfo;
//計(jì)步緩存
static u8 stepTempCount =0;
?
/*******************************************************************************
* 函數(shù)名:onSensorChanged
* 功能描述: G-Sensor工作后會(huì)一直調(diào)用這個(gè)函數(shù)對(duì)三軸數(shù)據(jù)進(jìn)行平方和開根號(hào)的處理  
*                   調(diào)用DetectorNewStep檢測步子 
*                   
* 參數(shù)說明:  
*                 輸入:
*                       pAccValue:G-sensor的原始數(shù)據(jù)
*                       timeStamp_p:動(dòng)態(tài)時(shí)間戳
* 返回值說明:
* 修改記錄:
*******************************************************************************/
sportsInfo_t *onSensorChanged(accValue_t *pAccValue,timeStamp_t *timeStamp_p,personInfo_t * personInfo) 
{  
  accValue_t *p = pAccValue;
  personInfo_t *userInfo = personInfo;
  timeStamp_t *time_p = timeStamp_p;
  oriValues[0] = p->accX;
  oriValues[1] = p->accY;
  oriValues[2] = p->accZ;
  //對(duì)三軸數(shù)據(jù)進(jìn)行平方和開根號(hào)的處理 
  gravityNew = (float) sqrt(oriValues[0] * oriValues[0]+ oriValues[1] * oriValues[1] + oriValues[2] * oriValues[2]);  
  //檢測步子
  return DetectorNewStep(gravityNew,time_p,userInfo); 
}  
?
?
/*******************************************************************************
* 函數(shù)名:DetectorNewStep
* 功能描述: 
*         步伐更新:如果檢測到了波峰,并且符合時(shí)間差以及閾值的條件,則判定為1步       
*         閥值更新:符合時(shí)間差條件,波峰波谷差值大于initialValue,則將該差值納入閾值的計(jì)算中       
* 參數(shù)說明:  
輸入:
values:經(jīng)過處理的G-sensor數(shù)據(jù)
timeStamp_p:時(shí)間戳
* 返回值說明:
* 修改記錄:sportsInfo_t *onSensorChanged(accValue_t *pAccValue,timeStamp_t *timeStamp_p,personInfo_t * personInfo)
*******************************************************************************/
sportsInfo_t *DetectorNewStep(float values,timeStamp_t *timeStamp_p,personInfo_t * personInfo) 
{  
  static u32 time_old;
  personInfo_t *userInfo = personInfo;
  static u32 step_per_2_second;  //每兩秒所走的步數(shù)
  float step_lenth,walk_speed,walk_distance,Calories;//步長
  u32 time_now;
  timeStamp_t *time_p = timeStamp_p;
  if (gravityOld == 0) 
  {  
    gravityOld = values;  
  } 
  else 
  {  
    if (DetectorPeak(values, gravityOld))//檢測到波峰
    {  
      timeOfLastPeak = timeOfThisPeak;//更新上次波峰的時(shí)間  
      //將時(shí)間戳轉(zhuǎn)換為以毫秒ms為單位
      time_now = timeOfNow = ((time_p->hour*60+time_p->minute)*60+time_p->second)*1000+time_p->twentyMsCount*20; //獲取時(shí)間 ,并轉(zhuǎn)化為毫秒
      //如果檢測到了波峰,并且符合時(shí)間差以及閾值的條件,則判定為1步 
      if (  (timeOfNow - timeOfLastPeak >= 250 )//Jahol Fan 修改為300,防止輕微動(dòng)都也會(huì)檢測步子
          //&& (timeOfNow - timeOfLastPeak <= 2000)
          &&(peakOfWave - valleyOfWave >= ThreadValue)
            )
      {  
        timeOfThisPeak = timeOfNow; //更新此次波峰時(shí)間 
        
        
        stepTempCount++;//Jahol:加1為兩步
        step_per_2_second ++;
        //Jahol:這樣計(jì)算卡路里,不能濾除人為的誤操作,導(dǎo)致的結(jié)果是:里程和卡路里偏大
        if((time_now - time_old) >= 2000 )    //如果時(shí)間過了2秒
        {
?
          if( 1 == step_per_2_second )                 
          {
            step_lenth = userInfo->height/5;
          }
          else if( 2 == step_per_2_second )
          {
            step_lenth = userInfo->height/4;
          }
          else if( 3 == step_per_2_second )
          {
            step_lenth = userInfo->height/3;
          }
          else if( 4 == step_per_2_second )
          {
            step_lenth = userInfo->height/2;
          }
          else if(5 == step_per_2_second)             //Jahol:為了使計(jì)步準(zhǔn)確,設(shè)置上限值為5步,犧牲卡路里準(zhǔn)確性
          {
            step_lenth = userInfo->height/1.2f;
          }
          else if( 7 == step_per_2_second )
          {
            step_lenth = userInfo->height;
          }
          else if(step_per_2_second >= 8)               //      step_diff>8
          {
            step_lenth = userInfo->height*1.2f;
          }
          else 
          {
            step_lenth = 0;
          }
          walk_speed = step_per_2_second*step_lenth/2;   //速度 ,單位:米/秒
          walk_distance  = step_per_2_second*step_lenth; //行走距離,單位:米
          Calories = 4.5f*walk_speed*(userInfo->weight/2)/1800;  //Jahol:weight是以kg為單位
          sportsInfo.calories  += Calories;
          sportsInfo.distance  += walk_distance;        
          time_old = time_now;         //更新時(shí)間
          step_per_2_second = 0;
          
        }   
        else 
        {
          //do nothing
        }       
        /* 
        * 處理無效運(yùn)動(dòng): 
        * 1.連續(xù)記錄5才開始計(jì)步 
        * 2.例如記錄的步用戶停住超過3秒,則前面的記錄失效,下次從頭開始 
        * 3.連續(xù)4記錄了步用戶還在運(yùn)動(dòng),之前的數(shù)據(jù)才有效 
        * */                
        if ((stepTempCount< 5 )&&(timeOfNow - timeOfLastPeak >= 3000))          
        {
          stepTempCount = 0;
        }
        else if((stepTempCount>= 5)&&(timeOfNow - timeOfLastPeak <= 3000))
        {
          sportsInfo.stepCount += stepTempCount;          
          stepTempCount         = 0;                
        }
        else
        {
          //do nothing
        }
        
        
      }  
      //Jahol:更新閥值,問題:閥值不會(huì)一直變大,不能變小?
      if (timeOfNow - timeOfLastPeak >= 250  
          && (peakOfWave - valleyOfWave >= initialValue)) 
      {  
        timeOfThisPeak = timeOfNow;  
        ThreadValue = Peak_Valley_Thread(peakOfWave - valleyOfWave);//更新閥值  
      }  
    }  
  }  
  gravityOld = values;  
  return &sportsInfo;
}
?
/*******************************************************************************
* 函數(shù)名:DetectorPeak
* 功能描述: 
*檢測波峰 。以下四個(gè)條件判斷為波峰: 
*(1)目前點(diǎn)為下降的趨勢:isDirectionUp為FALSE 
*(2)之前的點(diǎn)為上升的趨勢:lastStatus為TRUE 
*(3)到波峰為止,持續(xù)上升大于等于2次
*(4)波峰值大于20 //Jahol:把這個(gè)值修改為15
*記錄波谷值 :
*(1)觀察波形圖,可以發(fā)現(xiàn)在出現(xiàn)步子的地方,波谷的下一個(gè)就是波峰,有比較明顯的特征以及差值 
*(2)所以要記錄每次的波谷值,為了和下次的波峰做對(duì)比     
* 參數(shù)說明:  
*       輸入:
*           newValue:最新的經(jīng)過處理的G-sensor數(shù)據(jù)
*           oldValue:前一個(gè)處理的G-sensor數(shù)據(jù)
* 返回值說明:
* 修改記錄:
*******************************************************************************/
u8 DetectorPeak(float newValue, float oldValue) 
{  
  lastStatus = isDirectionUp;  
  if (newValue >= oldValue) //采樣數(shù)據(jù)呈上升趨勢
  {  
    isDirectionUp = TRUE;  
    continueUpCount++;  
  }
  else                      //數(shù)據(jù)呈下降趨勢
  {  
    continueUpFormerCount = continueUpCount;  
    continueUpCount = 0;  
    isDirectionUp = FALSE;  
  }  
  
  if ((!isDirectionUp) && lastStatus  
      && (continueUpFormerCount >= 2 || oldValue >= 20))
    
  {  
    peakOfWave = oldValue;  
    return TRUE;  
  } 
  else if ((!lastStatus) && isDirectionUp) 
  {  
    valleyOfWave = oldValue;  
    return FALSE;  
  }
  else
  {  
    return FALSE;  
  }  
}
/*******************************************************************************
* 函數(shù)名:Peak_Valley_Thread
* 功能描述:  
*                   閾值的計(jì)算 
*                       1.通過波峰波谷的差值計(jì)算閾值 
*                       2.記錄4個(gè)值,存入tempValue[]數(shù)組中 
*                       3.在將數(shù)組傳入函數(shù)averageValue中計(jì)算閾值 
*                   
* 參數(shù)說明: 
* 返回值說明:
* 修改記錄:
*******************************************************************************/
float Peak_Valley_Thread(float value) 
{  
  float tempThread = ThreadValue; 
  u8 i = 0;
  if (tempCount < VALUE_NUM)
  {  
    tempValue[tempCount] = value;  
    tempCount++;  
  } 
  else 
  {  
    tempThread = averageValue(tempValue, VALUE_NUM);//計(jì)算閥值  
    for ( i = 1;i < VALUE_NUM;i++)//線性移位更新
    {  
      tempValue[i - 1] = tempValue[i];  
    }  
    tempValue[VALUE_NUM - 1] = value;  
  }  
  return tempThread;  
  
}
?
/*******************************************************************************
* 函數(shù)名:averageValue
* 功能描述:  
*        梯度化閾值 
*           1.計(jì)算數(shù)組的均值 
*           2.通過均值將閾值梯度化在一個(gè)范圍里 
*                   
* 參數(shù)說明: 
* 返回值說明:
* 修改記錄:
*******************************************************************************/
float averageValue(float value[], int n)
{  
  float ave = 0;  
  u8 i =0;
  for ( i = 0; i < n; i++)
  {  
    ave += value[i];//求和  
  }  
  ave = ave / VALUE_NUM;//求平均值  
  if (ave >= 8)  
    ave = (float) 4.3;  //????
  else if (ave >= 7 && ave < 8)  
    ave = (float) 3.3;  
  else if (ave >= 4 && ave < 7)  
    ave = (float) 2.3;  
  else if (ave >= 3 && ave < 4)  
    ave = (float) 2.0;  
  else
  {  
    ave = (float) 1.3;  
  }  
  return ave;  
}
?
?
personInfo_t user_info;
u8 WatchInfo_init(void)
{
  WatchInfo_setUserInfo(170,134); //設(shè)置身高、體重用于計(jì)算卡路里消耗
    return 0;  //初始化成功返回0
}
/**********************************************************************************************************
 * 函數(shù)名:        WatchInfo_setUserInfo
 * 功能描述:      設(shè)置手表使用者的個(gè)人信息
 * 參數(shù)說明:  
 * 返回值說明:
 * 修改記錄:
**********************************************************************************************************/
u8 WatchInfo_setUserInfo(u8 height,u8 weight)
{
    user_info.height = ((float)height)/100;
    user_info.weight = ((float)weight)/2;
  return 0;//成功 0
}
?
?
personInfo_t * WatchInfo_getUserInfo(u8 *error)
{
    u8 err;
    err = 0;//0表示獲取成功
    error = &err;
  return &user_info;
}

2.2 ESP8266 WIFI模塊

設(shè)備測量的數(shù)據(jù)最終通過WIFI傳遞給手機(jī)APP顯示,下面列出ESP8266的核心代碼。

#include "esp8266.h"
extern u8  USART3_RX_BUF[USART3_MAX_RECV_LEN];      //接收緩沖,最大USART3_MAX_RECV_LEN字節(jié)
extern u8  USART3_TX_BUF[USART3_MAX_SEND_LEN];      //發(fā)送緩沖,最大USART3_MAX_SEND_LEN字節(jié)
extern vu16 USART3_RX_STA;                                              //接收數(shù)據(jù)狀態(tài)
?
/// 
//用戶配置區(qū)
?
//連接端口號(hào):8086,可自行修改為其他端口.
const u8 portnum[]="8089";       
?
//WIFI STA模式,設(shè)置要去連接的路由器無線參數(shù),請(qǐng)根據(jù)你自己的路由器設(shè)置,自行修改.
const u8 wifista_ssid[]="wbyq1";            //路由器SSID號(hào)
const u8 wifista_encryption[]="wpa2_aes";   //wpa/wpa2 aes加密方式
const u8 wifista_password[]="123456789";    //連接密碼
?
//WIFI AP模式,模塊對(duì)外的無線參數(shù),可自行修改.
const u8 wifiap_ssid[]="Cortex_M3";           //對(duì)外SSID號(hào)
const u8 wifiap_encryption[]="wpawpa2_aes"; //wpa/wpa2 aes加密方式
const u8 wifiap_password[]="12345678";        //連接密碼 
?
?
/*
函數(shù)功能:向ESP82668266發(fā)送命令
函數(shù)參數(shù):
                cmd:發(fā)送的命令字符串
                ack:期待的應(yīng)答結(jié)果,如果為空,則表示不需要等待應(yīng)答
                waittime:等待時(shí)間(單位:10ms)
返 回 值:
                 0,發(fā)送成功(得到了期待的應(yīng)答結(jié)果)
         1,發(fā)送失敗
*/
u8 ESP8266_SendCmd(u8 *cmd,u8 *ack,u16 waittime)
{
    u8 res=0; 
    USART3_RX_STA=0;
    UsartStringSend(USART3,cmd);//發(fā)送命令
    if(ack&&waittime)       //需要等待應(yīng)答
    {
        while(--waittime)   //等待倒計(jì)時(shí)
        {
            DelayMs(10);
            if(USART3_RX_STA&0X8000)//接收到期待的應(yīng)答結(jié)果
            {
                if(ESP8266_CheckCmd(ack))
                {
                    res=0;
                    //printf("cmd->ack:%s,%s\r\n",cmd,(u8*)ack);
                    break;//得到有效數(shù)據(jù) 
                }
                USART3_RX_STA=0;
            } 
        }
        if(waittime==0)res=1; 
    }
    return res;
}
?
?
/*
函數(shù)功能:ESP8266發(fā)送命令后,檢測接收到的應(yīng)答
函數(shù)參數(shù):str:期待的應(yīng)答結(jié)果
返 回 值:0,沒有得到期待的應(yīng)答結(jié)果
                 其他,期待應(yīng)答結(jié)果的位置(str的位置)
*/
u8* ESP8266_CheckCmd(u8 *str)
{
    char *strx=0;
    if(USART3_RX_STA&0X8000)  //接收到一次數(shù)據(jù)了
    { 
        USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加結(jié)束符
        strx=strstr((const char*)USART3_RX_BUF,(const char*)str); //查找是否應(yīng)答成功
        printf("RX=%s",USART3_RX_BUF);
    }
    return (u8*)strx;
}
?
/*
函數(shù)功能:向ESP8266發(fā)送指定數(shù)據(jù)
函數(shù)參數(shù):
                data:發(fā)送的數(shù)據(jù)(不需要添加回車)
                ack:期待的應(yīng)答結(jié)果,如果為空,則表示不需要等待應(yīng)答
                waittime:等待時(shí)間(單位:10ms)
返 回 值:0,發(fā)送成功(得到了期待的應(yīng)答結(jié)果)luojian
*/
u8 ESP8266_SendData(u8 *data,u8 *ack,u16 waittime)
{
    u8 res=0; 
    USART3_RX_STA=0;
    UsartStringSend(USART3,data);//發(fā)送數(shù)據(jù)
    if(ack&&waittime)       //需要等待應(yīng)答
    {
        while(--waittime)   //等待倒計(jì)時(shí)
        {
            DelayMs(10);
            if(USART3_RX_STA&0X8000)//接收到期待的應(yīng)答結(jié)果
            {
                if(ESP8266_CheckCmd(ack))break;//得到有效數(shù)據(jù) 
                USART3_RX_STA=0;
            } 
        }
        if(waittime==0)res=1; 
    }
    return res;
}
    
    
?
/*
函數(shù)功能:ESP8266退出透傳模式
返 回 值:0,退出成功;
         1,退出失敗
*/
u8 ESP8266_QuitTrans(void)
{
    while((USART3->SR&0X40)==0);    //等待發(fā)送空
    USART3->DR='+';      
    DelayMs(15);                    //大于串口組幀時(shí)間(10ms)
    while((USART3->SR&0X40)==0);    //等待發(fā)送空
    USART3->DR='+';      
    DelayMs(15);                    //大于串口組幀時(shí)間(10ms)
    while((USART3->SR&0X40)==0);    //等待發(fā)送空
    USART3->DR='+';      
    DelayMs(500);                   //等待500ms
    return ESP8266_SendCmd("AT","OK",20);//退出透傳判斷.
}
?
?
/*
函數(shù)功能:獲取ESP82668266模塊的AP+STA連接狀態(tài)
返 回 值:0,未連接;1,連接成功
*/
u8 ESP8266_ApStaCheck(void)
{
    if(ESP8266_QuitTrans())return 0;              //退出透傳 
    ESP8266_SendCmd("AT+CIPSTATUS",":",50); //發(fā)送AT+CIPSTATUS指令,查詢連接狀態(tài)
    if(ESP8266_CheckCmd("+CIPSTATUS:0")&&
         ESP8266_CheckCmd("+CIPSTATUS:1")&&
         ESP8266_CheckCmd("+CIPSTATUS:2")&&
         ESP8266_CheckCmd("+CIPSTATUS:4"))
        return 0;
    else return 1;
}
?
?
/*
函數(shù)功能:獲取ESP8266模塊的連接狀態(tài)
返 回 值:0,未連接;1,連接成功.
*/
u8 ESP8266_ConstaCheck(void)
{
    u8 *p;
    u8 res;
    if(ESP8266_QuitTrans())return 0;              //退出透傳 
    ESP8266_SendCmd("AT+CIPSTATUS",":",50); //發(fā)送AT+CIPSTATUS指令,查詢連接狀態(tài)
    p=ESP8266_CheckCmd("+CIPSTATUS:"); 
    res=*p;                                                                 //得到連接狀態(tài)    
    return res;
}
?
/*
函數(shù)功能:獲取ip地址
函數(shù)參數(shù):ipbuf:ip地址輸出緩存區(qū)
*/
void ESP8266_GetWanip(u8* ipbuf)
{
      u8 *p,*p1;
        if(ESP8266_SendCmd("AT+CIFSR\r\n","OK",50))//獲取WAN IP地址失敗
        {
            ipbuf[0]=0;
            return;
        }       
        p=ESP8266_CheckCmd(""");
        p1=(u8*)strstr((const char*)(p+1),""");
        *p1=0;
        sprintf((char*)ipbuf,"%s",p+1); 
}
?
/*
函數(shù)功能:將收到的AT指令應(yīng)答數(shù)據(jù)返回給電腦串口
參    數(shù):mode:0,不清零USART3_RX_STA;
                             1,清零USART3_RX_STA;
*/
void ESP8266_AtResponse(u8 mode)
{
    if(USART3_RX_STA&0X8000)        //接收到一次數(shù)據(jù)了
    { 
        USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加結(jié)束符
        printf("%s",USART3_RX_BUF); //發(fā)送到串口
        if(mode)USART3_RX_STA=0;
    } 
}
?
?
/*
函數(shù)功能:ESP8266 AP模式+TCP服務(wù)器模式測試
*/
void ESP8266_APorServer(void)
{
    u8 p[100],key;
    u8 ipbuf[20];
//  u32 rlen=0; //接收長度
//  u32 constate,t=0;
    while(ESP8266_SendCmd("AT\r\n","OK",20))//檢查WIFI模塊是否在線
    {
        ESP8266_QuitTrans();//退出透傳
        ESP8266_SendCmd("AT+CIPMODE=0\r\n","OK",200);  //關(guān)閉透傳模式 
        printf("未檢測到模塊,正在嘗試連接模塊...\r\n");
        DelayMs(800);
    }
    printf("ESP8266模塊檢測OK!\r\n");
    
    while(ESP8266_SendCmd("ATE0\r\n","OK",20)); //關(guān)閉回顯
    
    printf("請(qǐng)用設(shè)備連接WIFI熱點(diǎn):%s,%s,%ss\r\n",(u8*)wifiap_ssid,(u8*)wifiap_encryption,(u8*)wifiap_password);
    
    /*1. 設(shè)置WIFI AP模式 */
    ESP8266_SendCmd("AT+CWMODE=2\r\n","OK",50);
    
    /*2. 重啟模塊 */
    ESP8266_SendCmd("AT+RST\r\n","OK",20);
    
    /*3. 延時(shí)3S等待重啟成功*/
    DelayMs(1000);            
    DelayMs(1000);
    DelayMs(1000);
    
    /*5. 配置模塊AP模式無線參數(shù)*/
    sprintf((char*)p,"AT+CWSAP="%s","%s",1,4\r\n",wifiap_ssid,wifiap_password); 
    ESP8266_SendCmd(p,"OK",1000);
    
    /*4. 設(shè)置多連接模式:0單連接,1多連接(服務(wù)器模式必須開啟)*/
    ESP8266_SendCmd("AT+CIPMUX=1\r\n","OK",20); 
    
    /*5. 開啟Server模式(0,關(guān)閉;1,打開),端口號(hào)為portnum */
    sprintf((char*)p,"AT+CIPSERVER=1,%s\r\n",(u8*)portnum);
    ESP8266_SendCmd(p,"OK",50);
    
    /*6. 獲取當(dāng)前模塊的IP*/
    ESP8266_GetWanip(ipbuf);//
    printf("IP地址:%s 端口:%s",ipbuf,(u8*)portnum);
  
    USART3_RX_STA=0; //清空串口的接收標(biāo)志位
//  while(1)
//  {
//      key=GetKeyVal(1);//退出測試
//      if(key==1)
//      { 
//      printf("退出測試!\r\n");            
//          ESP8266_QuitTrans();    //退出透傳
//          ESP8266_SendCmd("AT+CIPMODE=0","OK",20);   //關(guān)閉透傳模式
//          break;                                               
//      }
//      else if(key==2) //發(fā)送數(shù)據(jù) 
//      {
//              ESP8266_SendCmd("AT+CIPSEND=0,12\r\n","OK",200); //設(shè)置發(fā)送數(shù)據(jù)長度為12個(gè)
//              ESP8266_SendData("ESP8266測試!","OK",100);       //發(fā)送指定長度的數(shù)據(jù)
//              DelayMs(200);
//      }
//      t++;
//      DelayMs(10);
//      if(USART3_RX_STA&0X8000)          //接收到一次數(shù)據(jù)了
//      { 
//          rlen=USART3_RX_STA&0X7FFF;  //得到本次接收到的數(shù)據(jù)長度
//          USART3_RX_BUF[rlen]=0;        //添加結(jié)束符 
//          printf("接收的數(shù)據(jù): rlen=%d,%s",rlen,USART3_RX_BUF); //發(fā)送到串口   
//          USART3_RX_STA=0;
//          if(constate!=3)t=1000;        //狀態(tài)為還未連接,立即更新連接狀態(tài)
//          else t=0;                   //狀態(tài)為已經(jīng)連接了,10秒后再檢查
//      }
//      if(t==1000)//連續(xù)10秒鐘沒有收到任何數(shù)據(jù),檢查連接是不是還存在.
//      {
            constate=ESP8266_ConstaCheck();//得到連接狀態(tài)
            if(!constate)printf("連接失敗!\r\n");
//          t=0;
//      }
//      if((t%20)==0)LED2=!LED2;
//      ESP8266_AtResponse(1);
//  }
}   
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17317

    瀏覽量

    352618
  • STM32
    +關(guān)注

    關(guān)注

    2272

    文章

    10923

    瀏覽量

    357531
  • 檢測設(shè)備
    +關(guān)注

    關(guān)注

    0

    文章

    638

    瀏覽量

    16894
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于低功耗藍(lán)牙的心率帶方案說明

    `隨著藍(lán)牙技術(shù)聯(lián)盟(Bluetooth SIG)宣布支持藍(lán)牙4.0版本的藍(lán)牙體溫計(jì)心率檢測器產(chǎn)品的面市,由此開啟了醫(yī)療和健身領(lǐng)域無線監(jiān)測設(shè)備的新紀(jì)元。本產(chǎn)品集成
    發(fā)表于 07-20 08:40

    具有紅外測溫的便攜式心率計(jì)

    方案概述  方案概述:具有紅外測溫功能的便攜式心率計(jì),主要應(yīng)用為人體服務(wù)的,能夠方便快捷地測量人體的溫度,也能夠測量人體不同狀態(tài)下的心率。使人們能夠隨時(shí)隨地的知道自己的
    發(fā)表于 11-14 19:25

    活動(dòng)與健康監(jiān)測器解決方案

    存在的形式。同時(shí),可穿戴設(shè)備健康監(jiān)測功能也從起初的計(jì)、血壓監(jiān)測擴(kuò)展到血糖、心率、脈搏、體重計(jì)算、助聽器等諸多范疇,眾多知名品牌商也紛紛推
    發(fā)表于 04-17 15:28

    心率檢測儀的設(shè)計(jì)與實(shí)現(xiàn):stm32視頻教程分享 精選資料分享

    心率檢測儀的設(shè)計(jì)與實(shí)現(xiàn):stm32視頻教程分享 STM32系列是基于專為要求高性能、低成本、低功耗的嵌入式應(yīng)用專門設(shè)計(jì)的ARM Cortex-M3內(nèi)核。 本項(xiàng)目主要講述了通過心律傳感器
    發(fā)表于 08-03 07:24

    怎樣去設(shè)計(jì)基于嵌入式stm32心率檢測

    資源分享:嵌入式stm32項(xiàng)目開發(fā) 心率檢測儀的設(shè)計(jì)與實(shí)現(xiàn)本課程主要基于心率檢測儀的設(shè)計(jì)與實(shí)現(xiàn)講解STM
    發(fā)表于 08-03 06:11

    基于心率檢測儀的設(shè)計(jì)與實(shí)現(xiàn)講解STM32開發(fā)技術(shù)

    視頻教程免費(fèi)分享:嵌入式stm32項(xiàng)目開發(fā)之心率檢測儀的設(shè)計(jì)與實(shí)現(xiàn)本課程主要基于心率檢測儀的設(shè)計(jì)與實(shí)現(xiàn)講解
    發(fā)表于 08-03 06:44

    如何去實(shí)現(xiàn)一種基于STM32的體溫心率數(shù)采集系統(tǒng)設(shè)計(jì)

    百度網(wǎng)盤下載地址(943):點(diǎn)擊下載實(shí)現(xiàn)功能如下:1) 通過重力加速度傳感器ADXL345檢測人的狀態(tài),計(jì)算出走路數(shù)、走路距離和平均速度。2)通過心率傳感器實(shí)時(shí)檢測
    發(fā)表于 02-21 07:38

    智能手環(huán)軟硬件方案(心率+計(jì)+睡眠)

    本方案運(yùn)用藍(lán)牙傳輸技術(shù)結(jié)合自主研發(fā)的抗干擾計(jì)算法、自動(dòng)識(shí)別睡眠算法、24小時(shí)實(shí)時(shí)動(dòng)態(tài)心率監(jiān)測算法,具有有心率監(jiān)測、計(jì)
    發(fā)表于 12-23 18:20 ?636次下載

    基于stm32心率檢測設(shè)計(jì)

    實(shí)現(xiàn)心率的實(shí)時(shí)檢測,并在led屏上顯示,同時(shí)使用一個(gè)led燈模擬心率跳動(dòng)。
    發(fā)表于 04-23 10:28 ?139次下載

    IP67心率計(jì)防水檢測操作的具體流程是怎樣的

    。 一般情況下心率計(jì)如果遇水(雨雪天氣或者濺起來的水)或者身體流汗過多,心率計(jì)會(huì)不起作用或者顯示的心率不準(zhǔn)確,因此大多心率計(jì)會(huì)做防水處理,然后可以通過
    發(fā)表于 01-06 12:04 ?1234次閱讀

    基于STM32實(shí)現(xiàn)的體溫_心率_數(shù)采集系統(tǒng)設(shè)計(jì)

    百度網(wǎng)盤下載地址(943):點(diǎn)擊下載實(shí)現(xiàn)功能如下:1) 通過重力加速度傳感器ADXL345檢測人的狀態(tài),計(jì)算出走路數(shù)、走路距離和平均速度。2)通過心率傳感器實(shí)時(shí)檢測
    發(fā)表于 12-24 19:35 ?24次下載
    基于<b class='flag-5'>STM32</b>實(shí)現(xiàn)的體溫_<b class='flag-5'>心率</b>_<b class='flag-5'>步</b>數(shù)采集系統(tǒng)設(shè)計(jì)

    測溫掃陜西健康設(shè)備哪家好?健康碼識(shí)別終端設(shè)備怎么選擇?

    控的總體要求,就目前而言公共場所實(shí)行的驗(yàn)碼測溫、戴口罩、防聚集等防疫措施,這一系列防疫查驗(yàn)工作其實(shí)都可以通過測溫掃陜西健康設(shè)備來完成的。測溫
    的頭像 發(fā)表于 12-23 17:54 ?1212次閱讀
    <b class='flag-5'>測溫</b>掃陜西<b class='flag-5'>健康</b>碼<b class='flag-5'>設(shè)備</b>哪家好?<b class='flag-5'>健康</b>碼識(shí)別終端<b class='flag-5'>設(shè)備</b>怎么選擇?

    基于STM32單片機(jī)的智能手環(huán)系統(tǒng)設(shè)計(jì)

    本次智能手環(huán)的設(shè)計(jì)使用STM32單片機(jī)作為控制中心,通過心率傳感器測量心率,通過DS18B20測溫,通過振動(dòng)傳感器計(jì)
    的頭像 發(fā)表于 07-25 11:02 ?3287次閱讀
    基于<b class='flag-5'>STM32</b>單片機(jī)的智能手環(huán)系統(tǒng)設(shè)計(jì)

    求一種基于STM32單片機(jī)的健康檢測系統(tǒng)設(shè)計(jì)方案

    本次健康檢測系統(tǒng)的設(shè)計(jì)使用STM32單片機(jī)作為控制中心,通過DS18B20C測溫,通過心率模塊測量心率
    發(fā)表于 08-27 10:31 ?955次閱讀
    求一種基于<b class='flag-5'>STM32</b>單片機(jī)的<b class='flag-5'>健康</b><b class='flag-5'>檢測</b>系統(tǒng)設(shè)計(jì)方案

    基于STM32單片機(jī)的檢測手環(huán)系統(tǒng)設(shè)計(jì)

    本次檢測手環(huán)系統(tǒng)的設(shè)計(jì)使用STM32單片機(jī)作為控制中心,通過DHP11溫濕度傳感器檢測溫度,通過心率傳感器檢測
    的頭像 發(fā)表于 08-28 09:39 ?958次閱讀
    基于<b class='flag-5'>STM32</b>單片機(jī)的<b class='flag-5'>檢測</b>手環(huán)系統(tǒng)設(shè)計(jì)
    柳河县| 百家乐咋个玩的| 威尼斯人娱乐网站| 百家乐官网论坛代理合作| 百家乐赌法博彩正网| 电子百家乐| 真人百家乐玩法| zaixian百家乐| 百家乐投注很不错| 延庆县| 百家乐系列抢庄龙| 百家乐官网胜率被控制| 百家乐博弈指数| 网上赌百家乐官网被抓应该怎么处理| 做生意门朝哪个方向好| 金赞| 百家乐开户代理| 太和县| 励骏会百家乐的玩法技巧和规则 | 大发888充值网站| 嘉年华百家乐官网的玩法技巧和规则 | 免费百家乐官网过滤软件| 新葡京娱乐城开户| 金盈会百家乐现金网| 华人博彩论坛| 网上百家乐有人赢过吗| bet365体育开户| 微信百家乐官网群资源| 百博亚洲| 百家乐娱乐场开户注册| 尊龙百家乐官网娱乐网| 元游棋牌游戏大厅下载| 真人百家乐软件博彩吧| 百家乐官网视频游戏帐号| 百家乐欧洲赔率| 百家乐官网旺门打法| 博彩技巧| 大都会百家乐的玩法技巧和规则 | 白金娱乐城| 百家乐官网是娱乐场| 百家乐官网澳门百家乐官网|