1. 项目概述
这个智能风扇项目是我去年夏天完成的个人作品,起因是宿舍空调经常故障,需要一款能根据室温自动调节风速的风扇。经过多次迭代,最终选择了STM32F103C8T6作为主控,搭配DS18B20温度传感器和LCD1602显示屏的方案。相比市面上常见的温控风扇,这个设计最大的特点是完全开源且支持自定义温度阈值,你可以根据自己的舒适区间设置风扇的启停温度和档位切换点。
提示:整个项目的BOM成本不到50元,非常适合电子爱好者练手。我在实际测试中发现,DS18B20的±0.5℃精度完全能满足日常使用需求,比传统热敏电阻方案稳定得多。
2. 硬件设计详解
2.1 核心器件选型
2.1.1 主控芯片:STM32F103C8T6
选择这款Cortex-M3内核的MCU主要基于三点考虑:
- 72MHz主频足够处理温度数据和PWM调速
- 内置的12位ADC可以满足后续功能扩展
- 最小系统板价格仅10元左右,性价比极高
实际使用中要注意:
- 调试时需要连接SWD接口(SWCLK和SWDIO)
- 如果使用内部晶振,需在代码中配置时钟树
2.1.2 温度传感器:DS18B20
最初尝试过热电偶方案,但发现几个致命问题:
- 需要额外的信号放大电路
- 冷端补偿复杂
- 响应速度慢(约2-3秒)
DS18B20的优势非常明显:
- 单总线通信节省IO口
- 3.0-5.5V宽电压供电
- 典型精度±0.5℃
- 9-12位可编程分辨率
硬件连接时要注意:
c复制// 典型连接方式
VDD ---- 3.3V
DQ ---- PA1 (需接4.7K上拉电阻)
GND ---- GND
2.2 电路设计要点
2.2.1 电源模块
采用AMS1117-3.3稳压芯片,将USB输入的5V转为3.3V:
- 输入电容:10μF钽电容
- 输出电容:10μF+0.1μF组合
- 实测纹波<50mV
2.2.2 电机驱动
使用L298N模块驱动直流电机:
- 使能端接PWM输出(TIM3_CH1)
- 输入IN1/IN2控制正反转
- 需外接续流二极管防止反电动势
注意:PWM频率建议设置在1-5kHz之间,太低会有噪音,太高会导致MOS管损耗增加。
3. 软件实现
3.1 开发环境搭建
- 安装Keil MDK-ARM
- 添加STM32F1xx_DFP器件支持包
- 配置ST-Link调试器
- 安装串口驱动(CH340/CP2102)
3.2 核心代码解析
3.2.1 DS18B20驱动
单总线时序非常关键,这里给出经过验证的初始化函数:
c复制uint8_t DS18B20_Reset(void) {
uint8_t presence = 0;
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 配置PA1为推挽输出
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 拉低480us
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);
delay_us(480);
// 释放总线
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);
delay_us(60);
// 切换为输入模式
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 检测应答脉冲
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == 0) {
presence = 1;
}
delay_us(420);
return presence;
}
3.2.2 温度控制算法
采用三段式调速策略:
c复制void Fan_Control(float temp) {
if(temp < TEMP_LOW) {
// 关闭风扇
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 0);
}
else if(temp < TEMP_MID) {
// 低速档(30%占空比)
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 30);
}
else if(temp < TEMP_HIGH) {
// 中速档(60%占空比)
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 60);
}
else {
// 高速档(100%占空比)
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 100);
}
}
4. 制作与调试经验
4.1 常见问题排查
-
DS18B20无响应:
- 检查上拉电阻(4.7K必须接)
- 测量DQ线电压(正常应为3.3V)
- 确认时序延时准确(特别是480us复位脉冲)
-
LCD1602显示乱码:
- 调整对比度电位器
- 检查4位/8位模式设置
- 确保初始化延时足够(>40ms)
-
电机不转:
- 测量L298N供电电压(需>7V驱动12V电机)
- 检查使能信号(ENABLE引脚需接高)
- 确认PWM信号正常(用示波器观察波形)
4.2 优化建议
- 增加红外遥控功能(使用HS0038接收头)
- 添加手机蓝牙控制(HC-05模块)
- 改用PID算法实现无级调速
- 增加温湿度传感器(DHT22)
5. 项目扩展思路
这个基础框架可以衍生出很多实用变种:
- 智能桌面风扇:缩小体积,改用USB供电
- 工业设备散热器:增加多个温度监测点
- 农业大棚通风系统:结合湿度传感器控制
- 电脑机箱风扇:通过串口读取CPU温度
我在实际使用中发现,将温度采样间隔设置为2秒既能保证实时性,又能降低系统功耗。如果使用电池供电,还可以开启STM32的低功耗模式,进一步延长续航时间。