1. 项目概述:当传统风扇遇上智能控制
去年夏天,我在工作室里鼓捣一个老式桌面风扇时突然想到:为什么不能给它装上"大脑"?于是就有了这个基于STM32的蓝牙智能控制风扇项目。这个改造的核心思路是保留风扇的机械结构,通过STM32主控板和蓝牙模块实现手机远程控制、多档调速和定时功能,让普通风扇秒变智能设备。
这个方案特别适合两类人:一是电子爱好者想要入门嵌入式开发,二是实用主义者希望低成本实现家电智能化。相比市面上的智能风扇,自制版本成本不到百元,却能实现80%的商用功能。最关键的是,整个开发过程涉及STM32外设编程、蓝牙通信协议、PWM调速等嵌入式开发核心技能,是个非常典型的物联网入门项目。
2. 硬件设计与核心元件选型
2.1 STM32主控板选择
我最终选择了STM32F103C8T6最小系统板,江湖人称"蓝板"。这个选择基于三点考虑:
- 性价比:核心板价格约15-20元,自带USB转串口芯片
- 资源足够:72MHz主频、64KB Flash、20KB RAM,轻松应对控制需求
- 生态完善:标准库和HAL库资料丰富,调试工具链成熟
注意:购买时要认准正版ST芯片,市面上有些使用GD32等兼容芯片的板子,虽然便宜但可能遇到库兼容问题。
2.2 蓝牙模块选型对比
市面上常见的蓝牙模块主要有HC-05(经典蓝牙)和HC-08(BLE)两种。经过实测对比:
| 参数 | HC-05 | HC-08 |
|---|---|---|
| 协议版本 | Bluetooth 2.1 | BLE 4.0 |
| 通信距离 | 10米(实测8米) | 30米(实测15米) |
| 功耗 | 较高 | 极低 |
| 配对方式 | 密码配对 | 直接连接 |
| 价格 | 约25元 | 约35元 |
考虑到风扇不需要持续数据传输,最终选择了更省电的HC-08 BLE模块。一个实用技巧:购买时选择带底板和天线的版本,信号稳定性会更好。
2.3 电机驱动方案
普通风扇电机多为交流电机,但为简化设计,本项目使用直流电机模拟。驱动方案对比:
- 三极管方案:成本最低(约2元),但只能单向控制,无调速功能
- L298N模块:经典双H桥驱动,支持正反转和PWM调速(约15元)
- MOSFET方案:效率最高,但需要额外设计驱动电路
选用L298N模块主要考虑其集成度高,自带散热片和续流二极管,直接支持5V-35V宽电压输入。接线时要注意:
- 电机电源与逻辑电源需分开供电
- 每个通道最大电流2A,持续电流1A
- 使能端必须接PWM引脚才能调速
3. 软件架构与关键代码实现
3.1 开发环境搭建
使用Keil MDK作为开发环境,配置步骤:
- 安装Keil uVision5(建议版本5.28以上)
- 安装STM32F1xx Device Family Pack
- 配置ST-Link调试器驱动
- 安装串口调试助手(推荐SSCOM或XCOM)
关键配置项:
- 系统时钟设置为72MHz
- 开启USART1用于蓝牙通信
- 配置TIM3的CH1/CH2输出PWM
- GPIO初始化风扇控制引脚
3.2 蓝牙通信协议设计
定义简单的ASCII协议格式:
code复制[命令类型][参数]\n
例如:
- "S3\n":设置风速为3档
- "T60\n":设置定时60分钟
- "O1\n":开启风扇
在STM32端通过串口中断接收数据:
c复制void USART1_IRQHandler(void) {
if(USART_GetITStatus(USART1, USART_IT_RXNE)) {
char ch = USART_ReceiveData(USART1);
if(ch == '\n') {
parse_command(buffer);
buffer_index = 0;
} else {
buffer[buffer_index++] = ch;
}
}
}
3.3 PWM调速实现
使用TIM3产生PWM信号控制电机转速:
c复制void PWM_Init(void) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
// 时钟配置
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
// 时基配置:72MHz/720=100kHz
TIM_TimeBaseStructure.TIM_Period = 999; // 100kHz/1000=100Hz
TIM_TimeBaseStructure.TIM_Prescaler = 719;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
// PWM模式配置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0; // 初始占空比0%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM3, &TIM_OCInitStructure);
TIM_Cmd(TIM3, ENABLE);
TIM_CtrlPWMOutputs(TIM3, ENABLE);
}
设置风速档位函数:
c复制void set_fan_speed(uint8_t level) {
if(level > 5) level = 5;
uint16_t pulse = 200 * level; // 每档增加20%占空比
TIM_SetCompare2(TIM3, pulse);
}
4. 手机端APP开发方案
4.1 安卓端快速实现
使用MIT App Inventor可以快速开发控制APP,主要组件:
- BluetoothLE组件:负责与HC-08通信
- 按钮组件:开关、档位控制
- 滑动条:无极调速
- 时间选择器:定时功能
关键逻辑块:
- 扫描并连接设备时,显示所有可用的HC-08模块
- 发送命令时自动添加"\n"结束符
- 接收数据时显示风扇状态
4.2 iOS端开发建议
对于iOS设备,可以考虑:
- 使用SwiftUI开发原生APP
- 通过CoreBluetooth框架实现BLE通信
- 关键代码片段:
swift复制func sendFanCommand(_ cmd: String) {
guard let peripheral = connectedPeripheral,
let service = targetService,
let characteristic = targetCharacteristic else { return }
let data = (cmd + "\n").data(using: .utf8)!
peripheral.writeValue(data, for: characteristic, type: .withResponse)
}
5. 系统集成与调试技巧
5.1 硬件组装注意事项
-
电源布局:
- 电机电源与MCU电源最好分开
- 在电机电源端并联1000uF电容滤除干扰
- L298N的逻辑供电必须接5V
-
信号线处理:
- PWM信号线尽量短(<10cm)
- 蓝牙模块天线不要被金属遮挡
- 所有信号线建议使用双绞线
-
散热方案:
- L298N必须加装散热片
- 长时间工作建议增加小风扇辅助散热
- 可在散热片涂导热硅脂提升效果
5.2 常见问题排查指南
问题1:蓝牙连接不稳定
- 检查天线是否完好
- 确保模块供电电压稳定(3.3V±0.2V)
- 避开2.4G干扰源(WiFi路由器等)
问题2:电机抖动不转
- 测量PWM信号是否正常输出
- 检查L298N使能引脚是否接高
- 测试电机直接供电能否转动
问题3:手机搜不到模块
- 确认HC-08处于可被发现模式(LED快闪)
- 检查模块是否进入AT模式(接KEY引脚到高电平)
- 尝试用AT指令恢复出厂设置
6. 项目优化与扩展方向
6.1 功耗优化方案
- 选用低功耗STM32L系列MCU
- 增加红外人体感应模块,无人时自动休眠
- 实现BLE连接超时自动关机
- 优化PWM频率(建议20-25kHz避免可闻噪声)
6.2 功能扩展思路
- 增加温湿度传感器(DHT22),实现自动调速
- 接入智能音箱平台(需额外WiFi模块)
- 添加OLED显示屏显示运行状态
- 实现多风扇组网同步控制
6.3 产品化改进建议
- 设计3D打印外壳整合所有组件
- 改用交流电机可控硅调速方案
- 通过FCC/CE认证(需注意射频规范)
- 开发微信小程序控制端
这个项目最让我惊喜的是,用不到100元的成本就实现了市面300元以上智能风扇的核心功能。在实际调试过程中,最大的收获是理解了PWM调速时频率选择对电机噪音的影响——当PWM频率超过18kHz后,人耳就听不到高频啸叫声了。
