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
體溫檢測傳感器采用紅外測溫傳感器
運(yùn)動(dòng)計(jì)步功能采用MPU6050陀螺儀實(shí)現(xiàn)
OLED顯示屏采用0.96寸中景園電子的OLED顯示屏-SPI接口
心率傳感器:
MPU6050傳感器:
體溫測溫模塊
OLED顯示屏:
硬件效果圖:
工程源碼截圖:
項(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);
// }
}
-
mcu
+關(guān)注
關(guān)注
146文章
17317瀏覽量
352618 -
STM32
+關(guān)注
關(guān)注
2272文章
10923瀏覽量
357531 -
檢測設(shè)備
+關(guān)注
關(guān)注
0文章
638瀏覽量
16894
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論