买正点原子的开发板时送了一块ESP8266wifi模块,一直没使用,最近几天刚好有时间就拿出来玩了一下,现在实现过程分享出来。
用到的模块:
1.STM32F103C8T6最小系统板
2.正点原子ESP8266wifi模块
3.USB转串口模块
整体连接图
ESP8266模块与单片机引脚连接关系 :
STM32F103C8T6最小系统 | ESP8266 模块 |
5V | VCC |
GND | GND |
PB11(USART3_RX) | TXD |
PB10(USATR3_TX) | RXD
|
ESP8266模块的RST引脚和ID_0引脚悬空,可以不用管。
串口模块与单片机引脚连接关系 :
STM32F103C8T6最小系统 | USB转串口TTL模块 |
PA9(USART1_TX) | RXD |
PA10(USART1_RX) | TXD |
GND | GND |
USB转串口模块连接到单片机的串口1上,单片机串口1用来作为调试端口,监控程序的执行过程。ESP8266模块连接到单片机串口3上,串口3用来实现与wifi模块的通信。
具体实现的功能是:单片机通过wifi模块连接上原子云,并实时向云端发送数据。通过云端可以向单片机发送 “led on”、“led off”、“led toggle”指令,实现开发板上LED灯的点亮、熄灭、翻转。
串口1监控数据结果
原子云上监控数据
通过原子云上位机测试软件监控
通过手机上原子云客户端监控:
通过网页、上位机软件、手机客户端可以向单片机发送 “led on”、“led off”、“led toggle”指令,实现开发板上LED灯的点亮、熄灭、翻转。基本实现的功能就这些,下面说一下实现思想。
ESP8266模块的驱动代码是在野火【WiFi_ESP8266】模块资料上修改的,具体下载地址:https://ebf-products.readthedocs.io/zh_CN/latest/module/wifi/esp8266.html
正点原子ESP8266wifi模块相关资料下载地址:http://www.openedv.com/thread-308397-1-1.html
通过单片机控制ESP8266模块连接原子云的过程和直接通过串口调试ESP8266模块的过程差不多,实现流程如下:
1.向模块发送测试指令 向模块发生指令: AT 模块回复指令: OK2.设置模块模式为STA模式 向模块发生指令: AT+CWMODE=1 模块回复指令: OK3.设置要连接热点的 ID 和密码 向模块发生指令: AT+CWJAP=“enbiens”,”EB88858804” 模块回复指令: OK4.连接原子云 发送设备编号和密码 向模块发生指令: AT+ATKCLDST,"12345678" 模块回复指令: CLOUD CONNECTED 只需要4步就可以连接到原子云上,ESP8266模块要连接原子云必须要刷原子云的固件,否则最后一步连接原子云的命令是识别不了的。
首先发送测试命令,判断模块与单片机的连接状态是否正常,模块连接正常后就可以发送设置命令了。第二步设置模块为station模式,也就是设置模块为从机。第三步连接路由器,发送wifi名称和密码,连接上wifi后,模块就可以通过路由器连接到互联网上了。最后连接原子云,直接发送原子云上的设备编号和密码接可以了。这个原子云的设备编号是在原子云网站https://cloud.alientek.com/注册的时候会默认分配一个设备编号,密码自己在原子云上可以设置。
要用单片机控制ESP8266模块的关键就是要用代码实现向ESP8266模块发送指令,在野火提供的例子中已经实现了这个函数的封装。
/*
* 函数名:ESP8266_Cmd
* 描述 :对WF-ESP8266模块发送AT指令
* 输入 :cmd,待发送的指令
* reply1,reply2,期待的响应,为NULL表不需响应,两者为或逻辑关系
* waittime,等待响应的时间
* 返回 : 1,指令发送成功
* 0,指令发送失败
* 调用 :被外部调用
*/
bool ESP8266_Cmd ( char * cmd, char * reply1, char * reply2, u32 waittime )
{
strEsp8266_Fram_Record .InfBit .FramLength = 0; //接收缓冲区数据长度清0
macESP8266_Usart ( "%srn", cmd ); //向模块发送命令
if ( ( reply1 == 0 ) && ( reply2 == 0 ) ) //不需要接收数据
return true;
Delay_ms ( waittime ); //延时 等待接收模块返回的指令
strEsp8266_Fram_Record .Data_RX_BUF [ strEsp8266_Fram_Record .InfBit .FramLength ] = '