前言
涉及到的工具与模块
1. ATK-ESP8266wifi模块
2.USB-UART模块(用于检测esp模块功能是否正常)
3.stm32zet6
一、ESP8266的基本介绍
ESP8266是由乐鑫科技推出的一款低成本、高性能的无线WiFi模块。该模块集成了WiFi芯片和处理器,能够提供稳定的无线连接和较强的处理能力。ESP8266可以通过串口或者WiFi连接到其他设备,使其可以无线连接到互联网。
ESP8266模块具有小巧的体积、低功耗、易于集成等优点,广泛应用于物联网、智能家居、远程控制等领域。它支持多种开发平台和编程语言,如Arduino、NodeMCU、MicroPython等,开发门槛低,适合初学者和专业开发者使用。
本案例以ATK-ESP-01 模块为例
该模块模块采用串口(LVTTL)与 MCU(或其他串口设备)通信,它不用你自己建立客户端,其内置了TCP/IP协议栈,能够实现串口与 WIFI 之间的转换(将串口传输的信息再通过wifi传递给服务器),即只要配置串口就可以向服务器传输信息。
该模块的引脚信息:
VCC 电源(3.3V~5V)
GND 电源地
TXD 模块串口发送脚(TTL 电平,不能直接接 RS232 电平!),可接单片机的 RXD
RXD 模块串口接收脚(TTL 电平,不能直接接 RS232 电平!),可接单片机的 TXD
RST 复位(低电平有效)
IO_0 用于进入固件烧写模式,低电平是烧写模式,高电平是运行模式(默认状态)
ps.一般情况下我们只需要用到串口引脚和电源即可,如图
二、ESP8266的基本命令
现在我们终于可以讲讲stm32是怎么控制这个模块的了
首先就是用来控制它的指令集
指令 | 功能 |
---|---|
AT | 测试AT启动 |
AT+RST | 重启模块 |
AT+RESTORE | 恢复出厂设置 |
AT+CWLIF | 查看已接入设备的 IP |
AT+CIFSR | 查看本模块的 IP 地址 |
AT+CWMODE? | 查看本机配置模式 |
AT+CIPMUX=1 | 开启多连接模式 |
AT+CIPMUX=0 | 开启单线路模式 |
AT+CIPSTO? | 查询本模块的服务器超时时间 |
ATE | 开关回显功能ATE关闭回显,ATE开启回显 |
AT+GMR | 查看版本信息 |
AT+UART | 设置串口配置 |
AT+CWJAP | 加入AP(wifi) |
AT+CWQAP | 退出与AP的连接 |
AT+CWSMARTSTART | 启动智能连接 |
AT+CWSMARTSTOP | 停止智能连接 |
AT+CIPSTART | 连接TCP |
AT+CIPCLOSE | 关闭TCP连接 |
AT+CIPMODE=1 | 开启TCP透传 |
AT+CIPSEND | 开始传输信息(从这里开始输出的都以字符串的形式被接收,包括命令格式) |
+++ | 退出透传(下一行识别命令,记得别换行) |
AT+CIPMODE=0 | 退出透传模式 |
三、ESP8266的指令搭配和模块配置
作为服务器时的配置
1.将自己作为wifi,给其他子端发送信息
向串口发送:AT+CWMODE=2
2.重启模块(这个步骤是必要的)
向串口发送:AT+RST
3.服务器配置
向串口发送:AT+CWSAP=“wifi名称”,“wifi密码”,x,y (x,y分别为通道号和加密等级)
4.查看自己的ip地址(这个ip地址是给客户端连的)
向串口发送:AT+CIFSR
5.建立服务器当然要用到多线连接咯
向串口发送:AT+CIPMUX=1
6.设置端口
向串口发送:AT+CIPSERVER=1使用默认端口
作为客户端时(本案例也将使用客户端连接qt服务器)
1.配置成STA模式,与服务器连接
向串口发送:AT+CWMODE=1
2.重启模块(这个步骤是必要的)
向串口发送:AT+RST
3.连接热点
向串口发送:AT+CWSAP=“wifi名称”,“wifi密码”
4.单线连接
向串口发送:AT+CIPMUX=0
5.连接服务器地址
向串口发送:AT+CIPSTART=“TCP”,“服务器ip地址”,端口号
6.开启透传模式
向串口发送:AT+CIPMODE=1
7.开始发送信息
向串口发送:AT+CIPSEND
(建议操作之前先使用串口进行配置,方便了解发出命令后会返回什么)
差不多就是以上流程,下面展示一下具体的写法
四、程序展示
这里展示一下连接服务器的代码流程
首先是客户端初始化
它们分别用到了以下这几个功能函数
1.判断命令发送
//判断是否正在接收数据
_Bool ESP01S_WaitRecive(void)
{if(ESP01S_cnt == 0)//如果接收计数为0 则说明没有处于接收数据中,所以直接跳出,结束函数
return 1;
if(ESP01S_cnt == ESP01S_cntPre)//如果上一次的值和这次相同,则说明接收完毕
{
ESP01S_cnt = 0;//清0接收计数
return 0;//返回接收完成标志
}
ESP01S_cntPre = ESP01S_cnt;//置为相同
return 1;//返回接收未完成标志}
2.命令发送
//发送命令并返回命令是否完成标志
_Bool ESP01S_SendCmd(char *cmd, char *res)
{
unsigned char timeOut = 200;Usart_SendString(huart2, (unsigned char *)cmd, strlen((const char *)cmd));
while(timeOut--)
{
if(ESP01S_WaitRecive() == 0)//如果收到数据
{
if(strstr((const char *)ESP01S_buf, res) != NULL)//如果检索到关键词
{
ESP01S_Clear();//清空缓存
return 0;
}
}
HAL_Delay(10);
}
return 1;}
3.连接初始化
#define ESP01S_WIFI_INFO "AT+CWJAP=\"226\",\"226226226\"\r\n"//要连接到的wifi
#define ESP01S_ONENET_INFO "AT+CIPSTART=\"TCP\",\"192.168.124.100\",8899\r\n"//连接到的服务器
void ESP01S_Init(void)
{
ESP01S_Clear();
unsigned char str[40];
while(ESP01S_SendCmd("+++","")) //退出透传
HAL_Delay(500);
sprintf((char *)str, "begin\r\n"); //修改模式(调试时退出透传)
LCD_ShowString(70, 70, 50, 24, 24, str);
while(ESP01S_SendCmd("AT+CIPMODE=0\r\n","OK"))
HAL_Delay(500);//可以不使用以上代码
sprintf((char *)str, "0. AT\r\n");
LCD_ShowString(70, 70, 50, 24, 24, str);
while(ESP01S_SendCmd("AT\r\n","OK"))
HAL_Delay(500);
sprintf((char *)str, "1. RST\r\n");
LCD_ShowString(70, 70, 200, 24, 24, str);
ESP01S_SendCmd("AT+RST\r\n", "ready");
HAL_Delay(500);
ESP01S_SendCmd("AT+CIPCLOSE\r\n", "");//关闭TCP连接
HAL_Delay(500);
sprintf((char *)str, "2. CWMODE\r\n");//模式1(Station),默认保存Flash
LCD_ShowString(70, 70, 200, 24, 24, str);
while(ESP01S_SendCmd("AT+CWMODE=1\r\n", "OK"))
HAL_Delay(500);
sprintf((char *)str, "3. CWJAP\r\n");//链接WIFI
LCD_ShowString(70, 70, 200, 24, 24, str);
while(ESP01S_SendCmd(ESP01S_WIFI_INFO, "GOT IP"))
HAL_Delay(500);
sprintf((char *)str, "4. CIPMUX\r\n");//单线路
LCD_ShowString(70, 70, 200, 24, 24, str);
while(ESP01S_SendCmd("AT+CIPMUX=0\r\n", "OK"))
HAL_Delay(500);
sprintf((char *)str, "5. CIPSTART\r\n");//开启TCP连接
LCD_ShowString(70, 70, 200, 24, 24, str);
while(ESP01S_SendCmd(ESP01S_ONENET_INFO, "CONNECT"))
HAL_Delay(500);
sprintf((char *)str, "6. CIPMODE\r\n");//开启TCP透传
LCD_ShowString(70, 70, 200, 24, 24, str);
while(ESP01S_SendCmd("AT+CIPMODE=1\r\n","OK"))
HAL_Delay(500);sprintf((char *)str, "7. CIPMODE\r\n");//开启TCP透传
LCD_ShowString(70, 70, 200, 24, 24, str);
while(ESP01S_SendCmd("AT+CIPSEND\r\n","OK"))
HAL_Delay(500);
sprintf((char *)str, "8. ESP01S Init OK\r\n");//初始化完成
LCD_ShowString(70, 70, 200, 24, 24, str);}
效果图:
ps.这里就不贴出信息的发送方式了(就是发给串口就行),如图,能连接上。(如有问题欢迎指正)