手把手教你用STM32F103C8T6和HC-06蓝牙模块,实现手机App远程控制LED灯

张开发
2026/4/11 12:05:28 15 分钟阅读

分享文章

手把手教你用STM32F103C8T6和HC-06蓝牙模块,实现手机App远程控制LED灯
从零搭建STM32蓝牙LED控制系统硬件连接、代码解析与手机端交互全指南当你第一次看到手机App能远程控制LED灯亮灭时那种科技魔法成真的兴奋感正是嵌入式开发的魅力所在。本文将带你用最常见的STM32F103C8T6开发板俗称蓝莓派和HC-06蓝牙模块构建一个完整的无线控制项目。不同于单纯的理论讲解我们会从元器件选型开始逐步完成硬件连接、固件开发、指令协议设计直到手机端交互最终让你获得一个可展示的实际作品。1. 项目准备与硬件搭建1.1 元器件清单与选型建议准备以下核心组件总成本不超过50元主控芯片STM32F103C8T6开发板核心板尺寸仅53mm×22mm蓝牙模块HC-06从机模块注意区分HC-05主从一体模块外围电路LED灯×2建议不同颜色、220Ω限流电阻、杜邦线若干提示购买HC-06时认准背面有ZS-040标识的正品模块市面上存在兼容性差的仿制品。1.2 硬件连接示意图按以下方式连接电路使用开发板3.3V供电更稳定蓝牙模块引脚STM32连接点功能说明VCC3.3V电源正极GNDGND电源地TXDPA3(USART2_RX)蓝牙发送→单片机接收RXDPA2(USART2_TX)单片机发送→蓝牙接收LED连接方案// LED1 - PB8, LED2 - PB9 GPIO_InitStructure.GPIO_Pin GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_Init(GPIOB, GPIO_InitStructure);1.3 电源方案优化常见问题排查若蓝牙模块频繁断开尝试在VCC与GND之间并联100μF电容避免使用开发板5V输出HC-06虽标称支持但实际工作不稳定用万用表测量电压确保在3.3V±0.2V范围内2. 蓝牙通信基础配置2.1 USART串口初始化在usart.c中配置USART2用于蓝牙通信void USART2_Init(uint32_t baudrate) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // PA2(TX)推挽输出PA3(RX)浮空输入 GPIO_InitStructure.GPIO_Pin GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, GPIO_InitStructure); USART_InitStructure.USART_BaudRate baudrate; USART_InitStructure.USART_WordLength USART_WordLength_8b; USART_InitStructure.USART_StopBits USART_StopBits_1; USART_InitStructure.USART_Parity USART_Parity_No; USART_InitStructure.USART_Mode USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2, USART_InitStructure); USART_Cmd(USART2, ENABLE); }2.2 蓝牙AT指令配置通过串口调试助手完成基础配置波特率9600发送AT应返回OK修改模块名称ATNAMEBLUE_LED设置配对密码ATPIN1234查询版本ATVERSION注意HC-06仅支持特定AT指令集输入后需以\r\n结尾2.3 中断接收配置实现数据接收中断服务函数uint8_t bluetooth_rx_buffer[64]; uint8_t bluetooth_rx_index 0; void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2, USART_IT_RXNE) ! RESET) { uint8_t ch USART_ReceiveData(USART2); bluetooth_rx_buffer[bluetooth_rx_index] ch; if(ch \n || bluetooth_rx_index sizeof(bluetooth_rx_buffer)-1) { bluetooth_rx_buffer[bluetooth_rx_index] \0; Process_Bluetooth_Command((char*)bluetooth_rx_buffer); bluetooth_rx_index 0; } } }3. 控制协议设计与实现3.1 自定义指令协议设计简洁的ASCII协议格式指令示例功能说明L1:1LED1亮L1:0LED1灭L2:TLED2切换状态S?:查询当前所有LED状态协议特点冒号分隔指令类型和参数状态查询返回格式L1:1,L2:0每条指令以换行符\n结束3.2 指令处理函数实现void Process_Bluetooth_Command(char* cmd) { if(strncmp(cmd, L1:, 3) 0) { GPIO_WriteBit(GPIOB, GPIO_Pin_8, cmd[3] 1 ? Bit_SET : Bit_RESET); USART_SendResponse(L1 set OK); } else if(strncmp(cmd, L2:T, 4) 0) { GPIO_WriteBit(GPIOB, GPIO_Pin_9, (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_9) Bit_SET) ? Bit_RESET : Bit_SET); USART_SendResponse(L2 toggled); } else if(strncmp(cmd, S?:, 3) 0) { char status[32]; sprintf(status, L1:%d,L2:%d, GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_8), GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_9)); USART_SendResponse(status); } } void USART_SendResponse(char* msg) { while(*msg) { USART_SendData(USART2, *msg); while(USART_GetFlagStatus(USART2, USART_FLAG_TC) RESET); } USART_SendData(USART2, \n); }4. 手机端交互实现4.1 推荐App与配置Android平台选用Serial Bluetooth Terminal免费无广告连接步骤扫描设备选择BLUE_LED输入配对密码1234设置通信波特率9600关键配置发送新行启用字符编码ASCII终端回显启用4.2 自定义控制界面使用App的Custom buttons功能创建控制面板[LED1 ON] - 发送L1:1 [LED1 OFF] - 发送L1:0 [TOGGLE LED2] - 发送L2:T [STATUS] - 发送S?:4.3 高级功能扩展在main.c中添加定时状态上报void TIM3_IRQHandler(void) { if(TIM_GetITStatus(TIM3, TIM_IT_Update) ! RESET) { static uint8_t counter 0; if(counter 10) { // 每秒上报一次 counter 0; char report[32]; sprintf(report, STAT:L1:%d,L2:%d, GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_8), GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_9)); USART_SendResponse(report); } TIM_ClearITPendingBit(TIM3, TIM_IT_Update); } }5. 项目优化与调试技巧5.1 常见问题解决方案蓝牙无法连接检查电源电压≥3.3V确认TX/RX交叉连接重新烧录AT固件数据乱码核对双方波特率检查USART时钟配置添加软件去抖处理响应延迟优化中断优先级减少调试打印输出检查堆栈溢出5.2 功耗优化措施通过修改电路和代码降低功耗硬件层面在LED回路串联1kΩ电阻使用MOSFET代替直接驱动软件层面// 进入低功耗模式 void Enter_Stop_Mode(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); SystemInit(); // 唤醒后重新初始化时钟 }5.3 扩展思路将这个项目作为基础平台可以扩展增加PWM调光功能指令如L1:P50接入温湿度传感器实现环境监测开发iOS/Android专属App使用Flutter跨平台框架添加Wi-Fi网关实现互联网远程控制实际部署时发现用热熔胶固定蓝牙模块天线部分能提升信号强度约20%。对于需要长距离控制的场景建议选用Class1蓝牙模块理论传输距离100米。

更多文章