基于ESP2866的远程控制开关(ESP8266 部分)

关于ESP8266的远程开关控制器 (渝兴未到工作室)

今天我们来做一个项目基于ESP88266开发的一款 远程控制开关项目!!小白也可以跟着做。

欢迎加入我们的交流群 :764284134

基于ESP2866的远程控制开关(ESP8266 部分)_第1张图片

首先项目采用的是局域网控制的!当然能内网穿透的那就是远程控制!!然后采用的是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

安装完就是这两个玩意儿
基于ESP2866的远程控制开关(ESP8266 部分)_第2张图片
然后我们用的芯片模组是安信可的 ESP-12F模块 (应该算是比较经典的模块了吧!!) 就长这样!!
基于ESP2866的远程控制开关(ESP8266 部分)_第3张图片
好 大家软件安装完成了 了下面我们就开始开发了!!打开IDE
基于ESP2866的远程控制开关(ESP8266 部分)_第4张图片
还是一样的要配置工程 这里节约时间我这边就给大家一个配置好了的!大家直接来拿用就是了
地址:https://github.com/goundam/ESP8266Remote-switch
也可以在百度网盘下载 :
链接:https://pan.baidu.com/s/1SuMF_z5g2aRMHMP2zNO3BQ
提取码:rbjt

下载好解压然后我们开始打开项目

基于ESP2866的远程控制开关(ESP8266 部分)_第5张图片

右键 导入项目

基于ESP2866的远程控制开关(ESP8266 部分)_第6张图片

选择外部文件项目,点击next

基于ESP2866的远程控制开关(ESP8266 部分)_第7张图片

浏览到刚才下载解压的文件,选择Cygwin GCC,然后点击finish

基于ESP2866的远程控制开关(ESP8266 部分)_第8张图片

然后我们的项目就导入进来了

基于ESP2866的远程控制开关(ESP8266 部分)_第9张图片

然后我们展开文件 找到main.c 里面的一些环境配置我都处理了 大家拿着不用想太多 直接用就是了。

基于ESP2866的远程控制开关(ESP8266 部分)_第10张图片

找到user_init(void) 我们自己写代码的入口

基于ESP2866的远程控制开关(ESP8266 部分)_第11张图片#### 为了验证文件的完整性我们就先编译一下
基于ESP2866的远程控制开关(ESP8266 部分)_第12张图片

编译成功后就向这个样子!! 如果报错了 请检查文件的完整性

基于ESP2866的远程控制开关(ESP8266 部分)_第13张图片

好了我们接着往下面走!! 既然是做远程控制,我们就先来分配底层,先要确认我们要使用什么东西!!这样才便于编程!!

这里我先还是给一张引脚的图片把 免得大家不知道是在那点的
基于ESP2866的远程控制开关(ESP8266 部分)_第14张图片
我们用这三个引脚 GPIO12 用来清除保存的wifi数据(用户名密码什么的,项目会设置自动连接),GPIO5|GPIO4用来做输出用
下面我给出GPIO的输入输出配置:
基于ESP2866的远程控制开关(ESP8266 部分)_第15张图片

代码在这里:

	//将 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 问问
然后接下来我们就配置输入中断,多写点功能便于大家学习和使用 配置见下图
下面就是中断的配置 需要咱们自己创建一个中断回调函数(当中断产生时调用的函数)
基于ESP2866的远程控制开关(ESP8266 部分)_第16张图片

代码如下:

/*************************** 中断配置 ****************************************/
	//关闭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-------高电平沿中断

继续往下面走 咱们注册中断里面 需要注册一个中断函数

如下图:
基于ESP2866的远程控制开关(ESP8266 部分)_第17张图片
代码还是如下: 大家可以看看 注释基本上都有不懂得 可以入交流群: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);	
	}
}

基于ESP2866的远程控制开关(ESP8266 部分)_第18张图片

这里里面的sector_STA_INFO 是一个宏定义

如下图: 现需要大家定义一下,这个地址用来存放我们的wifi名称和密码,下次开机如果这里存了值的就直接连接
基于ESP2866的远程控制开关(ESP8266 部分)_第19张图片

#define	 Sector_STA_INFO	0x80	//【STA参数】保存扇区



继续继续!! 药不能停!!
接下来我们来配置WIFI网络模式这里我们用的是做连接热点的客服端 也就是STA的客服端可以理解成为下图:
基于ESP2866的远程控制开关(ESP8266 部分)_第20张图片
好了 这里我们用个函数来初始化,这里第一个我们要配置STA的模式,然后我们需要用一个定时器来计时来读取当我定时时间到的时候8266 是否有读取到ip 当然定时器也是回调处理的
基于ESP2866的远程控制开关(ESP8266 部分)_第21张图片
代码:

/*************************** STA和时钟配置 ***********************************/
	//初始化STA模式
	M_ESP8266_Init_STA();
	//配置并运行Timer1
	OS_Timer_1_Init();

下面我们先来看看STA的初始化函数把
基于ESP2866的远程控制开关(ESP8266 部分)_第22张图片
这个初始化函数的意思就是 从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)); //初始化 清空结构体
这句话 我们需要定义结构体 就像这样
基于ESP2866的远程控制开关(ESP8266 部分)_第23张图片

代码:

struct station_config STA_INFO;     //结构体 STA信息

把8266设置为STA模式 完成了 接下来我们开始 配置定时器 还是一样 设置回调函数要关闭然后配置函数完了后再开启
基于ESP2866的远程控制开关(ESP8266 部分)_第24张图片
代码:

/******************************************************************************
 * 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);
}

这里也要定义一个全局变量软件定时类型变量

基于ESP2866的远程控制开关(ESP8266 部分)_第25张图片

代码 :

os_timer_t OS_Timer_1;			// 定义定时器全局变量

接下来我们继续来写定时器的回调函数 OS_Timer_1_INTERRUPT

如下图:
基于ESP2866的远程控制开关(ESP8266 部分)_第26张图片
回调函数大概功能就是说 当定时器到了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 里面基本上就是这些函数

基于ESP2866的远程控制开关(ESP8266 部分)_第27张图片

下面我继续初始化完了 现在 我们就有两种状态 一种是直接获取到wifi账号密码可以配置TCP,另外一种就是不能获取到WiFi账号密码 需要网络配置。

我们先来解决第一种如果连接上了wifi 配置TCP通信 我们这边是做的TCP_SERVER 服务等待客户端的相应
下面是初始化配置:
基于ESP2866的远程控制开关(ESP8266 部分)_第28张图片

代码:
/******************************************************************************
 * 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具体的配置 就是上图报红位置

基于ESP2866的远程控制开关(ESP8266 部分)_第29张图片

代码:

struct espconn ST_NetCon;		    	// 网络连接结构体

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

在上面TCP初始创建成功后 又会出现两个分支

1.注册TCP连接成功建立的回调函数
2.注册TCP连接异常断开的回调函数

算了还是画一下思维导图把!!!

基于ESP2866的远程控制开关(ESP8266 部分)_第30张图片
就是这么个玩意儿!!

然后我们先来处理 1.注册TCP连接成功建立的回调函数
基于ESP2866的远程控制开关(ESP8266 部分)_第31张图片
**代码: **

/******************************************************************************
 * 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连接建立成功了 基本上就能传递数据了 然后这里有会出现三个方法(函数), 就是上面的注释 一些回调函数

思维导图:
基于ESP2866的远程控制开关(ESP8266 部分)_第32张图片

下面是数据 发出去了会回调的函数 就是本机发送

基于ESP2866的远程控制开关(ESP8266 部分)_第33张图片
代码:

/******************************************************************************
 * 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 就是输出低

基于ESP2866的远程控制开关(ESP8266 部分)_第34张图片
代码:

/******************************************************************************
 * 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"));
}

下面是连接断开的回调函数:

基于ESP2866的远程控制开关(ESP8266 部分)_第35张图片

代码:
/******************************************************************************
 * 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连接异常断开

基于ESP2866的远程控制开关(ESP8266 部分)_第36张图片
代码:

/******************************************************************************
 * 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 配置网络的方式 不清楚的朋友可以去官方看相关的教程,我这里就不过多阐述了
基于ESP2866的远程控制开关(ESP8266 部分)_第37张图片
基于ESP2866的远程控制开关(ESP8266 部分)_第38张图片

这里我就直接放代码了!! 不是很难我基本上都加了注释的 我相信大家应该可以看懂 哈哈!!

/******************************************************************************
 * 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 一遍
基于ESP2866的远程控制开关(ESP8266 部分)_第39张图片

记住如果没有声明函数 那就一定要把 定义的函数写在调用的前面 不然会报错误,这个不是解释性语言

基于ESP2866的远程控制开关(ESP8266 部分)_第40张图片

好像我这里有个错误 没有加定时的时间,编译器报了小错误,大家把它加上 在user_init里面的

基于ESP2866的远程控制开关(ESP8266 部分)_第41张图片

最后完成编译基于ESP2866的远程控制开关(ESP8266 部分)_第42张图片

然后我们开始下载程序 大家打开这个软件:
基于ESP2866的远程控制开关(ESP8266 部分)_第43张图片
会弹出个这个玩意儿!!
基于ESP2866的远程控制开关(ESP8266 部分)_第44张图片
然后下面的大家找到自己项目下的位置
基于ESP2866的远程控制开关(ESP8266 部分)_第45张图片

右边的地址也按照我这里写吧

自己选择COM端口 波特率 115200

然后点击START 按下复位键 (有的不用按) 然后下面就开始下载

基于ESP2866的远程控制开关(ESP8266 部分)_第46张图片
基于ESP2866的远程控制开关(ESP8266 部分)_第47张图片

下载完成后重新上电就可以工作了

然后我们来测试一下 看看弄好没有

然后我这里还是提供一下最后的源码吧,以及测试用的app
大家可以在我github上面拿 我给个传送门:

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

打开IDEAT app

基于ESP2866的远程控制开关(ESP8266 部分)_第48张图片

然后找到智能配网

基于ESP2866的远程控制开关(ESP8266 部分)_第49张图片

然后 输入wifi密码

基于ESP2866的远程控制开关(ESP8266 部分)_第50张图片基于ESP2866的远程控制开关(ESP8266 部分)_第51张图片
然后等待完成
基于ESP2866的远程控制开关(ESP8266 部分)_第52张图片
然后退回控制中心
基于ESP2866的远程控制开关(ESP8266 部分)_第53张图片

然后点击 CNNECT 就可以连接到8266了

基于ESP2866的远程控制开关(ESP8266 部分)_第54张图片
这里对应的是程序里面的这里
基于ESP2866的远程控制开关(ESP8266 部分)_第55张图片
下面是调试的结果

基于ESP2866的远程控制开关(ESP8266 部分)_第56张图片

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

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

有觉得我这篇博客有用的 可以来个赞 哈哈哈 总算写完了!!! 背都写痛了!!

大家可以加入学习交流群! (渝兴未到科技工作室 Q群:764284134

有需要板子的我发电路城 :

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

你可能感兴趣的:(ESP8266)