STM32+ESP32蓝牙串口透传:低成本构建无线数据采集与手机交互系统 1. 为什么选择STM32ESP32蓝牙串口透传方案在物联网和智能硬件开发中无线数据传输一直是关键环节。传统方案通常采用HC-05这类专用蓝牙模块但ESP32的出现给了我们更优的选择。ESP32不仅自带蓝牙4.2和Wi-Fi双模通信能力还拥有240MHz双核处理器和丰富的外设接口价格却与普通蓝牙模块相当。我去年为一个农业监测项目设计数据采集系统时就遇到了传感器数据无线传输的难题。客户要求低成本、低功耗还要支持手机实时查看数据。尝试过多种方案后最终选择了STM32ESP32的组合——STM32F103负责采集土壤温湿度传感器数据ESP32作为蓝牙透传模块。实测下来整套方案硬件成本不到50元手机端延迟控制在200ms以内完全满足需求。这种架构的核心优势在于开发门槛低STM32只需通过串口发送文本无需处理复杂通信协议成本优势ESP32模组价格已降至15元左右比专用蓝牙模块更便宜灵活扩展同一套硬件稍作修改即可支持Wi-Fi上传云端功耗可控ESP32蓝牙模式平均电流仅20mA适合电池供电场景2. 硬件连接与配置要点2.1 硬件选型建议根据我的踩坑经验推荐以下硬件组合主控芯片STM32F103C8T6性价比之王资料丰富蓝牙模组ESP32-WROOM-32内置PCB天线通信稳定电平转换当STM32使用3.3V供电时可直接与ESP32连接若STM32为5V系统需添加电平转换电路关键参数对照表参数STM32F103C8T6ESP32-WROOM-32工作电压2.0-3.6V2.7-3.6V串口波特率最高4.5Mbps默认支持115200待机功耗10μA5μAdeep sleep2.2 接线示意图正确的接线是成功的第一步这里有个容易出错的细节交叉连接TX/RX。我遇到过至少三个学员因为接反导致通信失败的情况。具体连接方式STM32_TX - ESP32_RX (GPIO16) STM32_RX - ESP32_TX (GPIO17) STM32_GND - ESP32_GND注意ESP32启动时GPIO0需保持高电平否则会进入下载模式。如果要用作普通IO口建议上拉10k电阻。3. ESP32固件烧录与配置3.1 免编程配置方法让ESP32变身蓝牙串口模块的关键在于烧录专用固件。推荐使用Arduino IDE开发环境具体步骤如下安装ESP32开发板支持包 Boards Manager URL添加https://dl.espressif.com/dl/package_esp32_index.json 新建Sketch粘贴以下代码#include BluetoothSerial.h BluetoothSerial SerialBT; void setup() { Serial.begin(115200); SerialBT.begin(MyDataLogger); // 蓝牙设备名称 Serial.println(Ready for pairing!); } void loop() { // 双向透传 if (Serial.available()) { SerialBT.write(Serial.read()); } if (SerialBT.available()) { Serial.write(SerialBT.read()); } delay(10); }选择开发板类型为ESP32 Dev Module点击上传等待烧录完成实测中发现蓝牙名称最好不要包含特殊字符否则部分手机可能无法识别。我曾用Data_Logger#1命名时华为手机就搜索不到设备改为纯英文后问题解决。3.2 高级配置技巧如果需要修改默认参数可以通过AT指令配置需先烧录AT固件ATBTNAMENewName // 修改设备名称 ATBTBAUD9600 // 修改波特率有个实用技巧在setup()中加入以下代码可以通过手机发送RESET命令重启ESP32SerialBT.onData([](uint8_t *data, size_t len) { if(strncmp((char*)data, RESET, 5)0) { ESP.restart(); } });4. STM32数据发送实战4.1 基础串口通信STM32端的开发异常简单只需初始化串口并发送数据即可。以HAL库为例// 串口初始化 UART_HandleTypeDef huart1; huart1.Instance USART1; huart1.Init.BaudRate 115200; huart1.Init.WordLength UART_WORDLENGTH_8B; huart1.Init.StopBits UART_STOPBITS_1; huart1.Init.Parity UART_PARITY_NONE; HAL_UART_Init(huart1); // 发送传感器数据 void sendSensorData(float temp, float humi) { char buffer[64]; sprintf(buffer, Temp:%.1fC,Humi:%.1f%%\r\n, temp, humi); HAL_UART_Transmit(huart1, (uint8_t*)buffer, strlen(buffer), 100); }实际项目中建议在数据前后添加帧头帧尾比如$DATA,25.5,60.3#方便手机端解析。我曾遇到电磁干扰导致数据错乱的情况加入校验机制后问题迎刃而解。4.2 低功耗优化策略对于电池供电的设备功耗控制至关重要。推荐两种优化方案间歇工作模式void enterLowPowerMode() { HAL_UART_DeInit(huart1); // 关闭串口 HAL_GPIO_WritePin(ESP32_EN_GPIO_Port, ESP32_EN_Pin, GPIO_PIN_RESET); // 关闭ESP32电源 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); SystemClock_Config(); // 唤醒后重新初始化时钟 }数据打包发送将采样间隔从1秒改为10秒一次性发送10组数据。实测可使ESP32工作时间缩短80%。5. 手机端应用开发5.1 现成APP方案对于快速验证推荐这些蓝牙串口APP避免广告嫌疑不放具体链接AndroidSerial Bluetooth Terminal、BLE ScanneriOSLightBlue、Bluetooth Terminal以Serial Bluetooth Terminal为例连接步骤扫描并配对MyDataLogger设置波特率115200接收区会实时显示STM32发送的数据5.2 自定义APP开发如果需要更专业的界面可以用MIT App Inventor快速开发。关键步骤添加Bluetooth组件接收数据处理逻辑当Bluetooth1.数据收到时 变量data ← 合并数据块 如果data包含Temp:则 标签温度显示 ← 取文本片段(data, Temp:, C) 结束如果我帮一个温室项目开发的控制APP就是用这种方法在2天内完成的客户非常满意。6. 常见问题排查指南根据50个实际项目经验总结出这些高频问题问题1手机搜不到蓝牙信号检查ESP32是否供电不足示波器看3.3V波形确认天线没有被金属外壳屏蔽尝试修改蓝牙名称某些手机会过滤特殊字符问题2数据乱码核对双方波特率是否一致用逻辑分析仪抓取波形检查地线是否连接可靠在TX线上加100Ω电阻抑制振铃问题3连接频繁断开避免在loop()中使用delay改用millis()定时调整ESP32射频功率SerialBT.setPin(1234, ESP_SPP_SEC_AUTHENTICATE)在STM32串口发送前添加while(HAL_UART_GetState(huart1) ! HAL_UART_STATE_READY)最近遇到一个典型案例客户反映数据传输10分钟后必断。最终发现是STM32的串口缓冲区溢出通过增加HAL_UART_Transmit的超时时间到500ms解决了问题。7. 项目进阶与扩展基础功能实现后可以考虑这些增强功能数据加密传输// AES加密示例 #include mbedtls/aes.h void encryptData(char* plaintext) { mbedtls_aes_context aes; unsigned char key[16] {...}; unsigned char iv[16] {...}; mbedtls_aes_setkey_enc(aes, key, 128); mbedtls_aes_crypt_cbc(aes, MBEDTLS_AES_ENCRYPT, strlen(plaintext), iv, (unsigned char*)plaintext, (unsigned char*)plaintext); }多设备组网通过修改ESP32的MAC地址可以实现一主多从架构。我在一个仓库温控系统中就用1个手机同时监控8个采集节点。OTA远程升级ESP32支持蓝牙OTA可以通过手机APP更新STM32固件。具体实现需要分段传输和校验机制这里不再展开。这套方案经过三年迭代已经成功应用于智能农业、工业监测、医疗设备等20多个项目。最大的优势在于开发周期短——从硬件设计到APP联调熟练工程师3天就能完成原型开发。对于预算有限又需要无线功能的产品绝对是性价比首选。