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

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

从零打造智能蓝牙小夜灯:STM32F103C8T6与JDY-23实战指南

深夜起床开灯刺眼的体验想必大家都不陌生。去年冬天,我女儿总被卧室顶灯惊醒,于是萌生了制作可调光小夜灯的想法。经过多次迭代,这套基于STM32和蓝牙模块的解决方案不仅解决了实际问题,还成了全家都爱不释手的智能小物件。下面就将这个项目的完整实现过程分享给大家,包含硬件选型技巧、协议设计思路和可商用的代码架构。

1. 硬件选型与核心组件解析

选择适合的硬件是项目成功的第一步。经过对比测试,我最终确定的硬件组合在性价比和易用性上达到了完美平衡:

  • 主控芯片:STM32F103C8T6(Blue Pill开发板)

    • 72MHz Cortex-M3内核,完全胜任蓝牙通信控制
    • 丰富的GPIO和USART接口
    • 市场价格约15-25元,性价比极高
  • 蓝牙模块:JDY-23 vs HC-05深度对比

    特性JDY-23HC-05
    协议版本蓝牙5.0蓝牙2.1
    工作电流8mA(连接状态)30-40mA
    传输距离60米10米
    默认波特率960038400
    价格约12元约25元

提示:JDY-23的BLE特性使其更适合电池供电场景,而HC-05在需要音频传输时更有优势

  • LED选择:建议使用5730贴片LED
    • 亮度可达60-80流明
    • 工作电压3.2-3.4V
    • 需配合铝基板散热

2. 硬件连接与电路设计

正确的电路连接是项目稳定的基础。下面是最小系统的接线方案:

/* 引脚定义 */ #define LED_PIN GPIO_Pin_1 // PA1 #define BT_TX_PIN GPIO_Pin_9 // PA9 (USART1_TX) #define BT_RX_PIN GPIO_Pin_10 // PA10 (USART1_RX) #define OLED_SCL GPIO_Pin_8 // PB8 #define OLED_SDA GPIO_Pin_9 // PB9

实际接线时需注意:

  1. 电源处理

    • 开发板USB供电时,需确保蓝牙模块和LED共用3.3V
    • 电池供电场景建议增加LC滤波电路
  2. 信号线处理

    • TX/RX交叉连接(MCU_TX→BT_RX,MCU_RX→BT_TX)
    • I2C总线需加上拉电阻(4.7KΩ)
  3. LED驱动电路

    graph LR PA1 -->|限流电阻| LED --> GND

    实际项目中请替换此图表为文字描述

注意:使用PWM调光时,MOSFET驱动比三极管方案效率更高

3. 蓝牙通信协议设计

稳定的通信协议是项目成功的关键。我设计的协议框架经过3个月实际使用零故障:

协议格式

@[命令类型][参数]*#[校验和]

完整指令集

  • 基础控制

    • @LED_ON*#开启灯光
    • @LED_OFF*#关闭灯光
  • 高级功能

    • @LED_DIM50*#设置50%亮度
    • @LED_CLRFF0000*#设置RGB颜色
    • @GET_STATUS*#获取当前状态

协议解析核心代码:

void USART1_IRQHandler(void) { static uint8_t state = 0; static uint8_t index = 0; uint8_t rxData = USART_ReceiveData(USART1); switch(state) { case 0: // 等待起始符 if(rxData == '@' && !rxFlag) state = 1; break; case 1: // 接收命令内容 if(rxData == '*') state = 2; else buffer[index++] = rxData; break; case 2: // 验证结束符 if(rxData == '#') { buffer[index] = '\0'; rxFlag = 1; index = 0; state = 0; } break; } USART_ClearITPendingBit(USART1, USART_IT_RXNE); }

4. 完整软件架构实现

采用模块化设计,方便后续功能扩展:

工程目录结构

├── CMSIS ├── Libraries ├── User │ ├── main.c │ ├── bluetooth.c │ ├── led.c │ ├── oled.c │ └── protocol.c └── Project

关键功能实现

  1. 蓝牙模块初始化:
void BT_Init(uint32_t baudrate) { USART_InitTypeDef USART_InitStruct; // 时钟使能代码省略... USART_InitStruct.USART_BaudRate = baudrate; USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART1, &USART_InitStruct); USART_Cmd(USART1, ENABLE); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); }
  1. PWM调光实现:
void LED_SetBrightness(uint8_t percent) { TIM_OCInitTypeDef TIM_OCInitStruct; uint16_t pulse = (percent * LED_MAX_PULSE) / 100; TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStruct.TIM_Pulse = pulse; TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC2Init(TIM3, &TIM_OCInitStruct); }

5. 项目优化与扩展方向

基础功能实现后,可以考虑以下增强功能:

  1. 低功耗优化

    • 启用STM32的STOP模式
    • 配置蓝牙模块自动休眠
    • 硬件上增加电源管理电路
  2. 手机APP开发

    • 使用MIT App Inventor快速原型开发
    • Android Studio开发专业控制界面
    • 加入情景模式(阅读/夜灯/唤醒)
  3. 云端接入

    # 示例:MQTT消息转发 import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): client.subscribe("home/bedroom/light") def on_message(client, userdata, msg): if msg.payload.decode() == "ON": # 发送蓝牙指令 ble_send("@LED_ON*#") client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.connect("mqtt.server.com", 1883, 60) client.loop_forever()

实际部署时发现,在2.4GHz WiFi密集区域,调整蓝牙信道能显著改善稳定性。通过AT指令修改JDY-23的工作信道:

AT+CH=10\r\n

这个项目最让我惊喜的是孩子的反应——她现在已经会用自己的平板电脑调节灯光颜色了。技术真正的价值,不就在于让生活变得更美好吗?

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

相关文章:

  • 使用RexUniNLU优化.NET文档处理流程的实战指南
  • 示波器测量UART波特率的原理与实践
  • 吃透 SAP Fiori 导航:从 Inner-App Navigation 到 Cross-App Navigation 的设计原则与实现策略
  • WebDAV网盘横向评测:从个人备份到多端同步的实战指南
  • ClawHub 是什么?
  • 多晶陶瓷的电击穿路径(电树枝)的模拟仿真。 采用二维模型模拟电介质在电场作用下介电击穿电树枝分...
  • 终极指南:如何在Windows系统快速安装macOS风格鼠标指针美化包
  • 2023年C语言项目精选与系统开发实践
  • ClickHouse:大数据领域的实时分析新宠
  • 即插即用系列 | TGRS 2026 | CGTA:曲率引导标记注意力!线性复杂度全局建模,几何结构保真与长程关联双突破 | 代码分享
  • 实战应用:基于快马平台构建可部署的智能学科辅导助手
  • 洛雪音乐音源终极指南:免费获取全网高品质音乐资源的完整教程
  • 信创云桌面如何兼容鲲鹏与飞腾国产处理器?
  • WSL + OpenCode 最佳实践:环境一致、模型配置、GUI 远程使用
  • ComfyUI SDXL一体化解决方案:SeargeSDXL架构解析与实践指南
  • AI高手都在用的Skill,你还不会?带你从入门到实战,彻底掌握AI Skill
  • Cherry Studio多窗口工作流:如何用3种窗口模式提升你的AI助手效率
  • 数字斯德哥尔摩:用户爱上折磨人的bug
  • Phi-4-mini-reasoning部署教程(百度热搜):中小企业AI推理降本提效首选
  • 大厂AI团队配置揭秘:揭秘“预训练→后训练→推理部署→多模态扩展“的技术链路拆分逻辑!
  • nfc-mfclassic使用教程
  • AI辅助开发新体验:让Kimi等模型在快马平台为你自动规划并生成建站套餐系统
  • 如何通过Layerdivider实现图像智能分层:从入门到精通
  • 如何成为世界级AI Agent工程师?(长文收藏) Agent 工程师的核心技巧!
  • LAMMPS read_data命令保姆级教程:从MS建模到data文件生成的完整避坑指南
  • 5个维度解析LimeReport:Qt框架下的高效全能报表生成解决方案
  • 2026年 东莞膳食管理服务推荐榜单:专业营养配餐与高效后勤保障的优质服务商精选 - 品牌企业推荐师(官方)
  • 终极指南:Ghost Admin-X设计系统UI组件库的完整使用与扩展方法
  • 实战演练:基于快马AI快速生成具备商品管理功能的.NET电商系统后端
  • 多模态AI视觉问答技术实战应用:从基础实现到行业落地