STM32+ESP-01S
ESP-01S该模块核心处理器 ESP8266 在较小尺寸封装中集成了超低功耗 32 位微型MCU,ESP8266 是高性能无线 SoC,以最低成本提供最大实用性,为 Wi-Fi 功能嵌入其他系统提供无限可能ESP-01S Wi-Fi 模块支持标准的 IEEE802.11 b/g/n 协议,完整的 TCP/IP 协议栈。用户可以使用该模块为现有的设备添加联网功能,也可以构建独立的网络控制器。
一、ESP-01S介绍
1.1 产品简介
ESP-01S该模块核心处理器 ESP8266 在较小尺寸封装中集成了超低功耗 32 位微型MCU,ESP8266 是高性能无线 SoC,以最低成本提供最大实用性,为 Wi-Fi 功能嵌入其他系统提供无限可能 ESP-01S Wi-Fi 模块支持标准的 IEEE802.11 b/g/n 协议,完整的 TCP/IP 协议栈。 用户可以使用该模块为现有的设备添加联网功能,也可以构建独立的网络控制器 ESP8266 只需通过 SPI/SDIO 接口或 UART 接口即可作为 Wi-Fi 适配器,应用到基于任何微控制器设计中- 支持 STA/AP/STA+AP 工作模式,通用 AT 指令可快速上手

1.2 AT指令
| 基础AT指令 | AT |
测试 AT 启动
|
| AT+RST |
重启模块
|
|
| AT+RESTORE |
恢复出厂设置功能
|
|
|
Wifi 功能 AT 指令
|
AT+CWMODE
|
选择 WIFI 应用模式
|
|
AT+CWJAP
|
加入 AP
|
|
|
AT+CWSAP
|
设置 AP 模式下的参数
|
|
|
TCP/IP 工具箱 AT 指令
|
AT+CIPMUX | 启动多连接 |
| AT+CIPSTART | 建立 TCP 连接 | |
| AT+CIPMODE | 设置模块传输模式 | |
| AT+CIPSERVER | 配置为服务器 | |
| AT+CIPSEND | 发送数据 |
二、使用方法
这里先使用电脑通过串口与ESP-01S通信首先确保连线正确:GND接GND、3.3V接VCC、RX接TXD、TX接RXD;接线正确后把 USB转TTL模块 插入电脑,然后打开串口助手,波特率选115200,然后点打开串口,正常情况下上电后ESP-01S的蓝灯会闪几下然后打印一堆乱码如图:

发送AT 正常会返回OK,没有收到这些? 那这边建议重新刷固件了
2.1 连接wifi
1. 设置工作模式为STA:AT+CWMODE=1
AT+CWMODE=1 // 1是station(设备)模式 2是AP(路由)模式 3是双模
OK // 返回OK
2. 连接wifi,AT+CWJAP="WIFI名字","WIFI密码"
这里注意一定是英文状态下的双引号,连接后下次ESP-01S启动后就会自动连接此WIFI
AT+CWJAP="xxx","xxxxxxxx" // wifi名称和密码根据实际填入
WIFI GOT IP // 成功连接会返回WIFI GOT IP
2.2 释放wifi
1. 设置工作模式为AP:AT+CWMODE=2
AT+CWMODE=2 // 设置为AP模式 也就是ESP-01S可以开热点了
OK // 返回OK
2. 设置wifi账号密码:AT+CWSAP="WIFI名字","WIFI密码",1,3
AT+CWSAP="ESP8266","12345678",1,3 // ESP-01S开热点,WIFI密码最少设置8位
OK // 返回OK
2.3 作为TCP客户端连接网络调试助手并进行数据透传(设备模式)
前提:ESP-01S和电脑处在同一个局域网内,可以电脑连ESP-01S的热点,也可以ESP-01S连电脑的热点,也可以都连同一个网,电脑打开网络调试助手并开启TCP服务
1. 设置工作模式为STA:AT+CWMODE=1
2. 连接wifi:AT+CWJAP="WIFI名字","WIFI密码"
3. 设置单路链接模式:AT+CIPMUX=0
4. 连接TCP服务器:AT+CIPSTART="TCP","192.168.1.3",8080
5. 进入到透传模式:AT+CIPMODE=1 AT+CIPSEND

最后如何退出透传模式:首先把发送新行取消勾选,然后发送+++,等待1秒以上后勾选发送新行,然后发送AT即可退出透传模式。
2.4 作为TCP服务端并进行数据互传 (路由模式)
前提:ESP-01S和电脑处在同一个局域网内,可以电脑连ESP-01S的热点,也可以ESP-01S连电脑的热点,也可以都连同一个网。
1. 设置工作模式为AP:AT+CWMODE=2
2. 设置wifi账号密码:AT+CWSAP="ESP8266","12345678"
3. 设置多路链接模式:AT+CIPMUX=1
4. 建立TCP服务器:AT+CIPSERVER=1,8080
5. 电脑连接ESP-01S释放的wifi("ESP8266","12345678"),打开网络调试助手,填写主机地址(可以通过 AT+CIPAP? 查询)和端口号(已经被设置为8080),如下图所示6.

6. 发送数据:AT+CIPSEND=客户端ID,要发送的数据长度(这里以8个字节数据为例)

- ESP-01S发送数据前需要发送AT指令(例如 AT+CIPSEND=0,8)
- ESP-01S接收数据的格式为:+IPD,客户端ID,字节数:数据(例如 +IPD,0,8:87654321)
三、程序驱动
ESP8266.h
#ifndef __ESP8266_H
#define __ESP8266_H
void ESP8266_STA_Init(uint32_t baudrate);
void ESP8266_Printf(char *format, ...);
void ESP8266_AP_Init(uint32_t baudrate);
void ESP8266_AP_Send_String(char *string);
#endif
ESP8266.c
#include "stm32f10x.h" // Device header
#include <stdio.h>
#include <stdarg.h>
#include "string.h"
#include "Delay.h"
#include "USART1.h"
//本C文件的返回值
#define ESP8266_EOK 0
#define ESP8266_ERROR 1
//工作模式
#define ESP8266_STA_MODE 1
#define ESP8266_AP_MODE 2
#define ESP8266_STA_AP_MODE 3
//单路链接模式
#define ESP8266_SINGLE_CONNECTION 0
#define ESP8266_MULTI_CONNECTION 1
//WIFI名称和密码
#define WIFI_SSID "Xiaomi13"
#define WIFI_PWD "12345678"
//TCP服务器地址和端口
#define TCP_SERVER_IP "192.168.1.5"
#define TCP_SERVER_PORT "8080"
/*ESP8266的STA配置函数*/
uint8_t ESP8266_At_Test(void); //1. 测试esp8266是否存在
uint8_t ESP8266_Set_Mode(uint8_t mode); //2. 设置工作模式为STA
uint8_t ESP8266_Connection_Mode(uint8_t mode); //3. 设置单路链接模式
uint8_t ESP8266_Join_Ap(char *ssid, char *pwd); //4. 连接wifi,SSID: %s, PWD: %s
uint8_t ESP8266_Connect_Tcpserver(char *server_ip, char *server_port); //5. 连接TCP服务器,server_ip:%s, server_port:%s
uint8_t ESP8266_Enter_Unvarnished(void); //6. 进入到透传模式
/*ESP8266的AP配置函数*/
uint8_t ESP8266_Set_WiFi(void);
uint8_t ESP8266_Build_Tcp_Server(void);
void ESP8266_Printf(char *format, ...);
/**
* @brief ESP8266_STA_客户端模式连接WIFI、TCP服务器
*/
void ESP8266_STA_Init(uint32_t baudrate)
{
printf("esp8266初始化开始...\r\n");
USART1_Init(baudrate);
//esp8266的其它初始化
printf("1. 测试esp8266是否存在...\r\n");
while(ESP8266_At_Test() == ESP8266_ERROR)
{
Delay_ms(100);
}
printf("2. 设置工作模式为STA...\r\n");
while(ESP8266_Set_Mode(ESP8266_STA_MODE) == ESP8266_ERROR)
{
Delay_ms(100);
}
printf("3. 设置单路链接模式...\r\n");
while(ESP8266_Connection_Mode(ESP8266_SINGLE_CONNECTION) == ESP8266_ERROR)
{
Delay_ms(100);
}
printf("4. 连接wifi,SSID: %s, PWD: %s\r\n", WIFI_SSID, WIFI_PWD);
while(ESP8266_Join_Ap(WIFI_SSID, WIFI_PWD) == ESP8266_ERROR)
{
Delay_ms(500);
}
printf("5. 连接TCP服务器,server_ip:%s, server_port:%s\r\n", TCP_SERVER_IP, TCP_SERVER_PORT);
while(ESP8266_Connect_Tcpserver(TCP_SERVER_IP, TCP_SERVER_PORT))
Delay_ms(100);
printf("6. 进入到透传模式...\r\n");
while(ESP8266_Enter_Unvarnished())
Delay_ms(100);
printf("ESP8266已连接上TCP服务器并进入透传模式\r\n");
printf("ESP8266初始化完成!\r\n");
}
/**
* @brief ESP8266_AP_服务端模式
*/
void ESP8266_AP_Init(uint32_t baudrate)
{
printf("esp8266初始化开始...\r\n");
USART1_Init(baudrate);
//esp8266的其它初始化
printf("1. 测试esp8266是否存在...\r\n");
while(ESP8266_At_Test() == ESP8266_ERROR)
{
Delay_ms(100);
}
printf("2. 设置工作模式为AP...\r\n");
while(ESP8266_Set_Mode(ESP8266_AP_MODE) == ESP8266_ERROR)
{
Delay_ms(100);
}
printf("3. 设置wifi账号密码...\r\n");
while(ESP8266_Set_WiFi() == ESP8266_ERROR)
{
Delay_ms(100);
}
printf("4. 设置多路链接模式...\r\n");
while(ESP8266_Connection_Mode(ESP8266_MULTI_CONNECTION) == ESP8266_ERROR)
{
Delay_ms(100);
}
printf("5. 建立TCP服务器...\r\n");
while(ESP8266_Build_Tcp_Server() == ESP8266_ERROR)
{
Delay_ms(100);
}
printf("ESP8266初始化完成!\r\n");
}
/**
* @brief ESP8266_AP_服务端模式,服务端给客户端发消息
* @param string:发送的字符串
* @retval 无
*/
void ESP8266_AP_Send_String(char *string)
{
ESP8266_Printf("AT+CIPSEND=0,%d\r\n",strlen(string));
Delay_ms(10);
USART1_SendString(string);
}
/**
* @brief 调用串口1的打印函数
*/
void ESP8266_Printf(char *format, ...)
{
char String[UART1_RX_BUF_SIZE]; //定义字符数组
va_list arg; //定义可变参数列表数据类型的变量arg
va_start(arg, format); //从format开始,接收参数列表到arg变量
vsprintf(String, format, arg); //使用vsprintf打印格式化字符串和参数列表到字符数组中
va_end(arg); //结束变量arg
USART1_SendString(String); //串口发送字符数组(字符串)
}
/**
* @brief ESP8266发送命令字符串,并与期待返回的结果比较
* @param Cmd:发送命令字符串
* @param Res:期待返回字符串
* @retval 500ms内得到期望字符串就返回UART_EOK,否则UART_ERROR
*/
uint8_t ESP8266_Send_Command(char *Cmd, char *Res)
{
uint8_t time_out = 50;
USART1_RxPacket_Clear();
USART1_SendString(Cmd);
while(time_out--)
{
if(USART1_Wait_Receive() == UART_EOK)
{
if(strstr((const char*)USART1_RxPacket, Res) != NULL)
return ESP8266_EOK;
}
Delay_ms(10);
}
return ESP8266_ERROR;
}
/**
* @brief 测试ESP8266是否存在
* @param 无
* @retval 存在返回UART_EOK,否则UART_ERROR
*/
uint8_t ESP8266_At_Test(void)
{
return ESP8266_Send_Command("AT\r\n", "OK");
}
/**
* @brief 设置工作模式
* @param 三种工作模式
* @retval 成功设置返回UART_EOK,否则UART_ERROR
*/
uint8_t ESP8266_Set_Mode(uint8_t mode)
{
char cmd[64];
sprintf(cmd, "AT+CWMODE=%d\r\n", mode);
return ESP8266_Send_Command(cmd, "OK");
}
/**
* @brief 设置单路链接模式
* @param 两种模式
* @retval 成功设置返回UART_EOK,否则UART_ERROR
*/
uint8_t ESP8266_Connection_Mode(uint8_t mode)
{
char cmd[64];
sprintf(cmd, "AT+CIPMUX=%d\r\n", mode);
return ESP8266_Send_Command(cmd, "OK");
}
/**
* @brief 连接wifi
* @param 账号和密码
* @retval 成功连接返回UART_EOK,否则UART_ERROR
*/
uint8_t ESP8266_Join_Ap(char *ssid, char *pwd)
{
char cmd[64];
sprintf(cmd, "AT+CWJAP=\"%s\",\"%s\"\r\n", ssid, pwd);
return ESP8266_Send_Command(cmd, "WIFI GOT IP");
}
/**
* @brief 连接TCP服务器
* @param server_ip:TCP地址
* @param server_port:服务器端口号
* @retval 成功连接返回UART_EOK,否则UART_ERROR
*/
uint8_t ESP8266_Connect_Tcpserver(char *server_ip, char *server_port)
{
char cmd[64];
sprintf(cmd, "AT+CIPSTART=\"TCP\",\"%s\",%s\r\n", server_ip, server_port);
return ESP8266_Send_Command(cmd, "CONNECT");
}
/**
* @brief 进入透传模式
* @param 无
* @retval 成功连接返回UART_EOK,否则UART_ERROR
*/
uint8_t ESP8266_Enter_Unvarnished(void)
{
uint8_t ret;
ret = ESP8266_Send_Command("AT+CIPMODE=1\r\n", "OK");
ret += ESP8266_Send_Command("AT+CIPSEND\r\n", ">");
if (ret == ESP8266_EOK)
return ESP8266_EOK;
else
return ESP8266_ERROR;
}
/**
* @brief 设置WiFi
* @param
* @retval 成功返回UART_EOK,否则UART_ERROR
*/
uint8_t ESP8266_Set_WiFi(void)
{
return ESP8266_Send_Command("AT+CWSAP=\"ESP8266\",\"12345678\",1,4\r\n","OK");
}
/**
* @brief 建立TCP服务器
* @param
* @retval 成功返回UART_EOK,否则UART_ERROR
*/
uint8_t ESP8266_Build_Tcp_Server(void)
{
return ESP8266_Send_Command("AT+CIPSERVER=1,8080\r\n", "OK");
}
四、效果展示
4.1 接线说明
| ESP-01S | STM32F103C8T6 | USB转TTL模块 | STM32F103C8T6 | |
| RX | PA9 | RX | PA2 | |
| TX | PA10 | TX | PA3 |
4.1 ESP8266的STA模式简单收发

4.2 ESP-01S的AP模式简单收发

更多推荐



所有评论(0)