1. 项目概述:当传统风扇遇上STM32
去年夏天调试这个智能风扇项目时,我正对着老式机械风扇的调速旋钮发愁——每次都要手动调节实在太麻烦。于是用STM32F103C8T6开发板做了这个支持温控、手势和APP控制的多功能风扇系统。核心功能包括:
- 实时监测环境温湿度(DHT11传感器)
- 三档风速自动调节(PWM驱动MOS管)
- 手势识别切换模式(红外对管阵列)
- 手机蓝牙控制(HC-05模块)
- 0.96寸OLED显示状态信息
相比市面成品,这套方案成本不到50元,却实现了200元级产品的核心功能。特别适合想要入门嵌入式开发的工程师,通过这个项目可以掌握传感器数据采集、PWM控制、外设驱动等关键技能。
2. 硬件设计要点解析
2.1 核心器件选型对比
在多次迭代中测试过不同配置,最终确定的BOM清单如下:
| 器件 | 型号 | 替代方案 | 选择理由 |
|---|---|---|---|
| MCU | STM32F103C8T6 | STM32F401 | 性价比高,资源足够 |
| 温湿度传感器 | DHT11 | SHT30 | 成本考量,±2℃精度满足需求 |
| 显示模块 | SSD1306 OLED | LCD1602 | 更省电,显示内容丰富 |
| 电机驱动 | IRF540N MOS管 | L298N模块 | 导通电阻小,发热低 |
| 蓝牙模块 | HC-05 | ESP8266 | 协议简单,即插即用 |
特别注意:DHT11上电后需要至少1秒稳定时间,否则会读取失败。我在初期调试时因此浪费了两小时排查硬件连接。
2.2 关键电路设计
电机驱动部分采用N沟道MOS管+续流二极管的经典方案。PWM频率设置为16kHz(定时器TIM3_CH1),既避开人耳敏感频段,又不会导致MOS管过度发热。实测驱动12V直流电机时,MOS管温升控制在35℃以内。
c复制// PWM初始化关键代码(HAL库)
TIM_OC_InitTypeDef sConfigOC = {0};
htim3.Instance = TIM3;
htim3.Init.Prescaler = 71; // 72MHz/(71+1)=1MHz
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 62; // 1MHz/63≈16kHz
HAL_TIM_PWM_Init(&htim3);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 31; // 默认50%占空比
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
3. 软件架构与核心算法
3.1 多任务调度设计
采用时间片轮询方式管理各功能模块,避免RTOS带来的学习成本。主循环结构如下:
c复制while(1) {
static uint32_t tick = 0;
if(HAL_GetTick() - tick > 100) { // 100ms周期
tick = HAL_GetTick();
Task_SensorUpdate(); // 传感器数据采集
Task_ControlLogic(); // 控制算法执行
Task_DisplayRefresh();// OLED刷新
}
Task_BluetoothParse(); // 蓝牙数据解析(实时性要求高)
}
3.2 温控算法实现
采用滞后比较法防止风扇频繁启停。当温度超过28℃启动风扇,低于26℃停止。风速分三档:
- 26-30℃:30%占空比
- 30-35℃:60%占空比
-
35℃:100%全速
c复制void Task_ControlLogic(void) {
static uint8_t last_speed = 0;
uint8_t new_speed = 0;
if(temp > 35) new_speed = 100;
else if(temp > 30) new_speed = 60;
else if(temp > 26) new_speed = 30;
// 滞环控制
if(abs(new_speed - last_speed) > 15 || temp < 26) {
PWM_SetDuty(new_speed);
last_speed = new_speed;
}
}
4. 调试经验与性能优化
4.1 常见问题排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 电机不转 | MOS管G极未导通 | 检查PWM输出是否使能 |
| 蓝牙连接不稳定 | 模块供电不足 | 增加100μF电容滤波 |
| 温度读数异常 | DHT11时序错误 | 严格遵循1ms启动时序 |
| OLED花屏 | I2C地址冲突 | 确认是0x3C还是0x3D |
4.2 低功耗优化技巧
- 在无操作时关闭OLED背光(可省电15mA)
- 将蓝牙模块设为SNIFF模式(电流从8mA降至2mA)
- 使用HAL_Delay()替代软件延时,允许CPU进入低功耗状态
实测优化后待机电流从45mA降至18mA,对于电池供电场景非常关键。
5. 功能扩展方向
当前系统预留了这些扩展接口:
- 预留的USART2可接ESP8266实现WiFi控制
- ADC通道可接光敏电阻实现光线感应
- 多余的IO口可接RFID模块做身份识别
- 通过I2S接口可添加语音提示功能
最近我正在尝试加入语音识别模块,通过"风速调大"这样的语音指令控制风扇。遇到的最大挑战是环境噪声过滤,后续进展会继续分享。
