功能介绍:
利用ESP12F模块,完成MCU通过标准的TTL转化成TCP_Client连接服务器。通过发送特定的指令,实现手机智能配网。文章资源链接:https://download.csdn.net/download/L_e_c/13203094
硬件介绍:
主要是连接一个灯,一路串口。供电使用DC-DC芯片。两路按键,复位芯片和设置BOOT电平使用。
软件介绍:
此源码是基于ESP8266 Non-OS SDK,无操作系统的SDK。
在这里我说一下,之前一直做单片机没有做过操作系统的同仁都知道MCU是基于主循环的方式运行的,就是有main函数,先是初始化,然后就是while(1)的大循环,没有中断的情况下都是在大循环里一直跑程序。SDK编程程序架构:基于内核回调的方式。在工程文件的user_main.c的文件中,void ICACHE_FLASH_ATTR user_init(void);函数是ESP8266内核为用户提供的初始化接口,此函数可以设置IO口,定时器,以及中断、回调函数等等,关于代码结构要注意的:
芯片启动后运行流程:
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工具下载
按照上面步骤找到下载文件并填写正确的下载地址,选中右下角的串口号,点击START,然后同时按下BOOT键和RST键,然后先释放RST键再释放BOOT键,观察进度条开始走动,就可以等待下载成功了。
测试结果:
下图左侧为网络调试调试助手,放在服务器上。目前连接的服务器和端口是在网络初始化的时候写的固定值,可以查看源码,之后可以考虑使用网页配置或者其他方式配置。右图为串口调试助手,打印出来的调试数据,和接收到的网络上的数据 ‘[’;
总结:
以上就是WiFi模块作为串口透传联网的资源分享,只要熟悉了之后,硬件软件都是很好上手,目前关于这款芯片的开发方式也有很多,可以多多参考。作为家用物联网设备,ESP8266是特别合适DIY。后面我还会分享“手机通过网络控制家用电器开关(使用的是ESP32)”,感兴趣的可以看看把它做在什么应用上,可以私信我讲。写的不好,请多多指教。