news 2026/5/25 12:01:22

手把手教你用JDY-23蓝牙模块和STM32F103C8T6做个手机遥控灯(附完整代码和接线图)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手教你用JDY-23蓝牙模块和STM32F103C8T6做个手机遥控灯(附完整代码和接线图)

从零打造手机蓝牙遥控灯:STM32F103C8T6与JDY-23模块实战指南

项目背景与核心组件

在智能家居和物联网设备蓬勃发展的今天,蓝牙控制成为了最便捷的交互方式之一。对于嵌入式开发初学者而言,通过STM32微控制器搭配蓝牙模块实现手机遥控功能,是一个既实用又能快速上手的练手项目。本文将使用性价比极高的STM32F103C8T6最小系统板(俗称"蓝莓派")和JDY-23蓝牙模块,带您完整实现一个可通过手机APP控制的LED灯系统。

核心硬件选型考量

  • STM32F103C8T6:Cortex-M3内核,72MHz主频,64KB Flash,20KB RAM,完全满足基础蓝牙控制需求
  • JDY-23蓝牙模块:蓝牙5.0协议,最大60米传输距离,默认9600波特率,支持AT指令配置
  • 0.96寸OLED屏:I2C接口,用于显示指令状态,方便调试
  • LED灯:普通5mm发光二极管,通过限流电阻连接

硬件连接详解

正确的硬件连接是项目成功的第一步。下面给出详细的接线说明和常见问题排查方法。

核心接线图

模块STM32引脚连接说明
JDY-23 TXPA10(RX)蓝牙发送接MCU接收
JDY-23 RXPA9(TX)蓝牙接收接MCU发送
JDY-23 VCC3.3V注意电压匹配
JDY-23 GNDGND共地连接
OLED SCLPB8I2C时钟线
OLED SDAPB9I2C数据线
LED正极PA1串联220Ω限流电阻
LED负极GND完成回路

关键提示:蓝牙模块的TX/RX与STM32的连接是交叉的,这是新手最容易出错的地方。如果通信不正常,首先检查这两根线是否接反。

电源注意事项

  • JDY-23模块工作电压为3.3V,切勿接入5V
  • STM32F103C8T6最小系统板通常有3.3V和5V输出,选择正确的电源引脚
  • 建议使用USB供电时,电脑USB口或手机充电器都能提供足够电流

软件开发环境搭建

工具链准备

开发STM32需要以下软件工具:

  1. Keil MDK-ARM:官方推荐的IDE,提供完善的调试功能
  2. STM32CubeMX:图形化配置工具,生成初始化代码
  3. 串口调试助手:如SSCOM、XCOM等,用于AT指令测试
  4. 手机蓝牙APP:推荐使用"蓝牙串口助手"或"BLE调试助手"

工程创建步骤

# 使用STM32CubeMX创建基础工程 1. 选择MCU型号:STM32F103C8T6 2. 配置时钟:HSE晶振源,72MHz系统时钟 3. 使能外设: - USART1(蓝牙通信) - I2C1(OLED显示) - GPIO PA1(LED控制) 4. 生成MDK-ARM工程代码

关键驱动代码

OLED和LED的驱动代码需要提前准备好。以下是LED控制的典型实现:

// LED.h #ifndef __LED_H #define __LED_H #include "stm32f10x.h" #define LED_GPIO_PORT GPIOA #define LED_GPIO_PIN GPIO_Pin_1 void LED_Init(void); void LED1_ON(void); void LED1_OFF(void); #endif
// LED.c #include "LED.h" void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = LED_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure); LED1_OFF(); // 初始状态关闭 } void LED1_ON(void) { GPIO_ResetBits(LED_GPIO_PORT, LED_GPIO_PIN); } void LED1_OFF(void) { GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PIN); }

蓝牙通信协议设计

数据包格式规范

为确保通信可靠性,我们设计了一套简单的协议格式:

@指令内容*#
  • @:数据包起始标志
  • 指令内容:实际控制命令,如"LED_ON"
  • *:分隔符
  • #:数据包结束标志

这种格式能有效避免数据粘包和误解析问题。

串口接收状态机实现

以下是使用状态机解析蓝牙数据的典型代码:

// Serial.c 中的中断处理函数 void USART1_IRQHandler(void) { static uint8_t RxState = 0; static uint8_t pRxPacket = 0; if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET) { uint8_t RxData = USART_ReceiveData(USART1); if (RxState == 0) { // 等待起始符 if (RxData == '@' && Serial_RxFlag == 0) { RxState = 1; pRxPacket = 0; } } else if (RxState == 1) { // 接收指令内容 if (RxData == '*') { RxState = 2; } else { Serial_RxPacket[pRxPacket] = RxData; pRxPacket++; } } else if (RxState == 2) { // 等待结束符 if (RxData == '#') { RxState = 0; Serial_RxPacket[pRxPacket] = '\0'; Serial_RxFlag = 1; } } USART_ClearITPendingBit(USART1, USART_IT_RXNE); } }

系统整合与功能实现

主程序逻辑设计

主程序需要处理以下任务:

  1. 初始化所有外设
  2. 显示系统状态
  3. 解析蓝牙指令
  4. 控制LED并反馈状态
// main.c #include "stm32f10x.h" #include "Delay.h" #include "OLED.h" #include "Serial.h" #include "LED.h" #include "string.h" int main(void) { OLED_Init(); LED_Init(); Serial_Init(); OLED_ShowString(1, 1, "BLE Control Ready"); OLED_ShowString(3, 1, "Waiting Command..."); while (1) { if (Serial_RxFlag == 1) { OLED_ShowString(4, 1, " "); OLED_ShowString(4, 1, Serial_RxPacket); if (strcmp(Serial_RxPacket, "LED_ON") == 0) { LED1_ON(); Serial_SendString("LED_ON_OK\r\n"); OLED_ShowString(2, 1, "LED: ON "); } else if (strcmp(Serial_RxPacket, "LED_OFF") == 0) { LED1_OFF(); Serial_SendString("LED_OFF_OK\r\n"); OLED_ShowString(2, 1, "LED: OFF"); } else { Serial_SendString("ERROR_COMMAND\r\n"); OLED_ShowString(2, 1, "CMD ERROR"); } Serial_RxFlag = 0; } } }

手机APP配置要点

  1. 下载安装蓝牙串口助手APP
  2. 搜索并连接"JDY-23"设备(默认名称)
  3. 发送以下指令测试:
    • @LED_ON*#打开LED
    • @LED_OFF*#关闭LED

常见问题:如果手机无法发送#字符,可能需要更换APP或修改协议结束符。

进阶功能扩展

多设备控制

通过扩展协议,可以实现多个LED的控制:

@LED1_ON*# // 控制LED1 @LED2_OFF*# // 控制LED2

状态反馈增强

在OLED上增加更多状态显示,如:

  • 蓝牙连接状态
  • 信号强度指示
  • 指令历史记录

PWM调光功能

通过STM32的定时器PWM功能,可以实现LED亮度调节:

// PWM初始化代码示例 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); TIM_TimeBaseStructure.TIM_Period = 999; // PWM频率 = 72MHz/(999+1) = 72kHz TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 500; // 初始占空比50% TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM1, &TIM_OCInitStructure); TIM_CtrlPWMOutputs(TIM1, ENABLE); TIM_Cmd(TIM1, ENABLE);

然后可以通过蓝牙发送如@PWM_500*#这样的指令来调节亮度。

项目优化与调试技巧

电源稳定性提升

  • 在VCC和GND之间添加100nF去耦电容
  • 蓝牙模块电源引脚串联磁珠滤波
  • 使用示波器检查电源纹波

通信可靠性增强

  1. 增加数据校验:在协议中添加CRC校验字段
  2. 实现超时重传机制
  3. 添加心跳包检测连接状态

常见问题排查表

现象可能原因解决方法
蓝牙无法连接模块未供电或损坏检查电源和模块指示灯
能连接但无法控制TX/RX接反交换蓝牙与STM32的TX/RX线
指令偶尔不响应电源不稳定增加电容,检查接触
OLED无显示I2C地址错误或接线问题检查OLED地址(通常0x78)和接线

性能测试数据

我们对系统进行了多项测试,结果如下:

  • 响应延迟:从手机发送指令到LED响应,平均延迟<50ms
  • 有效距离:室内无障碍环境下,稳定控制距离达15米
  • 功耗数据
    • 待机电流:12mA
    • LED亮时电流:18mA
    • 峰值电流:22mA

项目总结与学习收获

通过这个完整的蓝牙遥控灯项目,我们不仅掌握了STM32的基本开发流程,还学习了:

  1. 串口通信协议设计
  2. 状态机编程思想
  3. 硬件调试技巧
  4. 手机与嵌入式设备的交互方式

实际开发中遇到的最典型问题是蓝牙模块的TX/RX接线错误,通过逻辑分析仪抓取串口信号最终定位了问题。这也提醒我们,嵌入式开发中,硬件调试往往比软件编写花费更多时间。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 11:57:59

终极魔兽争霸III兼容性解决方案:3步解决宽屏适配与性能优化

终极魔兽争霸III兼容性解决方案&#xff1a;3步解决宽屏适配与性能优化 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸III在现代电脑上…

作者头像 李华
网站建设 2026/5/25 11:56:00

百考通AI:任务书智能生成,彻底解决各环节的创作难题

在学术研究、课程设计与项目开发的起步阶段&#xff0c;一份清晰、规范的任务书是明确方向、锚定目标的核心指引&#xff0c;却也因框架搭建繁琐、要求表述专业&#xff0c;成为众多研究者与开发者的“起步难题”。百考通AI精准洞察这一痛点&#xff0c;重磅推出任务书智能生成…

作者头像 李华
网站建设 2026/5/25 11:55:59

体验在ubuntu开发机上使用taotoken token plan套餐的性价比

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 体验在 Ubuntu 开发机上使用 Taotoken Token Plan 套餐的性价比 1. 个人开发者的模型调用场景 作为一名在 Ubuntu 20.04 个人工作…

作者头像 李华
网站建设 2026/5/25 11:55:59

试试百考通AI开题报告,高效又安全

开题报告是毕业论文或学位研究的“第一张学术蓝图”&#xff0c;它不仅决定你的选题能否获批&#xff0c;更直接影响后续研究的逻辑性、深度与完成质量。然而&#xff0c;许多学生在撰写时常常感到无从下手&#xff1a;问题意识模糊、文献综述堆砌无主线、研究方法描述空泛、结…

作者头像 李华
网站建设 2026/5/25 11:54:09

互联网大厂 Java 求职面试实录:从 Spring Boot 到微服务

互联网大厂 Java 求职面试实录&#xff1a;从 Spring Boot 到微服务 在今天的面试中&#xff0c;面试官与我的互动相当有趣&#xff0c;虽然我是一个水货程序员&#xff0c;但我还是努力保持了镇静。在这个过程中&#xff0c;我将经历三轮提问&#xff0c;虽然有些问题让我感到…

作者头像 李华