基于STM32F103C8T6与HC-05的蓝牙串口透传:从零构建手机APP无线控制LED系统

基于STM32F103C8T6与HC-05的蓝牙串口透传:从零构建手机APP无线控制LED系统 1. 项目背景与硬件准备第一次接触STM32和蓝牙模块时我被这个组合的潜力惊艳到了。想象一下用手机就能控制家里的灯光这种物联网的初级应用其实离我们并不遥远。这次我们要用STM32F103C8T6俗称蓝莓板和HC-05蓝牙模块搭建一个无线LED控制系统整个过程就像搭积木一样有趣。你需要准备的硬件清单很简单STM32F103C8T6最小系统板某宝20元左右HC-05蓝牙模块建议买带底板版本约15元LED灯普通5mm直径即可220欧姆限流电阻杜邦线若干建议公对公、母对母各准备10根USB转TTL模块用于调试CH340芯片版本最便宜特别提醒新手HC-05模块有JDY-31、HC-06等变种建议选择经典HC-05因为它的资料最全。我刚开始贪便宜买了不知名型号结果AT指令不兼容调试了整整两天。2. 硬件连接详解2.1 电路原理分析这个项目的核心是串口通信。STM32通过USART与HC-05对话就像两个人用对讲机交流。当手机APP发送led on时蓝牙模块会把这句话原样传给STM32单片机收到后就让PC13引脚输出低电平点亮LED。接线时要注意电压匹配HC-05的工作电压是3.3V而STM32的IO口也是3.3V电平所以可以直接连接。如果用5V供电的Arduino就需要电平转换电路了。2.2 具体接线步骤按照这个顺序连接最不容易出错先接电源STM32的3.3V → HC-05的VCCGND对GND串口交叉连接HC-05的TXD接STM32的PA10(RX)HC-05的RXD接STM32的PA9(TX)LED电路PC13引脚 → 220Ω电阻 → LED正极 → LED负极 → GND实测中发现个坑如果先用USB给STM32供电再接蓝牙模块有时会出现通信失败。正确的上电顺序应该是先接好所有线路最后再通电。3. HC-05蓝牙模块配置3.1 AT指令实战要让蓝牙模块听话得先进入它的配置模式按住模块上的小按钮不放同时给模块上电看到指示灯变成慢闪约2秒一次后松开按钮这时候用USB转TTL连接电脑打开串口调试助手推荐使用XCOM V2.2关键设置波特率38400配置模式固定值数据位8停止位1校验位无发送AT应该会收到OK回复。我整理了最实用的几条AT指令指令功能说明示例ATNAME?查询当前设备名返回NAME:HC-05ATNAMEMyLED修改设备名为MyLED成功后返回OKATUART?查询通信波特率返回UART:9600,0,0ATUART115200,0,0修改波特率为115200需重启生效ATPSWD1234设置配对密码为1234防止别人乱连3.2 常见问题排查遇到过最头疼的问题是发送AT指令没反应通常有三个原因串口线接反了TXD-RX要交叉波特率不对必须38400模块没进入AT模式指示灯必须是慢闪建议新手先用手机蓝牙搜索模块如果能发现设备说明基础功能正常可以继续调试。4. STM32程序设计4.1 开发环境搭建我用的是Keil MDKSTM32CubeMX组合拳安装STM32CubeMX后选择STM32F103C8T6芯片配置USART1为异步模式波特率9600与HC-05匹配启用PC13为GPIO_Output生成代码后用Keil打开工程关键代码片段解析// 串口中断回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart-Instance USART1){ if(RxBuffer[0] o){ // 收到on开头的指令 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); HAL_UART_Transmit(huart1, LED ON\r\n, 8, 100); } else if(RxBuffer[0] f){ // 收到off指令 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); HAL_UART_Transmit(huart1, LED OFF\r\n, 9, 100); } HAL_UART_Receive_IT(huart1, RxBuffer, 1); // 重新启用接收 } }4.2 通信协议设计为了让控制更可靠我设计了个简单协议指令以#开头$结尾中间为命令内容如#on$表示开灯对应的代码处理逻辑if(RxBuffer[0] #){ command_flag 1; cmd_index 0; } else if(RxBuffer[0] $ command_flag){ command_flag 0; process_command(received_cmd); // 处理存储的命令 } else if(command_flag){ received_cmd[cmd_index] RxBuffer[0]; }5. 手机APP配置与调试5.1 蓝牙调试APP选择试过十几款APP后我推荐这两款蓝牙串口助手安卓界面简洁支持指令保存Serial Bluetooth Terminal开源免费可自定义界面安装后先配对设备默认密码一般是1234或0000然后选择SPP协议连接。成功连接后HC-05的指示灯会从快闪变为双闪。5.2 调试技巧分享遇到数据收发不正常时可以先用USB转TTL连接电脑用串口助手看原始数据在STM32程序里添加调试输出比如printf(Received: %s\r\n, RxBuffer);检查手机APP的发送格式是否添加了换行符建议统一用\r\n有个容易忽略的细节部分手机会在后台休眠时断开蓝牙连接需要在APP设置里保持常连接。6. 项目优化与扩展完成基础功能后可以尝试这些升级多LED控制用不同指令控制多个GPIO口状态反馈STM32将LED状态回传给手机PWM调光通过发送数值调节LED亮度定时功能实现手机端预约开关进阶版代码结构示例typedef struct { uint8_t cmd; uint8_t pin; uint8_t value; } BLUETOOTH_CMD; void parse_command(char* str) { BLUETOOTH_CMD bt_cmd; sscanf(str, %c%d%d, bt_cmd.cmd, bt_cmd.pin, bt_cmd.value); switch(bt_cmd.cmd){ case S: // Set pin HAL_GPIO_WritePin(get_port(bt_cmd.pin), get_pin(bt_cmd.pin), bt_cmd.value ? GPIO_PIN_SET : GPIO_PIN_RESET); break; case P: // PWM control set_pwm_duty(bt_cmd.pin, bt_cmd.value); break; } }最后提醒大家下载程序时要断开蓝牙模块的TX线否则可能干扰烧录。这个项目虽然简单但涵盖了嵌入式开发的完整流程非常适合作为物联网开发的入门练习。