1. STM32蓝牙智能控制风扇概述
作为一名嵌入式开发工程师,我最近完成了一个基于STM32的蓝牙智能风扇控制项目。这个项目将传统风扇升级为可通过手机远程控制的智能设备,不仅支持手动调速,还能根据环境温湿度自动调节风速。相比市面上动辄几百元的智能风扇,这个方案成本不到50元,非常适合DIY爱好者和电子专业学生练手。
核心功能包括:
- 通过蓝牙连接手机APP实现0-100%无级调速
- 根据DHT11传感器数据自动启停(比如室温超过30℃自动开启)
- 支持定时关闭和低功耗模式
- 预留了OLED显示接口方便查看运行状态
2. 硬件设计与选型解析
2.1 主控芯片选择
我选用STM32F103C8T6作为主控,这款芯片在性能和成本之间取得了完美平衡:
- 72MHz主频的Cortex-M3内核
- 64KB Flash + 20KB RAM
- 3个USART接口(蓝牙、调试、备用)
- 4个16位定时器(用于PWM生成)
- 价格仅10元左右
注意:初学者常犯的错误是直接使用开发板,实际产品中建议自制最小系统板,仅保留必要的外设电路。
2.2 蓝牙模块对比
测试了市面上常见的三种模块:
| 型号 | 传输距离 | 功耗 | 价格 | 推荐场景 |
|---|---|---|---|---|
| HC-05 | 10米 | 8mA | 15元 | 需要主从切换 |
| HC-06 | 8米 | 6mA | 12元 | 仅作从机 |
| JDY-31 | 20米 | 5mA | 18元 | 长距离低功耗 |
最终选择HC-06,因为:
- 不需要主从切换功能
- 与手机配对更稳定
- 实测在办公室环境穿透两堵墙仍能正常通信
2.3 电机驱动方案
风扇电机驱动有三种可选方案:
c复制// 方案1:L298N驱动板
// 优点:集成度高,带光耦隔离
// 缺点:效率低(约70%),发热明显
// 方案2:MOSFET+驱动IC
// 优点:效率>90%,可大电流
// 缺点:需要额外设计电路
// 方案3:成品电机驱动模块
// 优点:即插即用
// 缺点:灵活性差
经过实测,对于12V/0.5A的小风扇,采用IRF540N MOSFET配合TC4427驱动芯片的方案最优:
- 成本仅5元
- 效率达到92%
- PWM响应速度更快
3. 软件架构与核心代码
3.1 蓝牙通信协议设计
定义了一套简单的AT指令格式:
code复制# 设置风速
SPEED=50\n // 50%转速
# 查询状态
GET_STATUS\n
# 回复格式
TEMP=26.5,HUM=60,SPEED=50\n
在STM32端通过串口中断接收处理:
c复制void USART1_IRQHandler(void) {
if(USART_GetITStatus(USART1, USART_IT_RXNE)) {
char ch = USART_ReceiveData(USART1);
if(ch == '\n') {
parseCommand(buffer);
memset(buffer, 0, sizeof(buffer));
index = 0;
} else {
buffer[index++] = ch;
}
}
}
3.2 PWM调速实现
关键配置步骤:
- 初始化TIM3通道1为PWM输出
- 设置ARR=100(方便直接对应百分比)
- 动态修改CCR值调节占空比
c复制// PWM初始化
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseStructure.TIM_Period = 100-1; // 100级调速
TIM_TimeBaseStructure.TIM_Prescaler = 72-1; // 1MHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
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_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_Cmd(TIM3, ENABLE);
3.3 自动温控逻辑
在main循环中实现状态机:
c复制while(1) {
if(auto_mode) {
DHT11_ReadData(&temp, &hum);
if(temp > threshold_high && speed == 0) {
set_speed(50); // 达到高温阈值启动
}
else if(temp < threshold_low && speed > 0) {
set_speed(0); // 低于低温阈值停止
}
}
Delay_ms(1000);
}
4. 常见问题与解决方案
4.1 蓝牙连接不稳定
现象:手机偶尔断开连接
解决方法:
- 在模块VCC引脚并联100μF电容
- 将天线部分远离电机线路
- 修改AT指令增加重试机制:
c复制AT+POLAR=1,1 // 设置复位后自动连接
AT+ROLE=0 // 强制设为从机模式
4.2 PWM导致电机异响
现象:低速时电机发出滋滋声
优化方案:
- 将PWM频率从1kHz提高到18kHz(超出人耳范围)
- 在电机两端并联续流二极管
- 修改PWM生成代码:
c复制TIM_TimeBaseStructure.TIM_Prescaler = 4-1; // 18kHz
4.3 低功耗模式实现
当风扇待机时,通过以下方式降低功耗:
- 关闭所有外设时钟
- 配置蓝牙模块中断唤醒
- 进入STOP模式
c复制void enter_low_power(void) {
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART1, DISABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, DISABLE);
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
}
5. 进阶改进方向
5.1 增加Wi-Fi远程控制
通过ESP-01S模块实现:
- 使用AT指令连接路由器
- 搭建简易TCP服务器
- 与STM32通过串口通信
c复制// ESP8266初始化示例
AT+CWMODE=1 // Station模式
AT+CWJAP="SSID","password" // 连接WiFi
AT+CIPSTART="TCP","192.168.1.100",8080 // 连接服务器
5.2 加入语音控制
采用LD3320语音识别模块:
- 训练5条关键指令:"打开风扇"、"关闭风扇"、"风速加大"等
- 通过IO口触发STM32中断
- 需注意麦克风朝向和背景噪声过滤
5.3 手机APP开发建议
使用MIT App Inventor快速开发:
- 设计包含以下元素的界面:
- 速度调节滑块
- 模式切换开关
- 温湿度显示区域
- 蓝牙通信关键块:
![App Inventor蓝牙配置示例]
实际项目中,我发现在电机PWM频率调整到18kHz后,风扇运行噪音明显降低,这个经验可能对同类项目很有参考价值。另外,建议在PCB布局时,将蓝牙模块天线部分伸出板外,这能让通信距离增加30%左右。
