去年夏天帮朋友改造老式电风扇的经历让我深刻体会到传统风扇的局限性——每次温度变化都需要手动调节档位,晚上睡觉时要么被热醒要么被冷醒。这促使我萌生了开发智能风扇的想法,核心目标是实现"无感调节":风扇能自动感知环境变化并作出响应,就像有个贴心管家在默默调节室内环境。
选择STM32F103C8T6作为主控是经过多方考量的结果。这款Cortex-M3内核的MCU具有72MHz主频和丰富的外设接口,价格却只要十几块钱。相比Arduino,STM32的定时器资源更丰富(高级定时器TIM1、通用定时器TIM2-TIM4),特别适合需要同时控制多个电机的场景。实际开发中,我们确实用到了TIM1产生PWM波控制风扇转速,TIM2/TIM3分别驱动两个步进电机实现摇头功能。
温度检测选用DS18B20数字传感器而非模拟的NTC热敏电阻,主要考虑三点:一是单总线协议节省IO口(仅需一个4.7K上拉电阻);二是±0.5℃的精度足够家用场景;三是防水封装版本可直接接触空气。实际布线时要注意总线长度不超过20米,我在PCB上预留了10cm的走线空间。
人体检测模块选用D203S而非HC-SR501,因为前者具有更灵敏的菲涅尔透镜和更低的待机功耗(仅60μA)。电路设计时在输出端加了RC滤波(10K电阻+104电容),有效消除了误触发。测试发现安装高度在1.2-1.5米时检测效果最佳,这符合大多数人坐姿时的胸部高度。
风扇电机驱动采用L298N双H桥模块,通过PWM占空比调节转速。这里有个关键细节:普通风扇电机启动时需要更高电压,我在程序里设置了启动Boost模式——前3秒给予80%占空比,之后降至设定值。实测这招解决了低速档启动困难的问题。
步进电机选用28BYJ-48配ULN2003驱动板,虽然扭矩一般但胜在价格便宜(整套不到10元)。控制摇头时采用非阻塞式编程,通过定时器中断每20ms发送一个脉冲,这样主程序不会被电机控制拖累。有趣的是测试发现左右摇头比上下摇头更受欢迎,最终将水平摇头角度设为90°,垂直设为30°。
核心控制逻辑用状态机实现,定义了三档温度区间:
温度采样采用滑动窗口滤波,保存最近10次读数取中值。为防止模式频繁切换,设置了2℃的回差区间。例如从28℃降到26℃才会切换到自然风模式,避免在临界点反复跳变。
红外遥控解码使用定时器输入捕获功能,精准测量脉冲宽度。我整理了常用按键的编码表:
| 按键 | 编码值 | 功能 |
|---|---|---|
| 电源 | 0xFFA25D | 开关机 |
| 模式 | 0xFF629D | 切换冷/热/自然风 |
| ▲ | 0xFF906F | 温度阈值+1 |
| ▼ | 0xFFE01F | 温度阈值-1 |
WiFi模块采用AT指令固件,通过串口3与STM32通信。开发时踩过的坑:ESP8266的波特率默认是115200,但实际测试发现9600更稳定。手机端用MIT App Inventor做了简易控制界面,可实时显示温度曲线。
初期测试发现OLED显示会随电机启停出现闪屏。排查发现是L298N工作时导致电源波动,最终采取三项措施:
当同时使用红外遥控和人体感应时,偶尔会出现误触发。通过逻辑分析仪抓包发现D203S的输出信号与红外载波频率相近。解决方案是在软件中加入双重验证:只有持续检测到人体移动超过5秒,才会真正启动风扇。
经过一周的连续测试,系统表现稳定:
功耗测试数据值得关注:
| 工作模式 | 整机电流 |
|---|---|
| 待机 | 15mA |
| 自然风 | 200mA |
| 制冷模式 | 500mA |
| 加热模式 | 800mA |
建议后续可增加的功能:
这个项目最让我惊喜的是步进电机的运动控制效果——通过微步驱动技术,实现了近乎无声的平滑摇头。有次演示时,在场的朋友都没发现风扇在自动调整角度,直到看到窗帘被吹动才恍然大悟,这种"无感智能"正是我追求的用户体验。