STM32实战——ESP8266 WIFI模块

STM32实战——ESP8266 WIFI模块

 此篇博文提供了ESP8266的开发指南,包括在STM32上使用ESP8266进行WiFi连接、发送和接收HTTP请求以及在ESP8266中使用AT指令发送GET方式请求等内容。 

ESP8266

硬件介绍

ESP8266系列模组有哪些:

在本实验中,ESP8266与ESP-01不做区分。

ESP-01引脚介绍:

引脚 功能

3.3 3.3V供电,避免使用5V供电

RX UART_RXD,异步串口接受端

RST 外部复位引脚,低电平有效,默认高电平

IO0 GPIO_0引脚:状态:1.悬空:Flash下载模式和工作模式:2.下拉:串口下载模式

EN 使能端口,高电平工作,低电平模块不工作

IO2 GPIO_2引脚,开机上电时禁止下拉,默认高电平

TX UART_TXD,异步串口发送端

GND GND接地引脚

实物图如下(某些板子没有丝印端口说明,可以参照下图):

引脚连接如下:

引脚 连接

3.3V 3.3V

RST 3.3V

EN 3.3V

IO2 3.3V

GND GND

IO0 GND

TXD RXD

RXD TXD

硬件连接图(2)

使用ESP串口工具

某宝上有现成的调试ESP8266模块的串口工具,已将各个引脚接好,还带有RST按键,烧录固件库或者调试程序使用很方便。

本次实验测试时使用该串口工具。

三种模式

ESP8266 支持 softAP 模式,station 模式,softAP + station 共存模式三种。

利用 ESP8266 可以实现十分灵活的组网方式和网络拓扑。

提示

 SoftAP:即无线接入点,是一个无线网络的中心节点。通常使用的无线路由器就是一个无线接入点。

Station:即无线终端,是一个无线网络的终端端。

AT命令

此外,在AT+CIPSEND输入模式下发送+++(不需要换行),即可退出输入模式。

ATE1开启回显,ATE0关闭回显。

AT+CIOBAUD=115200将波特率修改为115200。

ESP8266 TCP通信测试

网络环境准备

手机开启流量,开启热点,设置热点名称(最好是6位字母以下)和密码。

将电脑连接到手机热点。

电脑端准备

1、网络调试

win+R 输入cmd进入DOS窗口,之后输入ipconfig查看当前电脑IP地址,例如我的IP为192.168.41.242

打开网络调试工具(任意工具即可,例如野火网络调试助手),将电脑配置为TCP Server,输入刚刚的IP192.168.41.242,端口号自己决定(需要与下一步相匹配),例如8080。

点击开始监听。

2、串口

将"ESP8266模块的串口工具"插入电脑USB口,打开串口调试工具(任意串口调试工具均可),设置波特率115200(ESP8266默认波特率),数据位8位,停止位1位,校验位无。

接收与发送均为"文本模式",编码为GBK编码。

ESP8266连接流程

依次利用串口向ESP8266输入以下命令。

AT\r\n

 检查ESP8266模块连接是否正常

AT+CWMODE=1\r\n

 配置模块为Sta模式

AT+CWJAP="WIFI名称","WIFI密码"\r\n

 连接指定WIFI,确保为自己的WIFI

AT+CIPMUX=0\r\n

 设置成单连接

AT+CIPSTART="TCP","192.168.41.242",8080\r\n

 创建TCP连接,IP地址为电脑的IP,串口为电脑监听的端口号

AT+CIPMODE=1\r\n

 进入透传模式,进入到透传模式后AT指令就会失效,需要退出后才能生效

AT+CIPSEND\r\n

 准备向服务器发送请求,前面都成功的前提下发送完这个指令后会出现一个>,此时输入发送信息即可

如果前面的命令均正确,则发送Hello后,此时电脑网络调试工具会接收Hello。

电脑网络调试工具发送123,ESP8266也会收到123。

至此,单独对ESP8266的设置和测试完成。接下来可以编写STM32代码。

附:完整的输入输出信息(\r\n表示按一次回车)

输入:

AT\r\n

ATE0\r\n

AT+CWMODE=1\r\n

AT+CWJAP="bwifyt","123456789"\r\n

AT+CIPMUX=0\r\n

AT+CIPSTART="TCP","192.168.41.242",8080\r\n

AT+CIPMODE=1\r\n

AT+CIPSEND\r\n

输出:

AT

OK

ATE0

OK

OK

WIFI CONNECTED

WIFI GOT IP

OK

OK

ERROR

CLOSED

ERROR

CLOSED

ERROR

CLOSED

CONNECT

OK

OK

OK

>

ESP8266 HTTP测试

HTTP协议

客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式。

HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。

ESP8266发送HTTP请求

这里使用心知天气进行测试。

服务器的IP地址可以使用ping api.seniverse.com命令获得。

端口号一般为80端口,如果是其他端口,请先使用网络调试助手确保可行。

使用正确的AT命令,重新设置ESP8266连接的IP地址(或者重启模块,重新设置,参照上一小节内容)。

发送格式

GET /v3/weather/now.json?key=你的密钥&location=beijing&language=zh-Hans&unit=c

响应:服务器返回的数据

{"results":[{"location":{"id":"WX4FBXXFKE4F","name":"北京","country":"CN","path":"北京,北京,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"多云","code":"4","temperature":"16"},"last_update":"2024-03-31T20:24:29+08:00"}]}

也可以使用完整的GET请求:

GET /v3/weather/now.json?key=你的密钥&location=beijing&language=zh-Hans&unit=c HTTP/1.1

Content-Type: application/json;charset=utf-8

Host: www.liefyuan.top

Connection: Keep Alive

注意

 GET之后有一空格,HTTP/1.1之前有一空格。最后需要以两行换行表示结束。

响应信息

 发送完整的GET请求,可以得到完整的响应信息

使用简略的GET请求,可以得到简略的响应信息

至于POST请求,需要与后端进行沟通,才能够确定具体的发送格式。

ESP8266接收响应

提示

 以下内容与我目前所做的项目高度相关,因此有部分其他代码不做解释,只讲解关键点代码

发送HTTP请求之后,需要接收相关的响应,并对数据进行解析。

C语言有类似于CJSON的库可以能够实现数据解析做这件事,但是我们这里依旧采用自编代码实现。

优点是不需要导入CJSON的代码,对于单片机要求不高。缺点是需要手动编写,但是我们请求的次数不多,也就显得不是很麻烦了。

1、初始化

首先进行初始化,开启串口接收数据的中断。

// USART相关配置

/*中断输出配置*/

USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); // 开启串口接收数据的中断

USART_ITConfig(USART3, USART_IT_IDLE, ENABLE); // 开启串口接收数据的中断

// NVIC相关配置

这里的“两个”中断都需要打开,不然无法正常接收到数据。

2、中断函数

之后编写我们需要的中断函数,即将ESP8266接收到的数据保存下来。

/**

 * @brief 串口3接收到数据中断回调函数

 * @param None

 * @retval None

 */

static void ESP8266_FrameFinish_CallBack(void) {

  Serial_Printf("\r\n中断回调函数串口输出:\r\n%s", ESP8266_Buffer.Body);

}

/**

 * @brief 串口3中断函数

 * @param None

 * @retval None

 */

void USART3_IRQHandler(void) {

  if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)

  {

    // 当接收没有结束时,将源源不断的接收到的字符存入缓冲区

    if (ESP8266_Buffer.Length < (USART_RX_BUF_SIZE - 1))

    {

      ESP8266_Buffer.Body[ESP8266_Buffer.Length++] = (char)USART_ReceiveData(USART3);

    }

  }

  if (USART_GetITStatus(USART3, USART_IT_IDLE) != RESET)

  {

    // 当接收结束时,向缓冲区尾端添加结束符

    ESP8266_Buffer.FinishFlag = 1;

    ESP8266_Buffer.Body[ESP8266_Buffer.Length] = '\0';

    // 清除串口空闲中断标志位

    volatile uint16_t temp;

    temp = USART3->SR;

    temp = USART3->DR;

    ESP8266_FrameFinish_CallBack();

  }

}

3、发送HTTP接收数据

/**

 * @brief 清空ESP8266_Buffer结构体

 * @param None

 * @retval None

 */

void ESP8266_ClearBuffer(void)

{

  memset(ESP8266_Buffer.Body, 0, USART_RX_BUF_SIZE); // 清空缓存区数据

  ESP8266_Buffer.FinishFlag = 0; // 清空FinishFlag, 表示没有接收完成

  ESP8266_Buffer.Length = 0; // 清空Length, 表示接收长度为0

}

/**

 * @brief HTTP GET类型请求

 * @param address 请求地址

 * @param timeout 超时时间(单位:100ms)

 * @retval char* 字符数组

 */

char* ESP8266_HTTP_Get(char* address, uint8_t timeout)

{

  ESP8266_ClearBuffer(); // 清空ESP8266缓存

  ESP8266_Printf("GET %s HTTP/1.1\r\n\r\n", address);

  while(timeout--)

  {

    Delay_ms(100);

    if(ESP8266_Buffer.FinishFlag)

    {

      return ESP8266_GetBuffer();

    }

  }

  

  return "HTTP Send Failed.";

}

4、解析数据

由于我的接收响应是这样的

{

    "status": "1",

    "msg": [

        {

            "id": 7,

            "name": "temperature",

            "value": "26.0"

        },

        {

            "id": 8,

            "name": "humidity",

            "value": "100.0"

        },

        {

            "id": 9,

            "name": "concentration",

            "value": "200.9"

        }

    ]

}

所以我的解析数据函数如下(添加了注释,相信大家能够明白)

/**

 * @brief 从res中提取信息, 数据类型为uint8_t

 * @param res: 响应字符串

 * @param name: 数据名称

              temperature: 温度

              humidity: 湿度

              concentration: 浓度

 * @param integer_part: 整数部分

 * @param decimal_part: 小数部分

 * @retval 无

 */

void GetInformation(char *res, char *name, uint8_t *integer_part, uint8_t *decimal_part) {

 char *key_start = strstr(res, name); // 寻找name开头

 char *result_start = strstr(key_start, "value") + 9; // 寻找数据开头

 char *dot = strchr(result_start, '.'); // 寻找小数点

 char *result_end = strchr(result_start, '\"'); // 寻找数据结尾

  

 char string_integer_part[5];

 char string_decimal_part[5];

 strncpy(string_integer_part, result_start, dot - result_start); // 整数部分字符串

 strncpy(string_decimal_part, dot + 1, result_end - dot - 1); // 小数部分字符串

 *integer_part = atoi(string_integer_part); // 整数部分

 *decimal_part = atoi(string_decimal_part); // 小数部分

}

5、示例代码

// ESP8266_HTTP_Get是请求HTTP的参数,将返回一个字符串指针

char* res = ESP8266_HTTP_Get("/your_site", 100);

char* res_end;

do

{

 res = ESP8266_GetBuffer();

 res_end = strstr(res, "}]}");

 Delay_ms(100);

}while(res_end == NULL);

// 获取温度, 湿度, PM2.5浓度值

char* name = "temperature";

GetInformation(res, name, &temp.Temp_H_Threshold, &temp.Temp_L_Threshold);

对于STM32ESP8266的连接,可以选择以下两种方式: 1. 通过UART串口连接 在STM32中,可以使用USART串口模块ESP8266进行连接。在此之前,需要确认ESP8266的波特率和数据位、停止位、校验位等参数。然后,可以使用STM32的HAL库函数来进行串口通信的数据传输。 2. 通过SPI总线连接 STM32也可以通过SPI总线连接ESP8266,在此之前需要确认ESP8266的SPI模式和时钟极性、时钟相位等参数。然后,可以使用STM32的HAL库函数来进行SPI通信的数据传输。 在连接完成后,还需要进行以下的配置: 1. 配置ESP8266的连接模式 在使用ESP8266进行WiFi通信时,需要先设置ESP8266的连接模式,包括STA模式和AP模式。可以使用AT指令进行设置,也可以在代码中进行设置。 2. 配置ESP8266WiFi参数 在连接WiFi网络时,需要设置ESP8266WiFi参数,包括SSID和密码等。可以使用AT指令进行设置,也可以在代码中进行设置。 3. 发送数据到ESP8266 在使用ESP8266进行数据传输时,可以使用AT指令进行数据传输,也可以在代码中进行数据传输。需要注意的是,在使用AT指令进行数据传输时,需要进行AT指令的拼接和发送,同时需要处理AT指令的响应。 4. 接收ESP8266返回的数据 在使用ESP8266进行数据传输时,需要接收ESP8266返回的数据。可以使用AT指令进行返回数据的读取,也可以在代码中进行数据的接收。需要注意的是,在使用AT指令进行数据读取时,需要处理AT指令的响应。 以上是STM32配置ESP8266的基本步骤,需要根据具体情况进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牛马程序员2025

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值