当前位置: 首页 > news >正文

基于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 具体接线步骤

按照这个顺序连接最不容易出错:

  1. 先接电源:STM32的3.3V → HC-05的VCC,GND对GND
  2. 串口交叉连接:HC-05的TXD接STM32的PA10(RX),HC-05的RXD接STM32的PA9(TX)
  3. LED电路:PC13引脚 → 220Ω电阻 → LED正极 → LED负极 → GND

实测中发现个坑:如果先用USB给STM32供电,再接蓝牙模块,有时会出现通信失败。正确的上电顺序应该是先接好所有线路,最后再通电。

3. HC-05蓝牙模块配置

3.1 AT指令实战

要让蓝牙模块听话,得先进入它的"配置模式":

  1. 按住模块上的小按钮不放
  2. 同时给模块上电
  3. 看到指示灯变成慢闪(约2秒一次)后松开按钮

这时候用USB转TTL连接电脑,打开串口调试助手(推荐使用XCOM V2.2),关键设置:

  • 波特率:38400(配置模式固定值)
  • 数据位:8
  • 停止位:1
  • 校验位:无

发送"AT"应该会收到"OK"回复。我整理了最实用的几条AT指令:

指令功能说明示例
AT+NAME?查询当前设备名返回:+NAME:HC-05
AT+NAME=MyLED修改设备名为MyLED成功后返回OK
AT+UART?查询通信波特率返回:+UART:9600,0,0
AT+UART=115200,0,0修改波特率为115200需重启生效
AT+PSWD=1234设置配对密码为1234防止别人乱连

3.2 常见问题排查

遇到过最头疼的问题是发送AT指令没反应,通常有三个原因:

  1. 串口线接反了(TXD-RX要交叉)
  2. 波特率不对(必须38400)
  3. 模块没进入AT模式(指示灯必须是慢闪)

建议新手先用手机蓝牙搜索模块,如果能发现设备,说明基础功能正常,可以继续调试。

4. STM32程序设计

4.1 开发环境搭建

我用的是Keil MDK+STM32CubeMX组合拳:

  1. 安装STM32CubeMX后,选择STM32F103C8T6芯片
  2. 配置USART1为异步模式,波特率9600(与HC-05匹配)
  3. 启用PC13为GPIO_Output
  4. 生成代码后用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后,我推荐这两款:

  1. 蓝牙串口助手(安卓):界面简洁,支持指令保存
  2. Serial Bluetooth Terminal:开源免费,可自定义界面

安装后先配对设备(默认密码一般是1234或0000),然后选择SPP协议连接。成功连接后HC-05的指示灯会从快闪变为双闪。

5.2 调试技巧分享

遇到数据收发不正常时,可以:

  1. 先用USB转TTL连接电脑,用串口助手看原始数据
  2. 在STM32程序里添加调试输出,比如:
printf("Received: %s\r\n", RxBuffer);
  1. 检查手机APP的发送格式,是否添加了换行符(建议统一用\r\n)

有个容易忽略的细节:部分手机会在后台休眠时断开蓝牙连接,需要在APP设置里保持常连接。

6. 项目优化与扩展

完成基础功能后,可以尝试这些升级:

  1. 多LED控制:用不同指令控制多个GPIO口
  2. 状态反馈:STM32将LED状态回传给手机
  3. PWM调光:通过发送数值调节LED亮度
  4. 定时功能:实现手机端预约开关

进阶版代码结构示例:

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线,否则可能干扰烧录。这个项目虽然简单,但涵盖了嵌入式开发的完整流程,非常适合作为物联网开发的入门练习。

http://www.jsqmd.com/news/1096459/

相关文章:

  • 计算机毕业设计之大学生课堂考勤管理系统的设计与实现
  • Rocky Linux 配置 Codex + DeepSeek-V4-Pro 完整方案
  • 大模型最怕的四个字:你确定吗?
  • Cursor Free VIP破解工具:三步突破AI编程助手试用限制
  • 支持私有化部署的开源商城系统推荐:Likeshop、ShopXO深度解析
  • AI写作辅助平台8款AI论文软件梯队榜,毕业答辩稳了!
  • CAPL脚本中整型数组与Hex字符串互转的实战技巧与性能优化
  • 2026 AI营销机构选型指南:本土服务商塔米德数智科技的价值与路径
  • SLO2016光耦与TM4C129ENCPDT微控制器的工业通信方案
  • 陶瓷卫浴整厂输送线怎么规划合理?4 个核心设计要点与避坑指南
  • Miniconda:轻量级Python环境管理的利器与实战指南
  • Vivado IBERT实战:从眼图分析到误码率调优的硬件调试指南
  • 【S32K3实战指南】巧用FlexCAN FIFO Filters实现多ID精准接收
  • Flink on K8s:云原生架构部署分析
  • 项目文档骨架生成器
  • 云南历史类455-515分各分数段怎么填?云南工商学院从征集到稳妥都值得关注
  • Spring AOP(XML配置版):代理机制与拦截器
  • 【硬件设计实战】JTAG接口上下拉电阻配置全解析:从标准到芯片手册
  • 【小白也能轻松玩转龙虾】虾壳云一键部署教程,OpenClaw v2.7.9 可视化安装全过程(附最新安装包)
  • 2026年企业级AI API聚合平台选型指南:六大主流中转服务横向对比与技术评测
  • 终极音乐解放:3分钟掌握ncmdumpGUI,永久解锁网易云音乐加密文件
  • Kali Linux实战:SQL注入与XSS漏洞攻防演练
  • 从拒稿到录用:我的IEEE TII投稿实战复盘与避坑指南
  • 误删微信聊天记录不用愁,全套官方恢复教程,文末科普第三方渠道
  • 《重启日记》第十四周|主业忙碌,更新放缓:流量起伏无碍长期沉淀
  • 泰国华商出海数字化选型解析:国内大厂、本土软件与出海专属系统对比(批发 / 零售业态专属)
  • 别急着追Multi-Agent,先想清楚这三个问题
  • GPU内存完整性验证:MemtestCL架构解析与实战配置指南
  • 从状态访问到动作决策:占用度量如何量化策略的探索足迹
  • 这个级别的配置两万,别碰积家翻转古董表,单看这处表壳加工公差就会吃亏