国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【STM32訓(xùn)練—WiFi模塊】第二篇、STM32驅(qū)動(dòng)ESP8266WiFi模塊獲取天氣

這篇具有很好參考價(jià)值的文章主要介紹了【STM32訓(xùn)練—WiFi模塊】第二篇、STM32驅(qū)動(dòng)ESP8266WiFi模塊獲取天氣。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

第一部分、前言

1、獲取心知天氣API接口

2、硬件準(zhǔn)備

第二部分、電腦串口助手調(diào)試WIFI模塊獲取天氣

1、ESP8266獲取天氣的流程

2、具體步驟

第三部分、STM32驅(qū)動(dòng)ESP8266模塊獲取天氣數(shù)據(jù)

1、天氣數(shù)據(jù)的解析

1.1、什么函數(shù)來(lái)解析天氣數(shù)據(jù)?

2.1、解析后的數(shù)據(jù)如何使用?

?2、相關(guān)代碼

2.1、main.c文件

2.2、esp8266.c文件

第四部分、總結(jié)

1、效果展示

2、完整的工程

3、補(bǔ)充


第一部分、前言

? ? ? ? 這篇博客拖了很久很久,本來(lái)是打算和前面一篇一起發(fā)出來(lái)的,但是那段時(shí)間因?yàn)橐恍┦虑榈R了,這篇博客寫了一半,剩下的一直都沒有寫,其次就是人也有點(diǎn)懶,也不太想動(dòng)????。

? ? ? ? 這幾天考試周來(lái)了,復(fù)習(xí)又不想復(fù)習(xí),不如把這篇內(nèi)容更新完整,這篇更新完之后,STM32專欄應(yīng)該不會(huì)再更新了。

? ? ? ? 然后,后面我打算出一期C語(yǔ)言的學(xué)習(xí)筆記專欄,再后面就是FPGA的學(xué)習(xí)筆記專欄。想是這么想的,不知道能不能做好,哈哈??。

1、獲取心知天氣API接口

? ? ? ? 這里還是希望大家先去看我的第一篇博客:【STM32訓(xùn)練—WiFi模塊】第一篇、STM32驅(qū)動(dòng)ESP8266WiFi模塊獲取網(wǎng)絡(luò)時(shí)間通過(guò)這篇博客你會(huì)明白WIFI模塊獲取網(wǎng)絡(luò)流程是什么樣子的,搞懂了這個(gè),你會(huì)發(fā)現(xiàn)獲取天氣和獲取時(shí)間的步驟完全一樣,代碼也沒有什么大的變化。

? ? ? ? 接著再來(lái)說(shuō)一下心知天氣,上一篇文章提到時(shí)間的接口是由蘇寧后臺(tái)提供的“quan.suning.com/getSysTime.do”,那么這里想獲取天氣,那么也需要一個(gè)API的接口,這里的API接口由心知天氣給我們提供。

????????因此需要注冊(cè)一個(gè)心知天氣,獲取自己的密鑰。關(guān)于注冊(cè)的過(guò)程可以參考心知天氣提供的文檔:注冊(cè)與登陸 | 心知天氣文檔 (seniverse.com)

【STM32訓(xùn)練—WiFi模塊】第二篇、STM32驅(qū)動(dòng)ESP8266WiFi模塊獲取天氣

????????注冊(cè)完成后,如何獲取屬于自己的API接口呢,參考文檔如下:查看/修改你的API密鑰 (yuque.com)

????????這是我的API接口,點(diǎn)進(jìn)去之后就會(huì)看到目前杭州的天氣數(shù)據(jù):https://api.seniverse.com/v3/weather/now.json?key=SwLQ3i0Q5TNa6NSKT&location=hangzhou&language=zh-Hans&unit=c

【STM32訓(xùn)練—WiFi模塊】第二篇、STM32驅(qū)動(dòng)ESP8266WiFi模塊獲取天氣

? ? ? ? 點(diǎn)擊上面的鏈接,就會(huì)獲取到天氣數(shù)據(jù),接下來(lái)的步驟就和前面獲取時(shí)間一樣,主要區(qū)別就是將時(shí)間的API接口換成剛剛注冊(cè)得到的心知天氣的API接口即可,是不是發(fā)現(xiàn)原來(lái)也就這么回事。

【STM32訓(xùn)練—WiFi模塊】第二篇、STM32驅(qū)動(dòng)ESP8266WiFi模塊獲取天氣

2、硬件準(zhǔn)備

?????????STM32選用核心板F103C8T6,然后再加一個(gè)ESP8266 WiFi模塊(任何型號(hào)應(yīng)該都可以,我這次用的ESP-01s),最后需要一個(gè)USB-TTL模塊用來(lái)打印串口數(shù)據(jù)。

? ? ? ? 需要注意的是:我的這個(gè)ESP-01S,有一個(gè)EN使能端,必須要給高電平才能用,上一篇博客用的那個(gè)WIFI模塊沒有EN使能端。所以希望大家注意自己的模塊。

【STM32訓(xùn)練—WiFi模塊】第二篇、STM32驅(qū)動(dòng)ESP8266WiFi模塊獲取天氣

第二部分、電腦串口助手調(diào)試WIFI模塊獲取天氣

1、ESP8266獲取天氣的流程

? ? ? ? 流程和獲取時(shí)間的流程大致一樣,只不過(guò)這里獲取的為天氣數(shù)據(jù)。

【STM32訓(xùn)練—WiFi模塊】第二篇、STM32驅(qū)動(dòng)ESP8266WiFi模塊獲取天氣

2、具體步驟

?第一步、AT指令集

0:AT
1:AT+RST
2:AT+CWMODE=1
3:AT+CIPMUX=0
4:AT+CWJAP="你的WiFi名稱","你的WiFi密碼"
5:AT+CIPMODE=1
6:AT+CIPSTART="TCP","api.seniverse.com",80
7:AT+CIPSEND
8:GET https://api.seniverse.com/v3/weather/now.json?key=SwLQ3i0Q5TNa6NSKT&location=hangzhou&language=en&unit=c
9:+++

? ? ? ? 注意:所有串口步驟同前一篇文章,這里直接有區(qū)別的步驟為第八步,因此這里直接跳轉(zhuǎn)到第八步

?第八步、連接目標(biāo)的服務(wù)器,TCP是傳輸協(xié)議,api.seniverse.com是心知天氣服務(wù)器的IP地址,80是服務(wù)器端口。

【STM32訓(xùn)練—WiFi模塊】第二篇、STM32驅(qū)動(dòng)ESP8266WiFi模塊獲取天氣

?第十步、第九步和前文一樣,接著再發(fā)送獲取數(shù)據(jù)的請(qǐng)求,得到天氣數(shù)據(jù)

【STM32訓(xùn)練—WiFi模塊】第二篇、STM32驅(qū)動(dòng)ESP8266WiFi模塊獲取天氣

?第十一步、關(guān)于退出透?jìng)鞯姆绞揭埠颓懊娌┛屯耆粯?,這里就不再展示,所以一定要看第一篇文章,那個(gè)文章介紹的太詳細(xì)了。

第三部分、STM32驅(qū)動(dòng)ESP8266模塊獲取天氣數(shù)據(jù)

1、天氣數(shù)據(jù)的解析

? ? ? ? 這里天氣的解析我調(diào)用了cJSON的庫(kù),你不用管這個(gè)庫(kù)怎么寫的,原理是啥,知道它是怎么用的就可以了,例如調(diào)用什么函數(shù)來(lái)解析天氣數(shù)據(jù)?解析后的數(shù)據(jù)如何使用?弄明白這兩個(gè)問題,就夠了。

? ? ? ? 1.1、什么函數(shù)來(lái)解析天氣數(shù)據(jù)?

????????時(shí)間太久了,我都不知道我哪里弄來(lái)的這個(gè)函數(shù),反正挺好用的,侵權(quán)聯(lián)系我刪除!

? ? ? ? 這個(gè)函數(shù)我放在我工程的"cJSON.c"文件最下面。

/*********************************************************************************
* Function Name    : cJSON_WeatherParse,解析天氣數(shù)據(jù)
* Parameter		   : JSON:天氣數(shù)據(jù)包  results:保存解析后得到的有用的數(shù)據(jù)
* Return Value     : 0:成功 其他:錯(cuò)誤
* Function Explain : 
* Create Date      : 2017.12.6 by lzn
**********************************************************************************/
int cJSON_WeatherParse(char *JSON, Results *results)
{
	cJSON *json,*arrayItem,*object,*subobject,*item;
	
	json = cJSON_Parse(JSON); //解析JSON數(shù)據(jù)包
	if(json == NULL)		  //檢測(cè)JSON數(shù)據(jù)包是否存在語(yǔ)法上的錯(cuò)誤,返回NULL表示數(shù)據(jù)包無(wú)效
	{
		printf("Error before: [%s] \r\n",cJSON_GetErrorPtr()); //打印數(shù)據(jù)包語(yǔ)法錯(cuò)誤的位置
		return 1;
	}
	else
	{
		if((arrayItem = cJSON_GetObjectItem(json,"results")) != NULL); //匹配字符串"results",獲取數(shù)組內(nèi)容
		{
			int size = cJSON_GetArraySize(arrayItem);     //獲取數(shù)組中對(duì)象個(gè)數(shù)
			printf("cJSON_GetArraySize: size=%d \r\n",size); 
			
			if((object = cJSON_GetArrayItem(arrayItem,0)) != NULL)//獲取父對(duì)象內(nèi)容
			{
				/* 匹配子對(duì)象1 */
				if((subobject = cJSON_GetObjectItem(object,"location")) != NULL)
				{
					printf("---------------------------------subobject1-------------------------------\r\n");
					if((item = cJSON_GetObjectItem(subobject,"id")) != NULL)   //匹配子對(duì)象1成員"id"
					{
						printf("cJSON_GetObjectItem: type=%d, string is %s,valuestring=%s \r\n",item->type,item->string,item->valuestring);
						memcpy(results[0].location.id,item->valuestring,strlen(item->valuestring));
					}
					if((item = cJSON_GetObjectItem(subobject,"name")) != NULL) //匹配子對(duì)象1成員"name"
					{
						printf("cJSON_GetObjectItem: type=%d, string is %s,valuestring=%s \r\n",item->type,item->string,item->valuestring);
						memcpy(results[0].location.name,item->valuestring,strlen(item->valuestring));
					}
					if((item = cJSON_GetObjectItem(subobject,"country")) != NULL)//匹配子對(duì)象1成員"country"
					{
						printf("cJSON_GetObjectItem: type=%d, string is %s,valuestring=%s \r\n",item->type,item->string,item->valuestring);
						memcpy(results[0].location.country,item->valuestring,strlen(item->valuestring));
					}
					if((item = cJSON_GetObjectItem(subobject,"path")) != NULL)  //匹配子對(duì)象1成員"path"
					{
						printf("cJSON_GetObjectItem: type=%d, string is %s,valuestring=%s \r\n",item->type,item->string,item->valuestring);
						memcpy(results[0].location.path,item->valuestring,strlen(item->valuestring));
					}
					if((item = cJSON_GetObjectItem(subobject,"timezone")) != NULL)//匹配子對(duì)象1成員"timezone"
					{
						printf("cJSON_GetObjectItem: type=%d, string is %s,valuestring=%s \r\n",item->type,item->string,item->valuestring);
						memcpy(results[0].location.timezone,item->valuestring,strlen(item->valuestring));
					}
					if((item = cJSON_GetObjectItem(subobject,"timezone_offset")) != NULL)//匹配子對(duì)象1成員"timezone_offset"
					{
						printf("cJSON_GetObjectItem: type=%d, string is %s,valuestring=%s \r\n",item->type,item->string,item->valuestring);
						memcpy(results[0].location.timezone_offset,item->valuestring,strlen(item->valuestring));
					}
				}
				/* 匹配子對(duì)象2 */
				if((subobject = cJSON_GetObjectItem(object,"now")) != NULL)
				{
					printf("---------------------------------subobject2-------------------------------\r\n");
					if((item = cJSON_GetObjectItem(subobject,"text")) != NULL)//匹配子對(duì)象2成員"text"
					{
						printf("cJSON_GetObjectItem: type=%d, string is %s,valuestring=%s \r\n",item->type,item->string,item->valuestring);
						memcpy(results[0].now.text,item->valuestring,strlen(item->valuestring));
					}
					if((item = cJSON_GetObjectItem(subobject,"code")) != NULL)//匹配子對(duì)象2成員"code"
					{
						printf("cJSON_GetObjectItem: type=%d, string is %s,valuestring=%s \r\n",item->type,item->string,item->valuestring);
						memcpy(results[0].now.code,item->valuestring,strlen(item->valuestring));
					}
					if((item = cJSON_GetObjectItem(subobject,"temperature")) != NULL) //匹配子對(duì)象2成員"temperature"
					{
						printf("cJSON_GetObjectItem: type=%d, string is %s,valuestring=%s \r\n",item->type,item->string,item->valuestring);
						memcpy(results[0].now.temperature,item->valuestring,strlen(item->valuestring));
					}
				}
				/* 匹配子對(duì)象3 */
				if((subobject = cJSON_GetObjectItem(object,"last_update")) != NULL)
				{
					printf("---------------------------------subobject3-------------------------------\r\n");
					printf("cJSON_GetObjectItem: type=%d, string is %s,valuestring=%s \r\n",subobject->type,subobject->string,subobject->valuestring);
					memcpy(results[0].last_update,item->valuestring,strlen(subobject->valuestring));
				}
			} 
		}
	}
	
	cJSON_Delete(json); //釋放cJSON_Parse()分配出來(lái)的內(nèi)存空間
	
	return 0;
}

????????2.1、解析后的數(shù)據(jù)如何使用?

? ? ? ? 調(diào)用上面那個(gè)函數(shù)后,解析的數(shù)據(jù)存放在一個(gè)雙層結(jié)構(gòu)體當(dāng)中,因此只需訪問結(jié)構(gòu)體的成員就可以,每個(gè)成員的名稱與心知天氣返回的名稱相匹配。

????????具體的信息參考心知天氣的文檔:極速實(shí)況 (yuque.com)

【STM32訓(xùn)練—WiFi模塊】第二篇、STM32驅(qū)動(dòng)ESP8266WiFi模塊獲取天氣

?2、相關(guān)代碼

? ? ? ? 2.1、main.c文件

#include "sys.h"
#include "led.h"
#include "delay.h"
#include "usart.h"
#include "esp8266.h"
#include "cJSON.h" //解析天氣

//天氣數(shù)據(jù)
extern unsigned char Weather_buff[300];
//天氣解析
Results Weather_results[] = {{0}};

int main()
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	//中斷控制器分組設(shè)置
	Usart1_Init(115200);
	Usart2_Init(115200);

	LED_Init();
	delay_init();//初始化很重要//用不了的函數(shù)一般都是沒有初始化
														
	ESP8266_Init();
	Get_current_weather();//獲取天氣
	while(1)
	{
		LED0 = 0;
		delay_ms(500);
		delay_ms(500);
		delay_ms(500);
		delay_ms(500);
		LED0 = 1;
		delay_ms(500);
		delay_ms(500);
		delay_ms(500);
		delay_ms(500);
		cJSON_WeatherParse((char *)Weather_buff, Weather_results);
		printf("%s",Weather_buff);	
		//打印結(jié)構(gòu)體內(nèi)內(nèi)容
		printf("\r\n 打印結(jié)構(gòu)體內(nèi)內(nèi)容如下: \r\n");
		printf("%s \r\n",Weather_results[0].now.text);
		printf("%s \r\n",Weather_results[0].now.temperature);
		printf("%s \r\n",Weather_results[0].location.path);
		printf("%s \r\n",Weather_results[0].location.country);

	}

}

? ? ? ? 2.2、esp8266.c文件

#include "stm32f10x.h"
#include "sys.h"
#include "string.h"
#include "stdlib.h"
#include "esp8266.h"

#include "usart.h"
#include "delay.h"
#include "led.h"

//WIFI和密碼·
#define ESP8266_WIFI_INFO		"AT+CWJAP=\"iPhone111\",\"123456789\"\r\n"
//心知天氣的API
#define Weather_TCP		"AT+CIPSTART=\"TCP\",\"api.seniverse.com\",80\r\n"
//心知天氣GET報(bào)文
/*這里城市  恩施    語(yǔ)言為  英文*/
#define Weather_GET		"GET https://api.seniverse.com/v3/weather/now.json?key=SwLQ3i0Q5TNa6NSKT&location=enshi&language=en&unit=c\r\n"


//ESP8266數(shù)據(jù)存放
unsigned char esp8266_buf[300] = {0};
unsigned short esp8266_cnt = 0, esp8266_cntPre = 0;
//存放天氣數(shù)據(jù)
unsigned char Weather_buff[300];   //位數(shù)是隨機(jī)確定的



/**************************************************************************/
//函數(shù)作用:ESP8266_Init初始化函數(shù)
//函數(shù)名稱:ESP8266_Init(void);
//內(nèi)部參數(shù):
//修改日期:2022年4月18日  下午16:18
//作者:    大屁桃
/**************************************************************************/
void ESP8266_Init(void)
{
		
	ESP8266_Clear();
	
 /*讓W(xué)IFI推出透?jìng)髂J?/
	while(ESP8266_SendCmd("+++", ""))  
	delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "1.AT\r\n");
	while(ESP8266_SendCmd("AT\r\n", "OK"))
		delay_ms(500);
	
	//
	//加一步ESP8266復(fù)位操作
	
	UsartPrintf(USART_DEBUG, "2.RST\r\n");
	ESP8266_SendCmd("AT+RST\r\n", "");
	delay_ms(500);
	ESP8266_SendCmd("AT+CIPCLOSE\r\n", "");
	delay_ms(500);
	/
	
	UsartPrintf(USART_DEBUG, "3.CWMODE\r\n");
	while(ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
		delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "4.AT+CIPMUX\r\n");
	while(ESP8266_SendCmd("AT+CIPMUX=0\r\n", "OK"))
		delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "5.CWJAP\r\n");
	while(ESP8266_SendCmd(ESP8266_WIFI_INFO, "WIFI GOT IP"))
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
	UsartPrintf(USART_DEBUG, "ESP8266_Init OK\r\n");
}


/*獲取網(wǎng)絡(luò)天氣數(shù)據(jù)*/
/**************************************************************************/
//函數(shù)作用:獲取心知天氣函數(shù)
//函數(shù)名稱:Get_current_weather(void);
//內(nèi)部參數(shù):
//修改日期:2022年4月18日  下午16:18
//作者:    大屁桃
/**************************************************************************/
void Get_current_weather(void)
{
	ESP8266_Clear();
	
	UsartPrintf(USART_DEBUG, "6.Weather_TCP OK\r\n");	
	while(ESP8266_SendCmd(Weather_TCP, "CONNECT"))
	delay_ms(500);
	delay_ms(500);
	
	UsartPrintf(USART_DEBUG, "7.AT+CIPMODE=1 OK\r\n");		
	while(ESP8266_SendCmd("AT+CIPMODE=1\r\n", "OK"))
	delay_ms(500);
	delay_ms(500);
	delay_ms(500);
/*sizeof(Weather_GET),必須用sizeof函數(shù),用strlen沒有用*/  	
	ESP8266_SendData((u8 *)Weather_GET, sizeof(Weather_GET)); //發(fā)送AT+CIPSEND  以及 Weather_GET
	
	ESP8266_GetIPD_GET(200,Weather_buff);
	ESP8266_Clear();//清除緩存數(shù)據(jù)	

	delay_ms(500);
	delay_ms(500);
	while(ESP8266_SendCmd("+++", ""))      /*退出透?jìng)髂J?/
	delay_ms(500);
	UsartPrintf(USART_DEBUG, "+++ OK\r\n");	

	while(ESP8266_SendCmd("AT\r\n", "OK"))   //驗(yàn)證是否退出透?jìng)髂J?		delay_ms(500);
	UsartPrintf(USART_DEBUG, "1.AT\r\n");
}




/**************************************************************************/
//函數(shù)作用:串口二中斷函數(shù)
//函數(shù)名稱:USART2_IRQHandler();
//內(nèi)部參數(shù):
//修改日期:2022年4月18日  下午4:18
//作者:    大屁桃
/**************************************************************************/
void USART2_IRQHandler(void)
{

	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中斷
	{

		if(esp8266_cnt >= sizeof(esp8266_buf))	esp8266_cnt = 0; //防止串口被刷爆				
		esp8266_buf[esp8266_cnt++] = USART2->DR;  

//		USART_SendData(USART1,USART2->DR);      //讓接收到的數(shù)據(jù)打印在串口一上
		
		USART_ClearFlag(USART2, USART_FLAG_RXNE);
	}
}



//==========================================================
//	函數(shù)名稱:	ESP8266_Clear
//
//	函數(shù)功能:	清空緩存
//
//	入口參數(shù):	無(wú)
//
//	返回參數(shù):	無(wú)
//
//	說(shuō)明:		
//==========================================================
void ESP8266_Clear(void)
{

	memset(esp8266_buf, 0, sizeof(esp8266_buf));
	esp8266_cnt = 0;

}
//==========================================================
//	函數(shù)名稱:	ESP8266_WaitRecive
//
//	函數(shù)功能:	等待接收完成
//
//	入口參數(shù):	無(wú)
//
//	返回參數(shù):	REV_OK-接收完成		REV_WAIT-接收超時(shí)未完成
//
//	說(shuō)明:		循環(huán)調(diào)用檢測(cè)是否接收完成
//==========================================================
_Bool ESP8266_WaitRecive(void)
{

	if(esp8266_cnt == 0) 							//如果接收計(jì)數(shù)為0 則說(shuō)明沒有處于接收數(shù)據(jù)中,所以直接跳出,結(jié)束函數(shù)
		return REV_WAIT;
		
	if(esp8266_cnt == esp8266_cntPre)				//如果上一次的值和這次相同,則說(shuō)明接收完畢
	{
		esp8266_cnt = 0;							//清0接收計(jì)數(shù)
			
		return REV_OK;								//返回接收完成標(biāo)志
	}
		
	esp8266_cntPre = esp8266_cnt;					//置為相同
	
	return REV_WAIT;								//返回接收未完成標(biāo)志

}




//==========================================================
//	函數(shù)名稱:	ESP8266_GetIPD
//
//	函數(shù)功能:	copy天氣數(shù)據(jù)到Weather_buff數(shù)組里面
//
//	返回參數(shù):	平臺(tái)返回的原始數(shù)據(jù)
//
//	說(shuō)明:		copy天氣數(shù)據(jù)到Weather_buff
//==========================================================

unsigned char *ESP8266_GetIPD_GET(unsigned short timeOut,u8 *buff)//這里我用了一個(gè)全局變量將esp8266buf儲(chǔ)存到這個(gè)全局變量里面
{
	do
	{
		delay_ms(5);													
	} while(timeOut--);
	strcpy((char*)buff,(char*)esp8266_buf);
	return buff;														
}

/*還未用到*/
//==========================================================
//	函數(shù)名稱:	ESP8266_GetIPD
//
//	函數(shù)功能:	獲取平臺(tái)返回的數(shù)據(jù)
//
//	入口參數(shù):	等待的時(shí)間(乘以10ms)
//
//	返回參數(shù):	平臺(tái)返回的原始數(shù)據(jù)
//
//	說(shuō)明:		不同網(wǎng)絡(luò)設(shè)備返回的格式不同,需要去調(diào)試
//				如ESP8266的返回格式為	"+IPD,x:yyy"	x代表數(shù)據(jù)長(zhǎng)度,yyy是數(shù)據(jù)內(nèi)容
//==========================================================
unsigned char *ESP8266_GetIPD(unsigned short timeOut)
{

	char *ptrIPD = NULL;
	
	do
	{
		if(ESP8266_WaitRecive() == REV_OK)								//如果接收完成
		{
			ptrIPD = strstr((char *)esp8266_buf, "IPD,");				//搜索“IPD”頭
			if(ptrIPD == NULL)											//如果沒找到,可能是IPD頭的延遲,還是需要等待一會(huì),但不會(huì)超過(guò)設(shè)定的時(shí)間
			{
				//UsartPrintf(USART_DEBUG, "\"IPD\" not found\r\n");
			}
			else
			{
				ptrIPD = strchr(ptrIPD, ':');							//找到':'
				if(ptrIPD != NULL)
				{
					ptrIPD++;
					return (unsigned char *)(ptrIPD);
				}
				else
					return NULL;
				
			}
		}
		
		delay_ms(5);													//延時(shí)等待
	} while(timeOut--);
	
	return NULL;														//超時(shí)還未找到,返回空指針

}
//==========================================================
//	函數(shù)名稱:	ESP8266_SendCmd
//
//	函數(shù)功能:	發(fā)送命令
//
//	入口參數(shù):	cmd:命令
//				res:需要檢查的返回指令
//
//	返回參數(shù):	0-成功	1-失敗
//
//	說(shuō)明:		
//==========================================================
_Bool ESP8266_SendCmd(char *cmd, char *res)
{
	
	unsigned char timeOut = 250;

	Usart_SendString(USART2, (unsigned char *)cmd, strlen((const char *)cmd));
	
	while(timeOut--)
	{
		if(ESP8266_WaitRecive() == REV_OK)							//如果收到數(shù)據(jù)
		{		
			if(strstr((const char *)esp8266_buf, res) != NULL)		//如果檢索到關(guān)鍵詞
			{
				ESP8266_Clear();									//清空緩存
				
				return 0;
			}
		}
		
		delay_ms(10);
	}
	
	return 1;

}

//==========================================================
//	函數(shù)名稱:	ESP8266_SendData
//
//	函數(shù)功能:	發(fā)送數(shù)據(jù)
//
//	入口參數(shù):	data:數(shù)據(jù)
//				len:長(zhǎng)度
//
//	返回參數(shù):	無(wú)
//
//	說(shuō)明:		
//==========================================================
void ESP8266_SendData(unsigned char *data, unsigned short len)
{

	char cmdBuf[32];
	
	ESP8266_Clear();								//清空接收緩存
	sprintf(cmdBuf, "AT+CIPSEND\r\n");		//發(fā)送命令
	if(!ESP8266_SendCmd(cmdBuf, ">"))				//收到‘>’時(shí)可以發(fā)送數(shù)據(jù)
	{
		UsartPrintf(USART_DEBUG, "8.AT+CIPSEND\r\n");
		/*發(fā)送請(qǐng)求數(shù)據(jù)*/
		Usart_SendString(USART2, data, len);		//發(fā)送設(shè)備連接請(qǐng)求數(shù)據(jù)		
	}
}


第四部分、總結(jié)

1、效果展示

? ? ? ? 這是連接單片機(jī)后,單片機(jī)通過(guò)串口返回的數(shù)據(jù),這里串口只展示了當(dāng)前天氣、當(dāng)前溫度,所在地區(qū)和所在國(guó)家的數(shù)據(jù),若想增加在主程序中增加即可。

? ? ? ? 單片機(jī)通過(guò)串口返回的數(shù)據(jù)和網(wǎng)址上顯示的一致。

【STM32訓(xùn)練—WiFi模塊】第二篇、STM32驅(qū)動(dòng)ESP8266WiFi模塊獲取天氣

?2、完整的工程

? ? ? ? 完整的工程代碼點(diǎn)擊該鏈接下載,無(wú)需積分,直接下載:STM32工程文件???????

3、補(bǔ)充

? ? ? ? 這篇博客說(shuō)明了天氣的獲取方式,天氣的讀取,后面想做天氣顯示等應(yīng)用,只需要加上LCD的驅(qū)動(dòng)程序即可,花里胡哨的功能要靠自己去琢磨噻。

? ? ? ? 最后希望博客對(duì)你有幫助,喜歡的話可以點(diǎn)個(gè)贊呢??????。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-490906.html

到了這里,關(guān)于【STM32訓(xùn)練—WiFi模塊】第二篇、STM32驅(qū)動(dòng)ESP8266WiFi模塊獲取天氣的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 猿創(chuàng)征文 | 【STM32】ESP8266 wifi模塊創(chuàng)建阿里云產(chǎn)品

    猿創(chuàng)征文 | 【STM32】ESP8266 wifi模塊創(chuàng)建阿里云產(chǎn)品

    ??博客主頁(yè):@丘比特懲罰陸 ??歡迎關(guān)注:點(diǎn)贊收藏?留言? ??系列專欄:嵌入式、web前端、筆記專欄 ?? 加入社區(qū): 灌水樂園 ??人生格言:選對(duì)方向,每走一步都是進(jìn)步! ??歡迎大佬指正,一起學(xué)習(xí)!一起加油! ?? 希望大家能小手一動(dòng),幫忙點(diǎn)個(gè)贊! ??資源郵箱

    2023年04月18日
    瀏覽(20)
  • STM32--ESP8266物聯(lián)網(wǎng)WIFI模塊(貝殼物聯(lián))--遠(yuǎn)程無(wú)線控制點(diǎn)燈

    STM32--ESP8266物聯(lián)網(wǎng)WIFI模塊(貝殼物聯(lián))--遠(yuǎn)程無(wú)線控制點(diǎn)燈

    本文適用于STM32F103C8T6等MCU,其他MCU可以移植,完整資源見文末鏈接 一、簡(jiǎn)介 隨著移動(dòng)物聯(lián)網(wǎng)的發(fā)展,各場(chǎng)景下對(duì)于物聯(lián)控制、數(shù)據(jù)上傳、遠(yuǎn)程控制的訴求也越來(lái)越多,基于此樂鑫科技推出了便宜好用性價(jià)比極高的wifi物聯(lián)模塊——ESP8266,話不多少我們先來(lái)看看這個(gè)神奇的模

    2024年02月08日
    瀏覽(25)
  • STM32通過(guò)串口2使用ESP8266WIFI模塊連接新大陸云平臺(tái)

    STM32通過(guò)串口2使用ESP8266WIFI模塊連接新大陸云平臺(tái)

    目錄 使用硬件: 分步驟:配置TCP連接,連接WIFI 1.使用ESP8266的復(fù)位引腳進(jìn)行復(fù)位 2.發(fā)送基本AT指令 3.連接新大陸 4.新大陸云平臺(tái)顯示在線及上傳數(shù)據(jù)測(cè)試成功 5.串口顯示 5.涉及的函數(shù) 發(fā)生AT檢測(cè)WIFI模塊錯(cuò)誤,如圖,代碼運(yùn)行停留在了.AT,在while中一直循環(huán),沒有往下跑了,這種

    2024年04月24日
    瀏覽(33)
  • STM32玩轉(zhuǎn)物聯(lián)網(wǎng)實(shí)戰(zhàn)篇:2.ESP8266 WIFI模塊TCP通信示例詳解

    STM32玩轉(zhuǎn)物聯(lián)網(wǎng)實(shí)戰(zhàn)篇:2.ESP8266 WIFI模塊TCP通信示例詳解

    開發(fā)板功能區(qū)分布圖 開發(fā)板俯視圖 ????ESP8266 WIFI模塊內(nèi)置TCP/IP網(wǎng)絡(luò)協(xié)議,模塊支持三種網(wǎng)絡(luò)模式,AP、STA和AP+STA模式,AP模式:模塊作為WIFI熱點(diǎn),等待其他設(shè)備的連接,進(jìn)行局域網(wǎng)的通信,STA模式:模塊作為客戶端通過(guò)路由器連接外網(wǎng),和服務(wù)器進(jìn)行通信,AP+STA模式:兩

    2024年02月03日
    瀏覽(16)
  • 【STM32】ESP8266 WiFi模塊實(shí)時(shí)上報(bào)溫濕度及控制LED燈項(xiàng)目筆記

    【STM32】ESP8266 WiFi模塊實(shí)時(shí)上報(bào)溫濕度及控制LED燈項(xiàng)目筆記

    本項(xiàng)目無(wú)線通訊模塊使用的是WiFi模塊ESP8266,樂鑫公司推出的高性能、低功耗串口WiFi模塊ESP8266應(yīng)該是使用最廣泛的一種WIFI模塊之一了,它自身帶有高性能的MCU(Microcontroller Unit),因此它既可以通過(guò)串口連接為外部MCU提供 WiFi通信功能,也就是我們本項(xiàng)目所用到的功能;當(dāng)然

    2024年01月21日
    瀏覽(37)
  • STM32f103增加ESP8266模塊,通過(guò)Wifi用手機(jī)TCP服務(wù)端遠(yuǎn)程與STM32通信

    STM32f103增加ESP8266模塊,通過(guò)Wifi用手機(jī)TCP服務(wù)端遠(yuǎn)程與STM32通信

    提示:esp8266開啟透?jìng)髂J?連上路由器Wifi(電腦熱點(diǎn)),接入STM32串口引腳。另外手機(jī)TCP服務(wù)端是手機(jī)IP地址+串口號(hào)(大于8000滴) 最近對(duì)ESP8266模塊進(jìn)行小了解,知道只要對(duì)8266通過(guò)串口發(fā)送AT指令進(jìn)行配置其工作模式,就能夠通過(guò)手機(jī)調(diào)試APP創(chuàng)建什么TCP/UDP服務(wù)端/客戶端和8266進(jìn)行

    2024年02月16日
    瀏覽(27)
  • STM32--ESP8266物聯(lián)網(wǎng)WIFI模塊(貝殼物聯(lián))--溫濕度數(shù)據(jù)上傳服務(wù)器顯示

    STM32--ESP8266物聯(lián)網(wǎng)WIFI模塊(貝殼物聯(lián))--溫濕度數(shù)據(jù)上傳服務(wù)器顯示

    本文適用于STM32F103C8T6等MCU,其他MCU可以移植,完整資源見文末鏈接 一、簡(jiǎn)介 隨著移動(dòng)物聯(lián)網(wǎng)的發(fā)展,各場(chǎng)景下對(duì)于物聯(lián)控制、數(shù)據(jù)上傳、遠(yuǎn)程控制的訴求也越來(lái)越多,基于此樂鑫科技推出了便宜好用性價(jià)比極高的wifi物聯(lián)模塊——ESP8266,話不多少我們先來(lái)看看這個(gè)神奇的模

    2024年02月08日
    瀏覽(33)
  • STM32F103C8T6+ESP8266WIFI+DHT11模塊連接巴法云

    1.MCU:STM32F103C8T6 2.ESP8266:正點(diǎn)原子WIFI模塊 3.串口模塊:正點(diǎn)原子串口模塊 我們對(duì)Markdown編輯器進(jìn)行了一些功能拓展與語(yǔ)法支持,除了標(biāo)準(zhǔn)的Markdown編輯器功能,我們?cè)黾恿巳缦聨c(diǎn)新功能,幫助你用它寫博客: ESP8266固件刷寫 我用的是安信可的固件,可以在官網(wǎng)上下載。正點(diǎn)

    2023年04月27日
    瀏覽(42)
  • ESP8266 模塊簡(jiǎn)易驅(qū)動(dòng)程序 -- 基于 STM32F103 及原子云固件實(shí)現(xiàn)云功能

    ESP8266 模塊簡(jiǎn)易驅(qū)動(dòng)程序 -- 基于 STM32F103 及原子云固件實(shí)現(xiàn)云功能

    本簡(jiǎn)易驅(qū)動(dòng)程序是基于 正點(diǎn)原子 的ESP8266模塊,主要用于實(shí)現(xiàn)連接 原子云 的功能。MCU選用的是 STM32F103ZET6 注:原子云固件添加了 AT+ATKCLDSTA 和 AT+ATKCLDCLS 兩條指令 用于連接正點(diǎn)原子自家的原子云平臺(tái),原廠的AT指令不受任何影響 本程序主要實(shí)現(xiàn)了如下功能: 設(shè)定工作模式 連

    2023年04月23日
    瀏覽(30)
  • STM32-ESP8266WIFI定位

    STM32-ESP8266WIFI定位

    最近想用stm32+esp8266做一個(gè)僅通過(guò)WIFI來(lái)定位的小硬件,但找了很多家,比如高德、百度這些都沒有面向個(gè)人開發(fā)者的硬件網(wǎng)絡(luò)定位接口,但兜兜轉(zhuǎn)轉(zhuǎn)還是找到了一家做物聯(lián)網(wǎng)定位的叫 維智科技 ,他們的物聯(lián)網(wǎng)定位平臺(tái)是這個(gè)https://lotboard.newayz.com/,個(gè)人開發(fā)者注冊(cè)的話配額還

    2024年02月02日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包