ESP8266透传+智能配网 源码分享

功能介绍:

利用ESP12F模块,完成MCU通过标准的TTL转化成TCP_Client连接服务器。通过发送特定的指令,实现手机智能配网。文章资源链接:https://download.csdn.net/download/L_e_c/13203094

硬件介绍:

主要是连接一个灯,一路串口。供电使用DC-DC芯片。两路按键,复位芯片和设置BOOT电平使用。

ESP8266透传+智能配网 源码分享

ESP8266透传+智能配网 源码分享

软件介绍:

此源码是基于ESP8266 Non-OS SDK,无操作系统的SDK。

ESP8266透传+智能配网 源码分享

在这里我说一下,之前一直做单片机没有做过操作系统的同仁都知道MCU是基于主循环的方式运行的,就是有main函数,先是初始化,然后就是while(1)的大循环,没有中断的情况下都是在大循环里一直跑程序。SDK编程程序架构:基于内核回调的方式。在工程文件的user_main.c的文件中,void ICACHE_FLASH_ATTR user_init(void);函数是ESP8266内核为用户提供的初始化接口,此函数可以设置IO口,定时器,以及中断、回调函数等等,关于代码结构要注意的:

ESP8266透传+智能配网 源码分享

芯片启动后运行流程: 

ESP8266上电后的运行流程:
启动
{
	内核初始化...
	user_init();	//用户初始化
	while(1)
	{
		执行内核功能...
		执行用户功能... //主要是处理一些定时,任务函数等等
	}
}

初始化代码如下: 

// user_init:entry of user application, init user function here
//==============================================================================
void ICACHE_FLASH_ATTR user_init(void)
{
	uart_init(115200,115200);	// 初始化串口波特率,设置串口0,串口1
	os_delay_us(10000);			// 等待串口稳定
	os_printf("\r\n=================================================\r\n");
	os_printf("\t Project:\t%s\r\n", ProjectName); 	//打印工程名
	os_printf("\t SDK version:\t%s", system_get_sdk_version());	//打印源码版本
	os_printf("\r\n=================================================\r\n");

	LED_Init();		// LED初始化


	ESP8266_STA_Init();			// ESP8266_STA初始化

	OS_Timer_1_Init(1000,1);		// 1秒定时
	OS_Timer_2_Init(1000,1);		// 1秒定时
}

 各个功能初始化函数:

// LED初始化
//=============================================================================
void ICACHE_FLASH_ATTR LED_Init(void)
{
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,	FUNC_GPIO4);	// GPIO4设为IO口

	GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);						// IO4 = 1
}
// ESP8266_STA初始化
//==============================================================================
void ICACHE_FLASH_ATTR ESP8266_STA_Init()
{
	struct station_config STA_Config;	// STA参数结构体

	struct ip_info ST_ESP8266_IP;		// STA信息结构体

	// 设置ESP8266的工作模式
	//------------------------------------------------------------------------
	wifi_set_opmode(0x01);				// 设置为STA模式,并保存到Flash

	// ESP8266读取【外部Flash】中的【STA参数】(SSID/PASS),作为STA,连接WIFI
	//………………………………………………………………………………………………………………………………
	os_memset(&STA_Config,0,sizeof(struct station_config));			// STA_Config = 0
	spi_flash_read(Sector_STA_INFO*4096,(uint32 *)&STA_Config, 96);	// 读出【STA参数】(SSID/PASS)
	STA_Config.ssid[31] = 0;		// SSID最后添'\0'
	STA_Config.password[63] = 0;	// APSS最后添'\0'
	os_printf("\r\nSTA_INFO.ssid=%s\r\nSTA_INFO.password=%s\r\n",STA_Config.ssid,STA_Config.password);

	wifi_set_opmode(0x01);					// 设置为STA模式,并保存到Flash
	wifi_station_set_config(&STA_Config);		// 设置STA参数
}
// 软件定时器初始化(ms毫秒)
//=====================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_Init(u32 time_ms, u8 time_repetitive)
{
	os_timer_disarm(&OS_Timer_1);	// 关闭定时器
	os_timer_setfn(&OS_Timer_1,(os_timer_func_t *)OS_Timer_1_cb, NULL);	// 设置定时器
	os_timer_arm(&OS_Timer_1, time_ms, time_repetitive);  // 使能定时器
}
// 软件定时器初始化(ms毫秒)
//=====================================================================================
void ICACHE_FLASH_ATTR OS_Timer_2_Init(u32 time_ms, u8 time_repetitive)
{
	os_timer_disarm(&OS_Timer_2);	// 关闭定时器
	os_timer_setfn(&OS_Timer_2,(os_timer_func_t *)OS_Timer_2_cb, NULL);	// 设置定时器
	os_timer_arm(&OS_Timer_2, time_ms, time_repetitive);  // 使能定时器
}

软件定时器1回调函数: 

当无法连上网络后,自动进入智能配网模式。

// 软件定时的回调函数
//=========================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
//	u8 C_LED_Flash = 0;				// LED闪烁计次
	u8 S_WIFI_STA_Connect;			// WIFI接入状态标志


		// 查询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,连接成功
		//---------------------------------------------------
	if( S_WIFI_STA_Connect == STATION_GOT_IP )	// 判断是否获取IP
	{
		wifi_get_ip_info(STATION_IF,&ST_ESP8266_IP);	// 获取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]);
//		OLED_ShowIP(24,2,ESP8266_IP);	// OLED显示ESP8266的IP地址
		//-----------------------------------------------------------------------------------------------

		// 接入WIFI成功后,LED快闪3次
		//----------------------------------------------------
		for(; C_LED_Flash<=5; C_LED_Flash++)
		{
			GPIO_OUTPUT_SET(GPIO_ID_PIN(4),(C_LED_Flash%2));
			delay_ms(100);
		}


		os_timer_disarm(&OS_Timer_1);	// 关闭定时器


		ESP8266_NetCon_Init_JX();		// 初始化网络连接(TCP通信)
	}
	// ESP8266无法连接WIFI
		//------------------------------------------------------------------------------------------------
	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");

		// 微信智能配网设置
		//…………………………………………………………………………………………………………………………
		//wifi_set_opmode(STATION_MODE);			// 设为STA模式						//【第①步】

		smartconfig_set_type(SC_TYPE_ESPTOUCH_AIRKISS); 	// ESP8266配网方式【AIRKISS】			//【第②步】

		smartconfig_start(smartconfig_done);	// 进入【智能配网模式】,并设置回调函数	//【第③步】
		//…………………………………………………………………………………………………………………………
	}
}

 软件定时器2回调函数: 

定时一秒钟回调一次,检测智能配网标志位是否置位,置位之后软重启。让Smart_Config置位目前是接收串口特定指令置位,之后可以做成检测特定按键配网。

//=========================================================================================================
// 软件定时的回调函数
//=========================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_2_cb(void)
{
	if(Smart_Config==1)
	{
		os_printf("\r\n---- 01-----------\r\n");
		spi_flash_erase_sector(Sector_STA_INFO);
		system_restart();
//		if(wifi_station_disconnect())
//		{
//			os_printf("\r\n---- 02-----------\r\n");
//			Smart_Config=0;
//			os_timer_disarm(&OS_Timer_2);
//			delay_ms(100);
//			wifi_set_opmode(STATION_MODE);
//			smartconfig_set_type(SC_TYPE_AIRKISS); 	// ESP8266配网方式【AIRKISS】			//【第②步】
//
//			smartconfig_start(smartconfig_done);	// 进入【智能配网模式】,并设置回调函数	//【第③步】
//
//		}

	}
}

软件部分暂时先分享这么多,程序源码里还有关于网络数据接收,解析和串口数据接收解析,感兴趣的同仁可以下载资源链接查看,使用的是 安信可的IDE开发的。

程序下载:

使用flash_download_tools_v3.6.8工具下载

ESP8266透传+智能配网 源码分享

 按照上面步骤找到下载文件并填写正确的下载地址,选中右下角的串口号,点击START,然后同时按下BOOT键和RST键,然后先释放RST键再释放BOOT键,观察进度条开始走动,就可以等待下载成功了。

测试结果:

下图左侧为网络调试调试助手,放在服务器上。目前连接的服务器和端口是在网络初始化的时候写的固定值,可以查看源码,之后可以考虑使用网页配置或者其他方式配置。右图为串口调试助手,打印出来的调试数据,和接收到的网络上的数据 ‘[’;

ESP8266透传+智能配网 源码分享

总结:

 以上就是WiFi模块作为串口透传联网的资源分享,只要熟悉了之后,硬件软件都是很好上手,目前关于这款芯片的开发方式也有很多,可以多多参考。作为家用物联网设备,ESP8266是特别合适DIY。后面我还会分享“手机通过网络控制家用电器开关(使用的是ESP32)”,感兴趣的可以看看把它做在什么应用上,可以私信我讲。写的不好,请多多指教。

上一篇:UOJ61. 【UR #5】怎样更有力气


下一篇:二、Crazepony1无人机源码分析-(4)接受遥控器的数据