基于 STM32CubeIDE+Proteus 实现 ESP8266 与 STM32 的 WiFi 数据传输(发送温湿度至手机 TCP 助手)
·
要求:用 STM32F103C8T6 作为主控,通过USART2(串口 2) 与 ESP8266-01 模块通信;STM32 模拟生成温湿度数据(温度 20-30℃、湿度 40%-60% 随机波动),通过 ESP8266 连接指定 WiFi,将温湿度以 “Temp:XX℃,Hum:XX%” 格式发送到手机 TCP 助手(手机与 ESP8266 连同一 WiFi);Proteus 中搭建硬件仿真电路,STM32CubeIDE 中完成代码编写,实现仿真时手机端能实时接收数据。
一、Proteus 设备配置(核心硬件选型与接线)
1. 核心器件列表
| 器件名称 | Proteus 搜索关键词 | 作用 |
|---|---|---|
| STM32F103C8T6 | STM32F103C8 | 主控芯片,生成温湿度、控制 ESP8266 |
| ESP8266-01 WiFi 模块 | ESP8266 | 串口转 WiFi,实现 TCP 通信 |
| 12MHz 晶振 | CRYSTAL 12MHZ | STM32 外部时钟 |
| 22pF 电容(2 个) | CAP 22PF | 晶振匹配电容 |
| 10kΩ 电阻(2 个) | RES 10K | ESP8266 使能、复位 |
| 3.3V 电源 / 接地 | POWER/GROUND | 给所有器件供电(ESP8266 需 3.3V,不可接 5V) |
图:电路连接

图:元件列表
2. 关键接线(核心串口与使能脚)
- STM32 ↔ ESP8266(串口 2 通信,注意 ESP8266 的 TX/RX 与 STM32 交叉接):
- STM32 的 PA2(USART2_TX) → ESP8266 的 RX
- STM32 的 PA3(USART2_RX) → ESP8266 的 TX
- STM32 的 PB0 → ESP8266 的 CH_PD(使能脚,高电平使能,低电平休眠)
- STM32 的 PB1 → ESP8266 的 RST(复位脚,低电平复位,高电平正常工作)
- STM32 基础电路:12MHz 晶振接 PB8、PB9,两端各串 22pF 电容接地;VCC 接 3.3V,GND 接地。
- ESP8266 基础电路:CH_PD 通过 10kΩ 电阻接 3.3V(默认使能),RST 通过 10kΩ 电阻接 3.3V(默认不复位)。
二、STM32CubeIDE 配置(引脚与外设参数)
- 芯片选择:新建项目时搜索 “STM32F103C8T6”,选择对应型号。
- 时钟配置:
- 外部高速时钟(HSE)选择 “Crystal/Ceramic Resonator”(晶振),输入频率 12MHz;
- 时钟树配置:HCLK(系统时钟)设为 72MHz(STM32F103 最大稳定频率)。
- 串口 2(USART2)配置(与 ESP8266 通信核心):
- 模式:Asynchronous(异步通信);
- 波特率:115200bps(ESP8266 默认波特率,可改但需统一);
- 数据位:8Bits;停止位:1Bit;校验位:None;流控:None;
- 引脚自动分配:PA2(TX)、PA3(RX)(若被占用手动修改,需与 Proteus 接线一致)。
- GPIO 配置(ESP8266 使能与复位):
- PB0(CH_PD):输出模式(GPIO_Output),默认电平设为高(High)(使能 ESP8266);
- PB1(RST):输出模式(GPIO_Output),默认电平设为高(High)(ESP8266 正常工作)。
- SYS 配置:Debug 选择 “Serial Wire”(方便后续调试,可选)。
- 生成代码:配置完成后点击 “GENERATE CODE”,生成 MDK-ARM 工程(或 CubeIDE 原生工程)。
三、STM32CubeIDE 核心代码(仅贴关键模块,完整工程含自动生成代码)
1. 头文件声明(main.h 中添加)
c
运行
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
// ESP8266 WiFi参数(需改为你的WiFi名称和密码)
#define WIFI_NAME "你的WiFi名称" // 例如"TP-LINK_8888"
#define WIFI_PWD "你的WiFi密码" // 例如"12345678"
// 手机TCP助手参数(手机IP在WiFi设置中查看,端口自定义如8080)
#define PHONE_IP "192.168.1.105"
#define TCP_PORT "8080"
// 函数声明
void ESP8266_Init(void); // ESP8266初始化(连WiFi、创建TCP客户端)
void ESP8266_SendCmd(char *cmd, char *ack, uint16_t timeout); // 发送AT指令并等待响应
void STM32_SendTempHum(void); // 生成并发送温湿度数据
uint8_t USART2_ReceiveData(uint16_t timeout); // 串口2接收数据(超时退出)
2. 串口重定向(方便 printf 发送数据,在 main.c 中添加)
c
运行
// 重定向printf到USART2(ESP8266通信串口)
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 100); // 发送1个字节,超时100ms
return ch;
}
3. ESP8266 控制函数(main.c 中添加)
c
运行
// 串口2接收数据(超时返回0,否则返回接收的字符)
uint8_t USART2_ReceiveData(uint16_t timeout)
{
uint8_t data = 0;
uint32_t tick = HAL_GetTick(); // 获取当前系统时间
while (HAL_UART_Receive(&huart2, &data, 1, 1) != HAL_OK)
{
if (HAL_GetTick() - tick > timeout) // 超时判断
return 0;
}
return data;
}
// ESP8266发送AT指令,等待ack响应(超时未收到返回0,收到返回1)
void ESP8266_SendCmd(char *cmd, char *ack, uint16_t timeout)
{
uint8_t buf[128] = {0};
uint16_t i = 0;
printf("%s\r\n", cmd); // 发送AT指令(加\r\n是ESP8266指令要求)
while (1)
{
buf[i] = USART2_ReceiveData(timeout);
if (buf[i] == 0) break; // 超时退出
i++;
if (i >= 127) i = 0;
// 判断是否收到目标响应ack
if (strstr((char *)buf, ack) != NULL)
{
printf("ACK: %s\r\n", buf); // 打印响应(调试用)
return;
}
}
printf("No ACK for cmd: %s\r\n", cmd); // 超时提示
}
// ESP8266初始化:复位→设置模式→连WiFi→创建TCP客户端(连手机IP)
void ESP8266_Init(void)
{
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET); // PB1拉低,复位ESP8266
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET); // 释放复位,等待启动
HAL_Delay(1000);
// 1. 测试AT指令(ESP8266是否响应)
ESP8266_SendCmd("AT", "OK", 1000);
// 2. 设置WiFi模式:1=Station(从机,连路由器),3=AP+Station(可选)
ESP8266_SendCmd("AT+CWMODE=1", "OK", 1000);
// 3. 连接WiFi(格式:AT+CWJAP="WiFi名","密码")
char wifi_cmd[64];
sprintf(wifi_cmd, "AT+CWJAP=\"%s\",\"%s\"", WIFI_NAME, WIFI_PWD);
ESP8266_SendCmd(wifi_cmd, "OK", 5000); // 连WiFi耗时久,超时设5秒
// 4. 关闭多连接(仅单TCP连接)
ESP8266_SendCmd("AT+CIPMUX=0", "OK", 1000);
// 5. 连接手机TCP服务器(格式:AT+CIPSTART="TCP","IP",端口)
char tcp_cmd[64];
sprintf(tcp_cmd, "AT+CIPSTART=\"TCP\",\"%s\",%s", PHONE_IP, TCP_PORT);
ESP8266_SendCmd(tcp_cmd, "CONNECT", 3000); // 响应含"CONNECT"表示连接成功
// 6. 开启透传模式(发送数据无需加AT指令,直接发)
ESP8266_SendCmd("AT+CIPMODE=1", "OK", 1000);
ESP8266_SendCmd("AT+CIPSEND", ">", 1000); // 发送该指令后,ESP8266进入透传(等待">"后发数据)
}
4. 温湿度生成与发送(main.c 中添加)
c
运行
// 生成随机温湿度(模拟传感器数据),并通过ESP8266发送
void STM32_SendTempHum(void)
{
static uint32_t last_time = 0;
if (HAL_GetTick() - last_time < 2000) return; // 每2秒发送1次,避免数据刷屏
// 1. 生成随机数据(温度20-30℃,湿度40-60%)
uint8_t temp = rand() % 11 + 20; // rand()%11=0-10,+20→20-30
uint8_t hum = rand() % 21 + 40; // rand()%21=0-20,+40→40-60
// 2. 拼接发送格式(透传模式直接发字符串,无需AT指令)
char data_buf[32];
sprintf(data_buf, "Temp:%d℃,Hum:%d%%\r\n", temp, hum);
// 3. 发送数据到ESP8266(透传模式,数据直接转发到TCP助手)
HAL_UART_Transmit(&huart2, (uint8_t *)data_buf, strlen(data_buf), 500);
printf("Sent: %s", data_buf); // 调试用,打印发送的内容
last_time = HAL_GetTick(); // 更新上次发送时间
}
5. main 函数(核心逻辑调用)
c
运行
int main(void)
{
// 1. CubeIDE自动生成的初始化代码(时钟、GPIO、串口等)
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART2_UART_Init();
// 2. 初始化ESP8266(连WiFi、建TCP连接)
ESP8266_Init();
// 3. 主循环:持续生成并发送温湿度
while (1)
{
STM32_SendTempHum(); // 发送温湿度数据
HAL_Delay(100); // 小延时,稳定程序
}
}
四、仿真与测试步骤
- Proteus 仿真:搭建上述电路,点击 “开始仿真”,STM32 会自动初始化 ESP8266(仿真中 ESP8266 指示灯会闪烁表示工作)。
- 手机 TCP 助手配置:
- 手机连接与
WIFI_NAME一致的 WiFi; - 打开 TCP 助手 APP(如 “网络调试助手”),选择 “TCP 服务器” 模式,端口填
TCP_PORT(如 8080),点击 “启动”。
- 手机连接与
- 验证结果:手机 TCP 助手会每隔 2 秒收到一条 “Temp:XX℃,Hum:XX%” 的消息,说明 STM32 与 ESP8266 通信正常,WiFi 数据传输成功。
更多推荐




所有评论(0)