1. 项目概述与核心需求
去年冬天,我在家里使用传统加湿器时遇到了一个典型问题:要么湿度不够导致皮肤干燥,要么加湿过度让窗户结满水珠。这种手动调节的困扰促使我开发了这套基于STM32的智能加湿控制系统。这个系统最核心的价值在于,它通过实时环境监测和自动控制算法,将室内湿度始终维持在40%-60%的人体舒适区间。
系统硬件架构围绕STM32F103C8T6这颗性价比极高的Cortex-M3内核MCU搭建。选择这款芯片主要基于三点考量:首先,72MHz主频足够处理传感器数据和逻辑判断;其次,内置的64KB Flash和20KB SRAM满足程序存储和运行需求;最重要的是,它丰富的外设接口(3个USART、2个SPI、2个I2C)完美适配本项目所有模块的连接需求。
2. 硬件系统设计与关键器件选型
2.1 主控电路设计要点
STM32最小系统电路设计时,我特别关注了三个细节:
- 复位电路采用10kΩ上拉电阻配合0.1μF电容,形成可靠的RC复位网络
- 晶振电路选用8MHz无源晶振,负载电容匹配为20pF(两个10pF电容串联)
- 在每对VDD-VSS引脚附近都放置了0.1μF去耦电容,确保电源稳定
调试中发现:如果去耦电容距离芯片超过1cm,MCU运行时会出现偶发死机。建议所有去耦电容尽量贴近芯片引脚放置。
2.2 传感器模块选型对比
在温湿度传感器选型时,我对比了三种常见方案:
| 传感器型号 | 精度(湿度) | 响应时间 | 接口方式 | 单价(元) |
|---|---|---|---|---|
| DHT11 | ±5%RH | 10s | 单总线 | 8.5 |
| DHT22 | ±2%RH | 2s | 单总线 | 23.0 |
| SHT30 | ±2%RH | 8s | I2C | 35.0 |
最终选择DHT11主要基于以下考虑:
- 课程设计场景对精度要求不高(±5%RH足够)
- 单总线协议节省IO口资源
- 成本优势明显(仅为SHT30的1/4)
2.3 人机交互模块实现
OLED显示模块选用0.96寸SSD1306驱动芯片的I2C版本,其硬件连接仅需4根线:
- SCL -> PB6
- SDA -> PB7
- VCC -> 3.3V
- GND -> GND
按键电路设计采用5向导航开关(上、下、左、右、确认),通过10kΩ电阻上拉到3.3V。消抖处理采用硬件(0.1μF电容)配合软件(50ms延时检测)双重方案。
3. 软件架构与核心算法实现
3.1 主程序流程图设计
系统软件采用前后台架构,主循环流程如下:
c复制while(1) {
humidity = DHT11_ReadData(); // 读取湿度
temperature = DHT11_ReadTemp(); // 读取温度
if(temperature < TEMP_MIN) {
Humidifier_OFF(); // 低温保护
} else if(humidity < HUMI_MIN) {
Humidifier_ON();
} else if(humidity > HUMI_MAX) {
Humidifier_OFF();
}
OLED_Refresh(); // 刷新显示
Bluetooth_Process(); // 处理蓝牙数据
Key_Scan(); // 扫描按键
Delay_ms(1000); // 1秒周期
}
3.2 温湿度采集优化
DHT11单总线通信时序要求严格,实测中发现两个关键点:
- 主机拉低总线必须保持至少18ms(实测20ms最可靠)
- 数据位读取时,建议在26-28μs时采样(过早容易误判)
改进后的读取函数核心逻辑:
c复制void DHT11_StartSignal(void) {
GPIO_ResetBits(DHT11_PORT, DHT11_PIN);
Delay_ms(20); // 保持低电平20ms
GPIO_SetBits(DHT11_PORT, DHT11_PIN);
Delay_us(30); // 等待30μs
}
uint8_t DHT11_ReadBit(void) {
while(!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)); // 等待低电平
Delay_us(28); // 关键延时点
return GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN);
}
3.3 蓝牙通信协议设计
ECB02蓝牙模块采用自定义的简单协议格式:
code复制[HEAD][LEN][CMD][DATA][CHECKSUM]
其中:
- HEAD固定为0xAA
- LEN为DATA长度
- CMD定义如下:
- 0x01:设置湿度阈值
- 0x02:控制加湿器开关
- DATA根据CMD变化
- CHECKSUM为前面所有字节的异或值
手机端设置湿度阈值的典型数据包示例:
code复制AA 02 01 3C 45 // 设置湿度阈值为60%(0x3C)
4. 系统调试与性能优化
4.1 常见问题排查指南
在项目调试过程中,我总结了以下典型问题及解决方案:
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| DHT11读取失败 | 时序不符合要求 | 调整延时参数,确保>18ms启动 |
| OLED显示花屏 | I2C地址不匹配 | 检查0x78/0x7A地址跳线 |
| 蓝牙连接不稳定 | 模块供电不足 | 单独3.3V供电,加100μF电容 |
| 加湿器误动作 | 电磁干扰 | 继电器线圈增加续流二极管 |
4.2 关键参数实测数据
系统在25℃环境下的湿度控制精度测试数据:
| 设定湿度(%) | 实测平均湿度(%) | 波动范围(%) | 响应时间(s) |
|---|---|---|---|
| 40 | 39.8 | ±1.2 | 85 |
| 50 | 49.5 | ±1.5 | 92 |
| 60 | 59.3 | ±1.8 | 105 |
测试发现:当环境温度低于10℃时,建议将最大湿度阈值下调5%,以防止窗户结露。
5. 项目扩展与改进方向
在实际使用三个月后,我发现几个值得优化的方向:
- 增加WiFi模块实现云端监控(可选用ESP-01S)
- 引入PM2.5传感器实现空气质量联动控制
- 开发自适应算法,根据昼夜温差自动调整湿度阈值
- 改用PWM控制加湿器功率,实现更精细的调节
电源部分也有改进空间,当前采用的5V/2A适配器供电,可以升级为锂电池+充电管理方案,使系统具备断电持续工作能力。我在PCB布局时特意预留了TP4056充电芯片的位置,方便后续升级。