一、简介
ESP8266:芯片
ESP8266-NodeMCU:方便对ESP8266芯片操作。
模块内嵌TCP/IP协议栈,可以实现串口、WIFI之间的数据转换传输。
产品特性
支持无线802.11b/g/n三种标准 支持STA/AP+STA+AP三种工作模式 支持TCP/IP协议栈,支持多路TCP Client连接 内置丰富的Socket AT指令 支持UART/GPIO数据通信接口 支持Smart Link 智能联网功能 适合电池供电应用 3.3V单电源供电
1、ATK-MW8266D 引脚功能
注意:IO_0引脚用于固件烧写,低电平有效。
2、ATK-ESP-01引脚功能
3、串口配置
默认UART通讯配置参数
参数 | 参数值 |
---|---|
波特率 | 115200bps |
数据位 | 8 |
停止位 | 1 |
校验位 | 无 |
4、工作模式
(1)STA
在此模式下,ATK-MW8266D 模块可连接其他设备提供的无线网络,例如通过 WIFI 连接至路由器,从而可以访问互联网,进而实现手机或电脑通过互联网实现对设备的远程控制。STA也可以理解为终端的意思,每一个连接到无线网络中的终端(例如笔记本电脑,芯片等其他可以联网的设备)都可以成为一个STA站点。
通俗:在此模式下,该模块相当于一个用户,需要链接外部的wifi(或自己的热点),通过链接的WiFi进行与其他设备的通信。
(2)AP
AP是无线接入点,是一个无线网络的创建者,是网络的中心节点。板块自身充当路由器角色,可以产生热点由其他设备查询到并接入。
通俗:在此模式下,该模块相当于提供了一个热点,创建一个小范围的局域网,只要和他连接就能与其进行通信。
(3)STA+AP
该模式为 STA 模式与 AP 模式共存的一种模式,ATK-MW8266D 模块既能连接至其他
设备提供的无线网络,又能作为热点,供其他设备连接,以实现广域网与局域网的无缝切换,
方便操作使用。
5、AT指令说明
通过串口将AT指令传输到ESP8266中去,ESP8266便可以开始工作;后面的单片机控制,也是通过AT指令对模块进行作用。
AT指令可以细分为四种类型,如表所示:
类型 | 指令格式 | 描述 |
---|---|---|
测试类型 | AT+< CMD >=? | 该命令用于查询设置指令的参数以及取值范围 |
查询类型 | AT+< CMD >? | 该命令用于返回参数的当前值 |
设置类型 | AT+< CMD >=<...> | 该命令用于设置用户自定义的参数值 |
执行类型 | AT+< CMD > | 该命令用于执行受模块内部程序控制,且参数不可变的功能。 |
注意:①注意串口RXD,TXD线的连接
②是否需要对模块进行固件烧录
③AT指令必须大写,且每条指令都需以回车换行符结尾“\r\n”;
④串口波特率与模块是否一致。
⑤ 使用双引号表示字符串数据,例如:AT+CWJAP=”ALIENTEK”,”15902020353”。
二、固件烧录
1、需要的资料
2、硬件连接
①串口:ESP8266的串口引脚与开发板的USART1串口进行交叉连接 (TXD--RXD) (RXD--TXD)。
②电源:VCC接5v,GND接地,IO_0需要连接至GND;
IO_0引脚用于固件烧写,低电平有效。
3、硬件连接
3.1 打开“flash_tool”软件
选择“chip Type(芯片类型)”为“ESP8266”、"workMode(工作模式)"为”develop“,如下图所示:
3.2 点击擦除“ERASE”
配置好模式并进入软件后,选择待烧录固件的bin文件,并设置好bin文件烧录至芯片的地址信息,一定要打勾,然后选择下面的串口,首先先擦除ERASE。
3.3 擦除成功后,点击“START”
3.4 “START”成功后的信息
注意:烧写成功后一定要重启ESP8266,然后拔掉IO_0。
3.5 START显示成功后,使用串口助手
输入“AT"指令,注意换行,只要串口助手回复”OK“,表明固件烧写成功。
三、TCP透传实验
(1)配置模块为AP模式并且模块作为服务器
指令集:
AT+CWMODE=2//设置AP模式
AT+RST//重启⽣效
AT+CWSAP="ATK-MW8266D","12345678",1,4//设置 AP 参数。SSID 为 ATK-MW8266D、密
码为 12345678、 通道为 1、加密方式为 WPA_WPA2_PSK
AT+CIPMUX=1//开启多连接
AT+CIPSERVER=1,8086//开启 SERVER 模式,端⼝号为 8086
注:AT 指令必须⼤写,且每条指令都需以回⻋换⾏符结尾
3.1.1 命令截图
① AT+CWMODE=2
② AT+RST
③ AT+CWSAP="ATK-MW8266D","12345678",1,4
④ AT+CIPMUX=1
⑤ AT+CIPSERVER=1,8086
3.1.2 配置完成后,显示对应WIFI
密码就是12345678
(1)手机下载网络调试精灵。
(2)打开“网络调试精灵”,点击客户端
(3)在手机给电脑发送数据前,首先需要使用串口去查找主机号(主机的ip地址):AT+CIFSR
(4)填写主机号和端口号
(5)显示连接成功
(6)手机发送信息给主机
通过串口接受信息
(7)主机要是给主机发送信息,需要输入指令"AT+CIPSEND=0,5",0表示从机的ip,5表示发送多少数据。
以上便是,在AP模式下,ESP8266作为服务器双方通信的建立;
从机断开连接会显示如下图所示
如下图所示,是手机上接收到的信息
(2) 配置板块为AP模式并且作为客户端
指令集:
AT+CWMODE=2//设置为 AP 模式
AT+RST//重启⽣效
AT+CWSAP="ATK-MW8266D", "12345678",1,4//设置 AP 参数。SSID 为 ATK-MW8266D、密
码为 12345678、 通道为 1、加密⽅式为 WPA_WPA2_PSK
AT+CIPMUX=0//开启单连接
AT+CIPSTART="TCP","192.168.4.xxx",8086//建⽴ TCP 连接到 192.168.4.XXX:8086
AT+CIPMODE=1//开启透传模式(仅单连接 Client 时⽀持)
AT+CIPSEND//开始发送数据
3.2.1 命令截图
①②③和上面(1)是一样的。
④开启单连接
⑤建立TCP连接
⑥开启透传模式
⑦开始发送数据
①这里都是手机(服务器端)给电脑(客户端)发的信息,在一个缓冲区中(可能是没有换行)。
当手机(服务端)建立成功后,一直在监听事件。后面有人连接他,会发送http报头(类似三次握手四次挥手的connect操作),后续主从机交互信息,在此期间,只要从机不断开连接,④就不会消失。
如图所示是断开连接后的,④就会消失。
易错点:一定要关闭防火墙,不然连不上。还有手机和电脑必须连上同一个网络就是下图这个
(3) 配置模块为STA模式并且作为服务器
指令集:
AT+CWMODE=1//设置为 STA 模式
AT+RST//重启⽣效
AT+CWLAP //显示目前可以搜到的WIFI信号
AT+CWJAP=”ATK-MW8266D”, ”12345678”//加⼊ WiFi 热点。SSID:ATK-MW8266D、密码:
12345678
AT+CIPMUX=1//开启多连接
AT+CIPSERVER=1,8086//开启 SERVER 模式,端⼝号为 8086
AT+CIPSEND=0,5//向 ID0 发送 5 字节数据包
3.3.1命令截图
①设置为STA模式
②重启
③显示目前可以搜到的WIFI信号
④加⼊ WiFi 热点。SSID:xxx 密码:xxx
注意:AT+CWJAP=后面跟的是你要连接的热点和密码,这个和AP不一样,而且这个WIFI的AP频段是2.4GHz不是5 GHz!!!
⑤开启多连接
⑥开启 SERVER 模式,端⼝号为 8086
⑦连接客户端
其中,主机号依旧是利用:AT+CIFSR 查询;端口号,8086;
⑧给客户端回复数据
(4) 配置模块为STA模式并且作为客户端
指令集:
AT+CWMODE=1//设置为STA 模式
AT+RST//重启⽣效
AT+CWJAP=”ATK-MW8266D”, ”12345678”//加⼊ WiFi 热点。SSID:ATK-MW8266D、密码:
12345678
AT+CIPMUX=0//开启单连接
AT+CIPSTART=”TCP”, ”192.168.4.XXX”,8086//建⽴ TCP 连接到 192.168.4.XXX:8086
AT+CIPMODE=1//开启透传模式(仅单连接 Client 时⽀持)
AT+CIPSEND//开始发送数据
3.4.1 命令截图
①加入WIFI热点
②开启单连接
③建立TCP连接
重点:AT+CIPSTART=此处需要填的是手机端的IP(自动生成)与端口号(端口号自行设置);此时ESP8266作为客户端。它需要主动去连接手机;
错误示范:
连接一个已经关闭的服务器端,会显示ERROR信息,并告诉客户端这个服务器端关闭
正确操作:
④开启透传模式(仅单连接 Client 时⽀持)
⑤开始发送数据
四、连接原子云服务器
4.1 创建设备
原子云的网址:原子云-用户登录创建并登入账号;
接着在弹出的窗口中,根据 ATK-MW8266D 模块的设备类型选择“ESP8266”
随后根据个人喜好填入“设备名称”和“密码”(这里的密码在就是 ATK-MW8266D 模块通过 AT
指令连接原子云时需要的密码),如下图所示:
最后,点击“新增”按钮,即可创建设备,设备创建好后,如下图所示:
创建好设备后,系统会自动为设备生成编号,这个设备编号就是 ATK-MW8266D 模块
使用 AT 指令连接原子云时需要的设备 ID。
4.2 连接原子云
创建好设备后,系统会自动为设备生成编号,这个设备编号就是 模块 使用 AT 指令连接原子云时需要的设备 ID。
创建好设备后,就能后根据设备的编号和密码并通过 AT 指令操作 ATK-MW8266D 模块
连接原子云了。具体的 AT 指令如下所示:
AT+CWMODE=1 /* 使能 ATK-MW8266D 模块的 STA 模式,以连接路由器的 AP */
AT+CWJAP=”ALIENTEK-YF”,”15902020353” /* 连接路由器的 AP,以访问互联网 */
AT+ATKCLDSTA=”71103822668332005526”,”12345678” /* 连接原子云服务器 */
注意:连接原子云服务器时那个命令后面不能有空格,我就是因为这个原因卡了好长时间
当串口调试助手显示“CLOUD CONNECTED”后,说明已成功连接上原子云服务器, 此时在原子云的设备管理界面,也能够看到对应的设备显示为“已连接”的连接状态,如下图所示:
4.3 发送信息
当模块成功连接原子云服务器后,即进入了透传模式,此时就能够在原子云的对应设备的“消息收发”操作界面通过原子云服务器发送消息至模块,同时,也能后在该界面下,查看到接收自 模块的消息.
五、串口与AT指令
通过usart3发送AT指令,然后通过Usart3接收口接受回的OK
#include "stm32f4xx.h" // Device header
#include "stdio.h"
#include "stdlib.h"uint8_t num = 0;
uint8_t buf[256];
uint8_t flag = 0;void My_UsartInit(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitTypeDef GPIO_InitStructure1;USART_InitTypeDef USART_InitStructure;/*使能GPIOA 的时钟*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);/*使能串口1 的时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //设置GPIO为复用模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置GPIO速率为50MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //不使用上拉,下拉GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIO Pin 设置GPIO_Init(GPIOA,&GPIO_InitStructure); //GPIOA_9 初始化GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure1);/* 多功能引脚的配置,将PA9和PA10连接到串口1 */GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1); GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);USART_InitStructure.USART_BaudRate = 115200; //波特率的配置USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位的数据位USART_InitStructure.USART_StopBits = USART_StopBits_1; //1个停止位USART_InitStructure.USART_Parity = USART_Parity_No; //无校验USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //支持数据的发送与接收USART_Init(USART1, &USART_InitStructure);USART_Cmd(USART1,ENABLE); //使能串口
}//重定向printf
int fputc(int ch, FILE *f)
{USART_SendData(USART1,ch);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET); return ch;
}
void Usart1_SendString(uint8_t *string)
{uint8_t i;for(i = 0; string[i] != '\0'; i++){USART_SendData(USART1,string[i]);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);}
}
/********************************************初始化USART3 相关USART3_TX: 向模块发送AT指令USART3_RX: 接收模块返回的应答号
*/
void My_Usart3Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitTypeDef GPIO_InitStructure1;GPIO_InitTypeDef GPIO_InitStructure2;USART_InitTypeDef USART_InitStructure;/*使能GPIOB 的时钟*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);/*使能串口3 的时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //设置GPIO为复用模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置GPIO速率为50MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //不使用上拉,下拉GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //GPIO Pin 设置GPIO_Init(GPIOB,&GPIO_InitStructure); //GPIOA_9 初始化GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure1.GPIO_Pin = GPIO_Pin_11;GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure1);/* 配置PB0 作为模块的复位引脚 */GPIO_InitStructure2.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure2.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure2.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure2.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOB,&GPIO_InitStructure2);/* 多功能引脚的配置,将PA9和PA10连接到串口1 */GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3); GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3);USART_InitStructure.USART_BaudRate = 115200; //波特率的配置USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位的数据位USART_InitStructure.USART_StopBits = USART_StopBits_1; //1个停止位USART_InitStructure.USART_Parity = USART_Parity_No; //无校验USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无流控制USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //支持数据的发送与接收USART_Init(USART3, &USART_InitStructure);/*******************************///usart3中断配置USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);NVIC_InitTypeDef Struct;Struct.NVIC_IRQChannel = USART3_IRQn;Struct.NVIC_IRQChannelCmd = ENABLE;Struct.NVIC_IRQChannelPreemptionPriority = 1;Struct.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&Struct);USART_ClearITPendingBit(USART3,USART_IT_RXNE);USART_Cmd(USART3,ENABLE); //使能串口
}void Usart3_SendString(uint8_t *string)
{uint8_t i;for(i = 0; string[i] != '\0'; i++){USART_SendData(USART3,string[i]);while(USART_GetFlagStatus(USART3,USART_FLAG_TXE) == RESET);}
}void USART3_IRQHandler(void)
{uint8_t data;if(USART_GetITStatus(USART3,USART_IT_RXNE) == SET){if(flag == 0){buf[num] = USART_ReceiveData(USART3);num ++;}USART_ClearITPendingBit(USART3,USART_IT_RXNE);}if(USART_GetITStatus(USART3,USART_IT_IDLE) == SET){flag = 1;num = 0;}USART_ClearITPendingBit(USART3,USART_IT_IDLE); }
以上是关于ESP8266的基础入门篇