1. 项目概述
这个基于单片机的智能蓝牙电风扇项目,是我去年夏天为了解决传统电风扇操作不便的问题而开发的。作为一个电子爱好者,我发现市面上大多数电风扇要么是机械旋钮控制,要么是简单的红外遥控,操作体验都不够智能。于是决定自己动手,用常见的单片机加上蓝牙模块,打造一个可以通过手机APP控制的智能风扇系统。
整套系统包含硬件电路设计、单片机程序开发、手机APP开发三个主要部分。硬件部分采用STM32F103C8T6作为主控芯片,搭配HC-05蓝牙模块实现无线通信;软件部分使用Keil MDK开发环境编写控制程序;手机端则开发了一个简单的Android控制APP。整个项目从设计到实现大约花费了两周时间,最终成品不仅实现了基础的风速调节功能,还加入了定时关机、摇头控制等实用功能。
2. 硬件设计与选型
2.1 主控芯片选择
在项目初期,我对比了几款常见的单片机:
-
STM32F103C8T6(最终选择):
- 72MHz主频,性能足够
- 丰富的外设接口(PWM、UART等)
- 价格实惠(约10元/片)
- 开发资料丰富
-
ATmega328P(Arduino常用):
- 16MHz主频
- 开发简单但性能有限
- 价格略高
-
ESP8266:
- 内置WiFi但功耗较高
- 不适合纯蓝牙应用
最终选择STM32主要考虑到其性价比和扩展性,未来如果需要添加更多功能(如温湿度传感器)也有足够的资源。
2.2 蓝牙模块选型
市场上常见的蓝牙模块主要有:
| 型号 | 协议版本 | 传输距离 | 特点 | 价格 |
|---|---|---|---|---|
| HC-05 | 2.0 | 10米 | 经典蓝牙,稳定 | 15元 |
| HC-06 | 2.0 | 10米 | 仅从模式 | 12元 |
| JDY-31 | 4.0 | 20米 | 低功耗,但兼容性稍差 | 18元 |
选择HC-05是因为:
- 支持主从模式切换,灵活性高
- 经典蓝牙协议,手机兼容性好
- 成熟的AT指令集,开发简单
2.3 电机驱动电路
风扇电机采用常见的220V交流电机,通过继电器控制通断。PWM信号经过光耦隔离后控制双向可控硅,实现无级调速。关键元件选型:
- 继电器:HJR-3FF-S-Z(5V驱动,10A负载)
- 光耦:PC817
- 可控硅:BTA16-600B(16A,600V)
- 保险丝:5A玻璃管保险
注意:高压部分电路需要特别注意安全,建议使用隔离电源模块为控制电路供电,避免触电风险。
3. 软件设计与实现
3.1 单片机程序架构
程序采用模块化设计,主要包含以下几个部分:
-
蓝牙通信模块:
- 使用USART接口与HC-05通信
- 自定义简单协议:
[命令头][数据长度][命令类型][参数][校验和] - 示例命令:
0xAA 0x03 0x01 0x03 0xAF(设置风速为3档)
-
PWM生成模块:
- 使用TIM3通道1生成PWM波
- 频率1kHz,占空比0-100%可调
- 对应关系:
- 档位1:30%占空比
- 档位2:60%占空比
- 档位3:100%占空比
-
定时器模块:
- 使用TIM2实现1ms时基
- 用于按键消抖、定时关机倒计时等
-
状态机设计:
c复制typedef enum { FAN_OFF, FAN_ON, FAN_TIMER_MODE } FanState; FanState currentState = FAN_OFF;
3.2 手机APP开发
使用Android Studio开发控制APP,主要功能界面包括:
-
主控制界面:
- 电源开关按钮
- 风速滑块(1-3档)
- 摇头开关
- 定时设置(0.5/1/2/4小时)
-
蓝牙连接流程:
java复制private final BluetoothAdapter.LeScanCallback leScanCallback = (device, rssi, scanRecord) -> { if (device.getName() != null && device.getName().equals("SmartFan_BT")) { bluetoothAdapter.stopLeScan(leScanCallback); connectToDevice(device); } }; -
数据发送逻辑:
java复制private void sendCommand(byte cmd, byte param) { byte[] data = new byte[5]; data[0] = (byte) 0xAA; // 帧头 data[1] = 0x03; // 数据长度 data[2] = cmd; // 命令类型 data[3] = param; // 参数 data[4] = (byte) (data[0]+data[1]+data[2]+data[3]); // 校验和 if (mBluetoothSocket != null) { try { mBluetoothSocket.getOutputStream().write(data); } catch (IOException e) { e.printStackTrace(); } } }
4. 系统集成与调试
4.1 硬件组装要点
-
PCB设计注意事项:
- 高压与低压部分分区布局
- 继电器线圈添加续流二极管
- PWM信号走线远离高频部分
- 预留足够的电源去耦电容
-
结构安装技巧:
- 使用3D打印的外壳固定控制板
- 蓝牙天线位置避免金属遮挡
- 电机与控制器之间保留散热空间
4.2 常见问题排查
在实际调试过程中遇到的一些典型问题及解决方案:
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 蓝牙连接不稳定 | 天线位置不当/电源干扰 | 调整天线方向,添加磁珠滤波 |
| 电机启动时有异响 | PWM起始占空比过高 | 软启动设计,从10%逐步增加到目标值 |
| 手机搜索不到设备 | 蓝牙模块未进入配对模式 | 检查AT指令配置,确认可见性设置 |
| 定时功能不准确 | 系统时钟配置错误 | 校准内部RC振荡器或改用外部晶振 |
| APP偶尔崩溃 | 未处理蓝牙断开异常 | 添加try-catch块和重连机制 |
4.3 性能优化技巧
-
低功耗设计:
- 空闲时进入STOP模式,电流<1mA
- 通过蓝牙唤醒信号触发中断
- 关闭未使用的外设时钟
-
抗干扰措施:
- 电机电源线与信号线分开走线
- 添加TVS二极管防护静电
- 软件上采用CRC校验通信数据
-
用户体验优化:
- 添加蜂鸣器反馈操作确认
- LED指示灯显示工作状态
- APP端保存最后一次连接设备
5. 项目扩展与改进
5.1 功能扩展方向
-
环境感知:
- 添加温湿度传感器(DHT22)
- 实现自动调速功能
- 根据室内温度动态调整风速
-
语音控制:
- 集成LD3320语音识别芯片
- 支持"打开风扇"、"调大风速"等指令
- 离线识别,无需联网
-
能源监测:
- 采用HLW8032电量计量芯片
- 统计用电量
- APP端显示节能建议
5.2 进阶改进方案
-
无线充电功能:
- 使用Qi标准接收线圈
- 5V/1A充电功率
- 锂电池供电,续航约8小时
-
多设备组网:
- 升级为蓝牙Mesh网络
- 支持多个风扇协同工作
- 中央控制器统一管理
-
智能家居集成:
- 通过MQTT接入HomeAssistant
- 支持语音助手控制(如小爱同学)
- 场景联动(如"我回家了"自动开风扇)
6. 完整资料说明
项目开发过程中积累的完整资料包括:
-
硬件部分:
- 原理图(PDF+SchDoc)
- PCB布局文件(PcbDoc)
- BOM物料清单(Excel)
- 3D外壳设计文件(STP+STL)
-
软件部分:
- 单片机完整工程(Keil MDK)
- Android APP源码(Android Studio)
- 通信协议文档(Word)
- 测试用例(Excel)
-
开发工具:
- STM32CubeMX配置文件
- 蓝牙AT指令集
- 串口调试助手
- 逻辑分析仪捕获文件
这些资料已经整理成压缩包,包含详细的注释和说明文档,即使是初学者也能按照步骤复现整个项目。在实际开发中,建议先阅读《硬件组装指南》和《软件烧录说明》两个文档,可以避免很多常见问题。