基於ESP2866的遠程控制開關(ESP8266 部分)

關於ESP8266的遠程開關控制器 (渝興未到工作室)

今天我們來做一個項目基於ESP88266開發的一款 遠程控制開關項目!!小白也可以跟着做。

歡迎加入我們的交流羣 :764284134

在這裏插入圖片描述

首先項目採用的是局域網控制的!當然能內網穿透的那就是遠程控制!!然後採用的是SDK開發。不是AT指令 。。不是AT指令 。。不是AT指令 。。複雜的就先不多說了!!

首先說明:
因爲8266 只支持2.4G 所以遠程控制都是在2.4G的熱點局域網下 。

關於8266的開發環境大家可以去 樂鑫的官網上面去下載開發IDE 和下載工具

地址: https://www.espressif.com/zh-hans/support/download/other-tools
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
當然不想去自己找的我這裏也提供了傳送門

鏈接:https://pan.baidu.com/s/1RLMuXapezDO4n8fTzKZtsQ
提取碼:8k0y

安裝完就是這兩個玩意兒
在這裏插入圖片描述
然後我們用的芯片模組是安信可的 ESP-12F模塊 (應該算是比較經典的模塊了吧!!) 就長這樣!!
在這裏插入圖片描述
好 大家軟件安裝完成了 了下面我們就開始開發了!!打開IDE
在這裏插入圖片描述
還是一樣的要配置工程 這裏節約時間我這邊就給大家一個配置好了的!大家直接來拿用就是了
地址:https://github.com/goundam/ESP8266Remote-switch
也可以在百度網盤下載 :
鏈接:https://pan.baidu.com/s/1SuMF_z5g2aRMHMP2zNO3BQ
提取碼:rbjt

下載好解壓然後我們開始打開項目

在這裏插入圖片描述

右鍵 導入項目

在這裏插入圖片描述

選擇外部文件項目,點擊next

ZG4ubmV0L3dlaXhpbl80MjcxNDI4MQ==,size_16,color_FFFFFF,t_70)

瀏覽到剛纔下載解壓的文件,選擇Cygwin GCC,然後點擊finish

在這裏插入圖片描述

然後我們的項目就導入進來了

在這裏插入圖片描述

然後我們展開文件 找到main.c 裏面的一些環境配置我都處理了 大家拿着不用想太多 直接用就是了。

在這裏插入圖片描述

找到user_init(void) 我們自己寫代碼的入口

在這裏插入圖片描述#### 爲了驗證文件的完整性我們就先編譯一下
在這裏插入圖片描述

編譯成功後就向這個樣子!! 如果報錯了 請檢查文件的完整性

在這裏插入圖片描述

好了我們接着往下面走!! 既然是做遠程控制,我們就先來分配底層,先要確認我們要使用什麼東西!!這樣才便於編程!!

這裏我先還是給一張引腳的圖片把 免得大家不知道是在那點的
在這裏插入圖片描述
我們用這三個引腳 GPIO12 用來清除保存的wifi數據(用戶名密碼什麼的,項目會設置自動連接),GPIO5|GPIO4用來做輸出用
下面我給出GPIO的輸入輸出配置:
在這裏插入圖片描述

代碼在這裏:

	//將 GPIO4|5|12 做爲GPIO 管腳(參數1:管腳選擇,參數2:選擇功能),可以按ctrl+鼠標左鍵查看
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4);
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U, FUNC_GPIO5);
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);

	//將 GPIO4|5設置爲輸出模式 並輸出低電平 (參數1:選擇引腳,參數2:輸出電平)
	GPIO_OUTPUT_SET(GPIO_ID_PIN(4), 0);
	GPIO_OUTPUT_SET(GPIO_ID_PIN(5), 0);

	//GPIO12設置爲中斷輸入 起的是清除數據的作用
	//先失能GPIO輸出功能
	GPIO_DIS_OUTPUT(GPIO_ID_PIN(12));
	//設置引腳的內部上拉功能
	PIN_PULLUP_EN(PERIPHS_IO_MUX_MTDI_U);

代碼寫的應該還算不難把!!具體的功能都註釋了的 不懂得 可以入交流羣:764284134 問問
然後接下來我們就配置輸入中斷,多寫點功能便於大家學習和使用 配置見下圖
下面就是中斷的配置 需要咱們自己創建一箇中斷回調函數(當中斷產生時調用的函數)
在這裏插入圖片描述

代碼如下:

/*************************** 中斷配置 ****************************************/
	//關閉GPIO中斷然後配置
	ETS_GPIO_INTR_DISABLE();	
	//註冊中斷回調函數(參數1:註冊的中斷函數名,參數2:arg一般用不到)
	ETS_GPIO_INTR_ATTACH((ets_isr_t)IO_INTERRUPT,NULL);
	//設置GPIO中斷的觸發方式(參數1:中斷的引腳,參數2:中斷的觸發方式)
	gpio_pin_intr_state_set(GPIO_ID_PIN(12),GPIO_PIN_INTR_NEGEDGE);
	//打開GPIO中斷開始工作
	ETS_GPIO_INTR_ENABLE();
gpio_pin_intr_state_set(uint32 i, GPIO_INT_TYPE intr_state);的觸發有幾種方式我列出來 :

GPIO_PIN_INTR_DISABLE = 0, -------不觸發中斷
GPIO_PIN_INTR_POSEDGE = 1, -------上升沿中斷
GPIO_PIN_INTR_NEGEDGE = 2, -------下降沿中斷
GPIO_PIN_INTR_ANYEDGE = 3, -------雙邊沿中斷
GPIO_PIN_INTR_LOLEVEL = 4, -------低電平中斷
GPIO_PIN_INTR_HILEVEL = 5-------高電平沿中斷

繼續往下面走 咱們註冊中斷裏面 需要註冊一箇中斷函數

如下圖:
在這裏插入圖片描述
代碼還是如下: 大家可以看看 註釋基本上都有不懂得 可以入交流羣:764284134 哈哈

下面是配置的GPIO12的中斷用於清空flash的(可以直接配網清空這個,我爲了方便不出錯就寫了箇中斷清空flash)

/******************************************************************************
 * FunctionName : IO_INTERRUPT
 * Description  : GPIO中斷函數的回調函數定義
 * Parameters   : none
 * Returns      : none
 *******************************************************************************/
void IO_INTERRUPT(void)
{
	//創建變量保存所有IO的狀態
	u32	S_GPIO_INT;
	//創建變量保存GPIO_12的狀態
	u32 F_GPIO_12_INT;
	//讀取GPIO的中斷狀態保存到S_GPIO_INT裏面
	S_GPIO_INT = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
	//清除中斷狀態標誌位(如果沒有清除中斷狀態標誌位,他就會一直進入中斷)
	GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, S_GPIO_INT);
	//獲取GPIO_12的中斷狀態
	F_GPIO_12_INT = S_GPIO_INT & (0x01<<12);
	//os_printf(S_GPIO_INT+"");
	//------------------------------------------------------------
	if(F_GPIO_12_INT)	// GPIO_12的下降沿狀態
	{
		//os_printf("Remove data");
		//當鍵位按下的時候擦除0x80 flash扇區
		spi_flash_erase_sector(Sector_STA_INFO);		
		//spi_flash_erase_sector(0x77);	
	}
}

在這裏插入圖片描述

這裏👆裏面的sector_STA_INFO 是一個宏定義

如下圖: 現需要大家定義一下,這個地址用來存放我們的wifi名稱和密碼,下次開機如果這裏存了值的就直接連接
在這裏插入圖片描述

#define	 Sector_STA_INFO	0x80	//【STA參數】保存扇區



繼續繼續!! 藥不能停!!
接下來我們來配置WIFI網絡模式這裏我們用的是做連接熱點的客服端 也就是STA的客服端可以理解成爲下圖:
在這裏插入圖片描述
好了 這裏我們用個函數來初始化,這裏第一個我們要配置STA的模式,然後我們需要用一個定時器來計時來讀取當我定時時間到的時候8266 是否有讀取到ip 當然定時器也是回調處理的
在這裏插入圖片描述
代碼:

/*************************** STA和時鐘配置 ***********************************/
	//初始化STA模式
	M_ESP8266_Init_STA();
	//配置並運行Timer1
	OS_Timer_1_Init();

下面我們先來看看STA的初始化函數把
在這裏插入圖片描述
這個初始化函數的意思就是 從flash裏面讀取的數據 獲取wifi名稱和密碼 然後 進行連接 如果沒有值 執行完就會 跑去定時
代碼:

/******************************************************************************
 * FunctionName : M_ESP8266_Init_STA
 * Description  : STA模式初始化設置
 * Parameters   : none
 * Returns      : none
 *******************************************************************************/
void ICACHE_FLASH_ATTR M_ESP8266_Init_STA() {
	os_memset(&STA_INFO, 0, sizeof(struct station_config));		     //初始化 清空結構體
	spi_flash_read(Sector_STA_INFO * 4096, (uint32 *) &STA_INFO, 96);//讀出【STA參數】(SSID/PASS)
	STA_INFO.ssid[31] = 0;										     //SSID最後添加'\0'
	STA_INFO.password[63] = 0;									     //PASS最後添加'\0'
	//os_printf("\r\nSTA_INFO.ssid=%s\r\nSTA_INFO.password=%s\r\n", STA_INFO.ssid,
	//		STA_INFO.password);
	wifi_set_opmode(0x01);											//設置爲STA模式,並保存到Flsh
	wifi_station_set_config(&STA_INFO);	        					//設置STA參數
	wifi_station_connect();				        					//ESP8266連接到wifi(這裏此句可省)
}

上面的os_memset(&STA_INFO, 0, sizeof(struct station_config)); //初始化 清空結構體
這句話 我們需要定義結構體 就像這樣
在這裏插入圖片描述

代碼:

struct station_config STA_INFO;     //結構體 STA信息

把8266設置爲STA模式 完成了 接下來我們開始 配置定時器 還是一樣 設置回調函數要關閉然後配置函數完了後再開啓
在這裏插入圖片描述
代碼:

/******************************************************************************
 * FunctionName : M_Timer_1_Init
 * Description  : Timer定時器初始化函數
 * Parameters   : none
 * Returns      : none
 *******************************************************************************/
void ICACHE_FLASH_ATTR OS_Timer_1_Init(u32 time_ms, u8 time_repetitive) {
	// 先關閉定時器
	os_timer_disarm(&OS_Timer_1);
	// 設置定時器回調 函數名 OS_Timer_1_INTERRUPT
	os_timer_setfn(&OS_Timer_1, (os_timer_func_t *) OS_Timer_1_INTERRUPT, NULL);
	// 然後使能定時器
	os_timer_arm(&OS_Timer_1, time_ms, time_repetitive);
}

這裏也要定義一個全局變量軟件定時類型變量

在這裏插入圖片描述

代碼 :

os_timer_t OS_Timer_1;			// 定義定時器全局變量

接下來我們繼續來寫定時器的回調函數 OS_Timer_1_INTERRUPT

如下圖:
在這裏插入圖片描述
回調函數大概功能就是說 當定時器到了1s 進入了這個回調函數 裏面會先查詢是否有連接到wifi 並且查詢狀態,若連接到了wifi 就會進行TCP通信配置,要是沒有連接到的話就會 進入到 網絡配置狀態 智能配網 並且關閉定時器

代碼

/******************************************************************************
 * FunctionName : OS_Timer_1_INTERRUPT
 * Description  : Timer定時器回調函數
 * Parameters   : none
 * Returns      : none
 *******************************************************************************/
void ICACHE_FLASH_ATTR OS_Timer_1_INTERRUPT(void) {
	//WIFI 接入狀態標誌
	u8 S_WIFI_STA_Connect;
	//查詢STA接入wifi狀態
	S_WIFI_STA_Connect = wifi_station_get_connect_status();
	//-----------------------------------------------------------------------------
	// Station連接狀態表
	// 0 == STATION_IDLE -------------- STATION閒置
	// 1 == STATION_CONNECTING -------- 正在連接WIFI
	// 2 == STATION_WRONG_PASSWORD ---- WIFI密碼錯誤
	// 3 == STATION_NO_AP_FOUND ------- 未發現指定WIFI
	// 4 == STATION_CONNECT_FAIL ------ 連接失敗
	// 5 == STATION_GOT_IP ------------ 獲得IP,連接成功
	//-----------------------------------------------------------------------------
	//成功接入WIFI
	//判斷是否獲取IP
	if( S_WIFI_STA_Connect == STATION_GOT_IP){
//*****************************測試代碼******************************************************
		//讀取上次存儲的IP
		//spi_flash_read(Sector_STA_INFO*4096, (uint32 *)ESP8266_IP, sizeof(ESP8266_IP));
		// 串口顯示ESP8266的IP地址
		//os_printf("ESP8266_IP = %d.%d.%d.%d\n", ESP8266_IP[0], ESP8266_IP[1],
		//		ESP8266_IP[2], ESP8266_IP[3]);
//********************************************************************************************
		ESP8266_TCP_NetCon_Init();		// 初始化網絡連接(TCP通信)
		os_timer_disarm(&OS_Timer_1);	// 關閉定時器
	}
	//如果沒有獲取到IP 連接失敗判斷
	else if( S_WIFI_STA_Connect == STATION_NO_AP_FOUND		|| 	//未找到指定wifi
			 S_WIFI_STA_Connect == STATION_WRONG_PASSWORD	||	//wifi密碼錯誤
			 S_WIFI_STA_Connect == STATION_CONNECT_FAIL		)	//連接wifi失敗
	{
		os_timer_disarm(&OS_Timer_1);	//關閉定時器
		//os_printf("\r\n ==== S_WIFI_STA_Connect=d=======\r\n",S_WIFI_STA_Connect);
		//os_printf("\r\n ==== ESP8266 Can't Connect to WIFI ====\r\n");
		smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS); //esp8266配網方式【SC_TYPE_ESPTOUCH_AIRKISS】
		smartconfig_start(smartconfig_done);   //進入【智能配網模式】,並設置回調函數
	}

}

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

以上就是初始化的函數 在USER_init 裏面基本上就是這些函數👇

在這裏插入圖片描述

下面我繼續初始化完了 現在 我們就有兩種狀態 一種是直接獲取到wifi賬號密碼可以配置TCP,另外一種就是不能獲取到WiFi賬號密碼 需要網絡配置。

我們先來解決第一種如果連接上了wifi 配置TCP通信 我們這邊是做的TCP_SERVER 服務等待客戶端的相應
下面是初始化配置:
在這裏插入圖片描述

代碼:
/******************************************************************************
 * FunctionName : ESP8266_TCP_NetCon_Init
 * Description  : 初始化網絡連接(TCP通信)
 * Parameters   : none
 * Returns      : none
 *******************************************************************************/
void ICACHE_FLASH_ATTR ESP8266_TCP_NetCon_Init()
{
	// 結構體賦值
	// 設置爲TCP協議
	ST_NetCon.type = ESPCONN_TCP ;				
	// 爲TCP開闢內存
	ST_NetCon.proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp));	
	
	// 此處無需設置目標IP/端口(ESP8266作爲Server,不需要預先知道Client的IP/端口)
	// 設置本地端口號爲:8266
	ST_NetCon.proto.tcp->local_port = 8266 ;	

	// 註冊連接成功回調函數、異常斷開回調函數
	espconn_regist_connectcb(&ST_NetCon, ESP8266_TCP_Connect_Cb);	// 註冊TCP連接成功建立的回調函數
	espconn_regist_reconcb(&ST_NetCon, ESP8266_TCP_Break_Cb);		// 註冊TCP連接異常斷開的回調函數
	
	// 創建TCP_server,建立偵聽
	espconn_accept(&ST_NetCon);	
	espconn_regist_time(&ST_NetCon,300, 0); 	//設置超時斷開時間。單位=秒,最大值=7200
}
//=========================================================================================================

當然我們這裏也要創建結構體來存儲TCP具體的配置 就是上圖報紅位置

在這裏插入圖片描述

代碼:

struct espconn ST_NetCon;		    	// 網絡連接結構體

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

在上面TCP初始創建成功後 又會出現兩個分支

1.註冊TCP連接成功建立的回調函數
2.註冊TCP連接異常斷開的回調函數

算了還是畫一下思維導圖把!!!

在這裏插入圖片描述
就是這麼個玩意兒!!

然後我們先來處理 1.註冊TCP連接成功建立的回調函數
在這裏插入圖片描述
**代碼: **

/******************************************************************************
 * FunctionName : ESP8266_TCP_Connect_Cb
 * Description  : TCP連接建立成功的回調函數
 * Parameters   : none
 * Returns      : none
 *******************************************************************************/
void ICACHE_FLASH_ATTR ESP8266_TCP_Connect_Cb(void *arg)
{   
	// 註冊網絡數據發送成功的回調函數
	espconn_regist_sentcb((struct espconn *)arg, ESP8266_WIFI_Send_Cb);
	// 註冊網絡數據接收成功的回調函數
	espconn_regist_recvcb((struct espconn *)arg, ESP8266_WIFI_Recv_Cb);
	// 註冊成功斷開TCP連接的回調函數
	espconn_regist_disconcb((struct espconn *)arg,ESP8266_TCP_Disconnect_Cb);
	os_printf("\n--------------- ESP8266_TCP_Connect_OK ---------------\n");
}

上面如果TCP連接建立成功了 基本上就能傳遞數據了 然後這裏有會出現三個方法(函數), 就是上面的註釋 一些回調函數

思維導圖:
在這裏插入圖片描述

下面是數據 發出去了會回調的函數 就是本機發送

在這裏插入圖片描述
代碼:

/******************************************************************************
 * FunctionName : ESP8266_WIFI_Send_Cb
 * Description  : 成功發送網絡數據的回調函數
 * Parameters   : none
 * Returns      : none
 *******************************************************************************/
void ICACHE_FLASH_ATTR ESP8266_WIFI_Send_Cb(void *arg)
{
	os_printf("\nESP8266_WIFI_Send_OK\n");
}

下面是接受數據的 這裏我們接受到接受到上位機發送的數據然後進行控制端口 GPIO4|5的輸出控制

k1|k2 = 1 就是輸出高
g1|g2 = 1 就是輸出低

在這裏插入圖片描述
代碼:

/******************************************************************************
 * FunctionName : ESP8266_WIFI_Recv_Cb
 * Description  : 成功接收網絡數據的回調函數
 * Parameters   : 【參數1:網絡傳輸結構體espconn指針、參數2:網絡傳輸數據指針、參數3:數據長度】
 * Returns      : none
 *******************************************************************************/
void ICACHE_FLASH_ATTR ESP8266_WIFI_Recv_Cb(void * arg, char * pdata, unsigned short len)
{
	struct espconn * T_arg = arg;		// 緩存網絡連接結構體指針

	// 根據數據設置LED的亮/滅
	//-------------------------------------------------------------------------------
	if((pdata[0] == 'k' || pdata[0] == 'K')&&pdata[1] == '1')	GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);			// 首字母爲'k'/'K',燈亮
	else if((pdata[0] == 'g' || pdata[0] == 'G')&&pdata[1] == '1')GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0);	// 首字母爲'g'/'G',燈滅
	if((pdata[0] == 'k' || pdata[0] == 'K')&&pdata[1] == '2')	GPIO_OUTPUT_SET(GPIO_ID_PIN(5),1);			// 首字母爲'k'/'K',燈亮
	else if((pdata[0] == 'g' || pdata[0] == 'G')&&pdata[1] == '2')GPIO_OUTPUT_SET(GPIO_ID_PIN(5),0);	// 首字母爲'g'/'G',燈滅
	os_printf("\nESP8266_Receive_Data = %s\n",pdata);		// 串口打印接收到的數據

	/*
	// 獲取遠端信息
	//------------------------------------------------------------------------------------
	remot_info * P_port_info = NULL;	// 定義遠端連接信息指針
	if(espconn_get_connection_info(T_arg, &P_port_info, 0)==ESPCONN_OK)	// 獲取遠端信息
	{
		T_arg->proto.tcp->remote_port  = P_port_info->remote_port;	// 獲取對方端口號
		T_arg->proto.tcp->remote_ip[0] = P_port_info->remote_ip[0];	// 獲取對方的IP地址
		T_arg->proto.tcp->remote_ip[1] = P_port_info->remote_ip[1];
		T_arg->proto.tcp->remote_ip[2] = P_port_info->remote_ip[2];
		T_arg->proto.tcp->remote_ip[3] = P_port_info->remote_ip[3];
		//os_memcpy(T_arg->proto.tcp->remote_ip,P_port_info->remote_ip,4);	// 內存拷貝
	}
	*/

	//--------------------------------------------------------------------
	//OLED_ShowIP(24,6,T_arg->proto.tcp->remote_ip);	// 顯示遠端主機IP地址
	//--------------------------------------------------------------------

	//【TCP通信是面向連接的,向遠端主機迴應時可直接使用T_arg結構體指針指向的IP信息】
	//-----------------------------------------------------------------------------------------------
	// 向對方發送應答
	espconn_send(T_arg,"ESP8266_WIFI_Recv_OK",os_strlen("ESP8266_WIFI_Recv_OK"));
}

下面是連接斷開的回調函數:

在這裏插入圖片描述

代碼:
/******************************************************************************
 * FunctionName : ESP8266_TCP_Connect_Cb
 * Description  : TCP連接斷開成功的回調函數
 * Parameters   : none
 * Returns      : none
 *******************************************************************************/
void ICACHE_FLASH_ATTR ESP8266_TCP_Disconnect_Cb(void *arg)
{
	os_printf("\nESP8266_TCP_Disconnect_OK\n");
}

上面就是TCP創建連接成功的一些方法和一些操作步驟,是不是感覺不是很難啊!! 下面我們繼續講




如果連接失敗了就會調用如下函數 註冊TCP連接異常斷開

在這裏插入圖片描述
代碼:

/******************************************************************************
 * FunctionName : ESP8266_TCP_Connect_Cb
 * Description  : TCP連接異常斷開時的回調函數
 * Parameters   : none
 * Returns      : none
 *******************************************************************************/
void ICACHE_FLASH_ATTR ESP8266_TCP_Break_Cb(void *arg,sint8 err)
{
	os_printf("\nESP8266_TCP_Break\n");
}
這裏連接異常我做的Demo 沒有處理,大家可以寫一些重新連接的方法

然後下面我們就寫就是如果沒有連接上WIFI 進入網絡配置的過程

這裏我是用的官方的 smartconfig 配置網絡的方式 不清楚的朋友可以去官方看相關的教程,我這裏就不過多闡述了
在這裏插入圖片描述
在這裏插入圖片描述

這裏我就直接放代碼了!! 不是很難我基本上都加了註釋的 我相信大家應該可以看懂 哈哈!!

/******************************************************************************
 * FunctionName : smartconfig_done
 * Description  : 網絡配置聯網配置
 * Parameters   : none
 * Returns      : none
 *******************************************************************************/

//參數1:sc_status status /參數2:無類型指針【在不同狀態下,[void *pdata]的傳入參數是不同的
void ICACHE_FLASH_ATTR smartconfig_done(sc_status status, void *pdata)
{
	//ESP8266網絡狀態改變
	os_printf("\r\n==== smartconfig_done ====\r\n");
	//判定網絡狀態
	switch(status)
	{
		//CmartConfig等待
		case SC_STATUS_WAIT:	//初始值
			os_printf("\r\nSC_STATUS_WAIT\r\n");
		break;
		// 發現【WIFI信號】(8266在這種狀態下等待配網)
		case SC_STATUS_FIND_CHANNEL:
			os_printf("\r\nSC_STATUS_FIND_CHANNEL\r\n");
			os_printf("\r\n==== Please Use WeChat to SmartConfig ====\r\n");
		break;

		//正在獲取【SSID】【PSWD】(8266正在抓取並解密【SSID+PSWD】)
		case SC_STATUS_GETTING_SSID_PSWD:
			os_printf("\r\nSC_STATUS_GETTING_SSID_PSWD\r\n");
		//【SC_STATUS_GETTING_SSID_PSWD】狀態下,參數2==SmartConfig類型指針
			sc_type *type = pdata;	//獲取【SmartConfig類型】指針
		//配網方式 == 【ESPTOUCH】
			if(*type == SC_TYPE_ESPTOUCH)
			{
				os_printf("\r\nSC_TYPE:SC_TYPE_ESPTOUCH\r\n");
			}
			else
			{
		//配網方式 == 【AIRKISS】 || 【ESPTOUCH_AIRKISS】
				os_printf("\r\nSC_TYPE:SC_TYPE_AIRKISS\r\n");
			}
		break;

		//獲取到【SSID】【PSWD】,保存STA參數,並連接WIFI
		case SC_STATUS_LINK:
			os_printf("\r\nSC_STATUS_LINK\r\n");
		//【SC_STATUS_LINK】狀態下,參數2 == STA參數結構體指針
			struct station_config *sta_conf = pdata;	//獲取【STA參數】指針
		//將【SSID】【PASS】保存到【外部FLASH中】
			//spi_flash_erase_sector(Sector_STA_INFO);
			//spi_flash_write(Sector_STA_INFO*4096,(uint32 *)sta_conf,96);

			wifi_station_set_config(sta_conf);	//設置SAT參數【Flash】
			wifi_station_disconnect();			//斷開STA連接
			wifi_station_connect();				//ESP8266連接WIFI

		break;

		//ESP8266作爲STA,成功連接到WIFI
		case SC_STATUS_LINK_OVER:
			os_printf("\r\nSC_STATUS_LINK_OVER\r\n");

			smartconfig_stop();	//停止SmartConfig,釋放內存

            wifi_get_ip_info(STATION_IF,&ST_ESP8266_IP);	// 獲取8266_STA的IP地址

			ESP8266_IP[0] = ST_ESP8266_IP.ip.addr;		// IP地址高八位 == addr低八位
			ESP8266_IP[1] = ST_ESP8266_IP.ip.addr>>8;	// IP地址次高八位 == addr次低八位
			ESP8266_IP[2] = ST_ESP8266_IP.ip.addr>>16;	// IP地址次低八位 == addr次高八位
			ESP8266_IP[3] = ST_ESP8266_IP.ip.addr>>24;	// IP地址低八位 == addr高八位

			// 顯示ESP8266的IP地址
			os_printf("ESP8266_IP = %d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]);
			spi_flash_erase_sector(Sector_STA_INFO);
			spi_flash_write(Sector_STA_INFO*4096, (uint32 *)ESP8266_IP, sizeof(ESP8266_IP));
			os_printf("\r\n---- TO Flash Successfully ----\r\n");

			os_printf("\r\n---- ESP8266 Connect to WIFI Successfully ----\r\n");

			// WIFI連接成功,執行後續功能。	如:SNTP/UDP/TCP/DNS等

			ESP8266_TCP_NetCon_Init();		// 初始化網絡連接(TCP通信)

		break;
	}
}

網絡配置成功後 代碼裏面

ESP8266_TCP_NetCon_Init(); // 初始化網絡連接(TCP通信) 自動進入tcp初始化
這個時候大家就可以tcp 去連接了!!

8266 這邊我們基本上的代碼就編輯完成了 接下來就是編譯和下載代碼了 這裏我們先編譯

然後編譯代碼 編譯代碼之前先clean project 一遍
在這裏插入圖片描述

記住如果沒有聲明函數 那就一定要把 定義的函數寫在調用的前面 不然會報錯誤,這個不是解釋性語言

在這裏插入圖片描述

好像我這裏有個錯誤 沒有加定時的時間,編譯器報了小錯誤,大家把它加上 在user_init裏面的

在這裏插入圖片描述

最後完成編譯在這裏插入圖片描述

然後我們開始下載程序 大家打開這個軟件:
在這裏插入圖片描述
會彈出個這個玩意兒!!
在這裏插入圖片描述
然後下面的大家找到自己項目下的位置
在這裏插入圖片描述

右邊的地址也按照我這裏寫吧

自己選擇COM端口 波特率 115200

然後點擊START 按下復位鍵 (有的不用按) 然後下面就開始下載

在這裏插入圖片描述
在這裏插入圖片描述

下載完成後重新上電就可以工作了

然後我們來測試一下 看看弄好沒有

然後我這裏還是提供一下最後的源碼吧,以及測試用的app
大家可以在我github上面拿 我給個傳送門:

https://github.com/goundam/ESP8266Remote-switch

打開IDEAT app

在這裏插入圖片描述

然後找到智能配網

在這裏插入圖片描述

然後 輸入wifi密碼

在這裏插入圖片描述在這裏插入圖片描述
然後等待完成
在這裏插入圖片描述
然後退回控制中心
在這裏插入圖片描述

然後點擊 CNNECT 就可以連接到8266了

在這裏插入圖片描述
這裏對應的是程序裏面的這裏
在這裏插入圖片描述
下面是調試的結果

在這裏插入圖片描述

好了 以上就是工程的全部內容 APP 內容留到下一期在講吧!!

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

有覺得我這篇博客有用的 可以來個贊 哈哈哈 總算寫完了!!! 背都寫痛了!!

大家可以加入學習交流羣! (渝興未到科技工作室 Q羣:764284134

有需要板子的我發電路城 :

https://www.cirmall.com/user/3482753

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章