1. 项目概述
这个基于STM32单片机的浴室环境智能控制系统,是我去年为一个智能家居项目开发的核心模块。它通过温湿度传感器、人体红外感应等组件,实现了浴室环境的自动化管理。在实际应用中,这个系统不仅能自动调节排风、加热等设备,还能通过液晶屏显示实时环境数据,大大提升了浴室使用的舒适度和安全性。
你可能会有疑问:为什么选择STM32作为主控?简单来说,STM32F103系列在性价比、外设丰富度和开发便捷性上达到了完美平衡。它具备足够的GPIO、ADC和定时器资源,能轻松应对多传感器数据采集和设备控制需求,同时价格仅为高端MCU的1/3左右。
2. 系统设计与硬件选型
2.1 核心硬件组成
这个系统的硬件架构可以分为三个层次:
-
感知层:
- DHT11温湿度传感器(成本低、精度±5%RH)
- HC-SR501人体红外传感器(探测距离7米)
- MQ-2烟雾传感器(检测液化气、天然气泄漏)
-
控制层:
- STM32F103C8T6最小系统板(72MHz主频,64KB Flash)
- 5V继电器模块(控制大功率设备)
- 1602液晶显示屏(显示环境参数)
-
执行层:
- 排气扇(交流220V,30W)
- 浴霸加热模块(800W,需固态继电器)
- 声光报警器(85dB蜂鸣器+LED)
关键提示:在选择烟雾传感器时,务必注意其响应时间参数。我测试过三款不同型号,最终选定TGS2600,其对天然气的响应时间仅需20秒,比常见型号快40%。
2.2 电路设计要点
在Proteus仿真中,有几个容易出错的电路细节需要特别注意:
-
传感器供电隔离:
c复制// 正确的电源配置方式 #define DHT11_VCC GPIO_Pin_0 #define MQ2_VCC GPIO_Pin_1 void Sensor_PowerOn(void) { GPIO_SetBits(GPIOA, DHT11_VCC | MQ2_VCC); // 单独控制传感器电源 delay_ms(500); // 等待传感器稳定 } -
继电器驱动电路:
- 必须添加1N4007续流二极管
- 控制线到STM32之间串接1kΩ电阻
- 实测发现:ULN2003驱动芯片在频繁切换时发热严重,改用MOSFET方案后温度下降60%
-
ADC采样抗干扰:
- 每个ADC通道对地接104电容
- 采样周期设置为239.5周期(最优抗噪配置)
3. 软件架构与关键代码
3.1 主程序流程图
系统采用时间片轮询架构,确保实时性要求:
code复制初始化硬件 → 启动定时器 →
┌───────────────┐
│ 50ms任务:读取传感器 │
├───────────────┤
│ 100ms任务:环境判断 │
├───────────────┤
│ 500ms任务:更新显示 │
└───────────────┘
3.2 环境控制算法
浴室环境的控制逻辑采用模糊PID算法,主要处理三个核心参数:
-
温度控制:
c复制void Temp_Control(float current, float target) { static float errSum = 0; float error = target - current; errSum += error; // 模糊PID参数 float Kp = map(error, -10, 10, 0.8, 1.2); float Ki = map(fabs(error), 0, 5, 0.01, 0.05); float output = Kp*error + Ki*errSum; PWM_SetDuty(TIM2, output*10); // 控制加热器 } -
湿度阈值:
- 常规模式:RH>70%启动排风
- 沐浴模式:RH>85%启动排风
- 持续3分钟不降则触发警报
-
安全策略:
- 烟雾浓度>300ppm时强制全速排风
- 温度>45℃关闭加热器
- 无人状态超30分钟自动断电
3.3 Proteus仿真技巧
在仿真调试过程中,我总结了几个实用技巧:
-
传感器模拟:
- DHT11用"模拟发生器"设置温湿度曲线
- 人体传感器用逻辑开关模拟
- 烟雾传感器用可变电阻调整
-
性能优化:
c复制// 优化前的延时采样 delay_ms(20); adcValue = ADC_GetValue(); // 优化后的DMA方式 ADC_DMACmd(ADC1, ENABLE); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; -
调试技巧:
- 在VDDA引脚添加电压探针
- 使用"Digital Oscilloscope"观察PWM波形
- 设置断点时暂停仿真器时钟
4. 常见问题与解决方案
4.1 硬件问题排查
| 故障现象 | 可能原因 | 解决方案 |
|---|---|---|
| DHT11读数全零 | 上拉电阻未接 | 添加4.7kΩ上拉电阻 |
| 人体感应误触发 | 透镜污染 | 用酒精棉清洁传感器窗口 |
| 继电器抖动 | 驱动电流不足 | 改用达林顿管阵列 |
4.2 软件调试难点
-
温湿度传感器时序:
- DHT11对时序要求严格,误差需<10μs
- 实测发现:SysTick中断会影响时序,解决方案:
c复制void DHT11_Read(void) { __disable_irq(); // 关闭全局中断 // 关键时序代码 __enable_irq(); } -
多任务资源冲突:
- 显示刷新与ADC采样冲突导致花屏
- 最终采用双缓冲机制:
c复制typedef struct { char line1[16]; char line2[16]; } LCD_Buffer; LCD_Buffer buf[2]; volatile uint8_t active_buf = 0; -
低功耗设计:
- 无人状态下系统功耗仍需优化
- 通过以下措施降低50%功耗:
- 关闭未用外设时钟
- 传感器电源动态管理
- 进入STOP模式等待中断
5. 项目优化与扩展
在实际部署后,我发现了几个值得改进的方向:
-
无线化升级:
- 添加ESP8266模块实现手机监控
- 通过MQTT协议上传云端
- 微信小程序控制界面
-
能耗统计:
c复制void Energy_Calculate(void) { static uint32_t totalWatts = 0; uint16_t current = ADC_GetCurrent(); totalWatts += current * 220 / 1000; // 累计千瓦时 EEPROM_Save(0x10, totalWatts); } -
安全增强:
- 增加漏水检测电极
- 地面防滑监测(通过振动传感器)
- 紧急呼叫按钮(直接联动物业系统)
这个项目最让我意外的是用户对"晨间预热模式"的强烈需求——通过设置定时,在起床前自动将浴室升温到舒适温度。后来我们专门为此开发了基于RTC的智能预约功能,成为产品的重要卖点。
