从零到一:基于STM32与ESP-AT指令的巴法云MQTT设备实战

张开发
2026/4/23 23:38:37 15 分钟阅读

分享文章

从零到一:基于STM32与ESP-AT指令的巴法云MQTT设备实战
1. 为什么选择STM32ESP-01S组合第一次接触物联网开发时我被各种通信协议和硬件组合搞得头晕眼花。直到发现STM32ESP-01S这个黄金搭档才真正体会到什么叫低成本高性能。STM32F103C8T6核心板价格不到20元ESP-01S模块更是只要十几块加起来不过一杯奶茶的钱却能实现完整的物联网设备功能。ESP-01S内置了完整的TCP/IP协议栈通过AT指令就能轻松操作Wi-Fi连接。这相当于把复杂的网络通信封装成了简单的串口命令让STM32这类资源有限的MCU也能轻松上网。我实测过用STM32的USART1连接ESP-01S发送十几条AT指令就能完成从配网到MQTT通信的全过程。2. 硬件准备与环境搭建2.1 必备硬件清单主控芯片STM32F103C8T6蓝色pill开发板Wi-Fi模块ESP-01S注意要买带金属屏蔽罩的版本下载器ST-Link V2用于STM32程序烧录USB-TTLCP2102或CH340模块ESP-01S烧录用杜邦线建议准备20根母对母线特别提醒ESP-01S的工作电压是3.3V千万不要直接接5V我在初期测试时就因为接错电压烧坏过两个模块。正确的接法是用STM32的3.3V输出给ESP-01S供电或者单独使用3.3V稳压模块。2.2 开发环境配置安装Keil MDK到官网下载ARM版Keil安装STM32F1系列支持包配置串口工具推荐使用SecureCRT或Putty设置波特率115200准备AT固件从安信可官网下载ESP-01S的AT固件版本号1471安装驱动根据USB-TTL型号安装CH340或CP210x驱动初次使用时建议先用USB-TTL单独测试ESP-01S。连接方式如下ESP-01S USB-TTL VCC → 3.3V GND → GND TX → RX RX → TX打开串口工具发送AT收到OK回复说明模块工作正常。3. ESP-01S固件烧录指南3.1 进入下载模式ESP-01S烧录需要特殊接线GPIO0接GND拉低进入下载模式CH_PD和RST接3.3V保持其他引脚悬空这个步骤最容易出错。有次我烧录失败十几次最后发现是GPIO0接触不良。建议用示波器检查各引脚电平或者直接使用带按钮的烧录底座。3.2 使用Flash工具烧录打开乐鑫官方烧录工具ESPFlashDownloadTool选择下载的固件bin文件设置SPI速度为40MHz模式为DIO点击START开始烧录烧录成功后记得断开GPIO0与GND的连接让模块进入正常工作模式。这时候再发送AT命令应该能看到类似这样的响应AT OK ATGMR AT version:1.7.0.0(May 11 2021 18:09:02) SDK version:3.1.0(07af875) compile time:May 11 2021 18:31:17 OK4. AT指令连接Wi-Fi实战4.1 基础AT指令测试在连接Wi-Fi前建议先测试这些基础指令ATCWMODE1 # 设置STA模式 ATCWLAP # 扫描附近Wi-Fi ATCIPSTATUS # 查看网络状态特别注意每条AT指令后要加回车换行\r\n这是很多新手容易忽略的点。STM32的串口发送可以这样实现HAL_UART_Transmit(huart1, AT\r\n, 4, 100);4.2 连接无线网络连接Wi-Fi的标准指令序列ATCWJAPSSID,password成功连接后会返回WIFI CONNECTED WIFI GOT IP实际项目中我发现三个常见问题中文SSID需要转码处理密码含特殊字符时要用反斜杠转义模块可能返回FAIL但实际已连接可靠的检测方法是发送ATCIPSTATUS查看返回状态是否为STATUS:3已获取IP。5. 连接巴法云MQTT服务器5.1 巴法云账号配置注册巴法云账号并创建主题记录以下关键信息服务器地址bemfa.com端口9501MQTT私钥在控制台查看5.2 MQTT连接指令序列完整连接流程ATMQTTUSERCFG0,1,clientID,username,password,0,0, ATMQTTCONN0,bemfa.com,9501,0这里的username就是巴法云提供的私钥password可留空。成功连接后会返回MQTTCONNECTED:0,1,bemfa.com,95015.3 主题订阅与发布订阅主题指令ATMQTTSUB0,topic,1发布消息指令ATMQTTPUB0,topic,message,0,0注意最后一个参数QoS要设为0或1巴法云不支持QoS2。我在项目中封装了这样的STM32发送函数void MQTT_Publish(char* topic, char* msg) { char buffer[128]; sprintf(buffer, ATMQTTPUB0,\%s\,\%s\,0,0\r\n, topic, msg); HAL_UART_Transmit(huart1, (uint8_t*)buffer, strlen(buffer), 100); }6. STM32串口控制实战6.1 硬件连接示意图STM32F103C8T6 ESP-01S PA9(TX) → RX PA10(RX) → TX 3.3V → VCC GND → GND6.2 串口中断接收处理ESP-01S的响应数据需要通过中断接收。建议使用环形缓冲区#define BUF_SIZE 256 uint8_t rx_buf[BUF_SIZE]; uint16_t rx_index 0; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart-Instance USART1) { uint8_t byte huart-Instance-DR; rx_buf[rx_index] byte; if(rx_index BUF_SIZE) rx_index 0; } HAL_UART_Receive_IT(huart, rx_buf[rx_index], 1); }6.3 指令响应解析AT指令响应通常以\r\n结尾。可以这样检测完整响应int check_response(char* buf) { char* pos strstr(buf, \r\n); if(pos ! NULL) { if(strstr(buf, OK) ! NULL) return 1; if(strstr(buf, ERROR) ! NULL) return -1; } return 0; }7. 常见问题与解决方案7.1 模块无响应排查步骤检查供电电压3.3V±0.2V测量TX/RX信号建议用逻辑分析仪尝试降低波特率有些模块默认是9600检查AT固件版本是否匹配7.2 网络连接不稳定处理增加Wi-Fi重连机制void WiFi_Reconnect() { send_at_command(ATCWQAP); HAL_Delay(1000); send_at_command(ATCWJAP\SSID\,\password\); }添加看门狗定时器优化天线位置ESP-01S的PCB天线对方向敏感7.3 MQTT断线重连策略建议在STM32中实现心跳机制void MQTT_KeepAlive() { static uint32_t last_send 0; if(HAL_GetTick() - last_send 30000) { send_at_command(ATMQTTPING0); last_send HAL_GetTick(); } }8. 项目优化建议8.1 降低功耗方案使用ESP-01S的深度睡眠模式ATGSLP3600000 # 睡眠1小时STM32进入STOP模式通过ESP-01S的RST引脚唤醒8.2 提高通信可靠性实现消息重发队列添加消息序号校验使用JSON格式封装数据8.3 扩展功能实现OTA远程升级多主题订阅管理TLS加密通信需支持SSL的AT固件这个项目最让我惊喜的是整套方案的成本不到50元却实现了商业级物联网设备的核心功能。记得第一次在手机上收到STM32上传的传感器数据时那种成就感至今难忘。现在我的书架上还放着当初调试用的第一块ESP-01S模块虽然它的引脚已经被我焊得面目全非但它见证了一个物联网小白的成长历程。

更多文章