1. 项目概述
这个温湿度报警系统是我去年为一个食品仓储项目设计的实用方案。当时客户需要实时监控仓库环境,在温湿度超出安全范围时立即触发报警。市面上现成的环境监测设备要么价格昂贵,要么功能冗余,于是我决定用单片机开发一套定制化解决方案。
整套系统硬件成本控制在200元以内,核心功能包括:
- 实时采集环境温湿度数据
- 本地LCD显示屏数值展示
- 蜂鸣器声光报警
- 阈值可配置
- 历史数据存储(选配)
经过三个月的实际运行测试,系统稳定性达到99.7%,误报率低于0.3%,完全满足中小型仓储环境监控需求。下面我就详细拆解这个项目的设计思路和实现细节。
2. 硬件选型与电路设计
2.1 核心器件选型
主控芯片选择:
对比了STC89C52、STM32F103C8T6和ESP8266三款主流单片机:
- STC89C52价格最低(约8元)但功能有限
- ESP8266自带WiFi但功耗较高
- 最终选择STM32F103C8T6(15元),性价比最优:
- 72MHz主频满足实时性要求
- 内置12位ADC便于传感器采样
- 丰富的外设接口(I2C/SPI/USART)
- 低功耗模式节省电能
温湿度传感器对比:
测试了DHT11、DHT22和SHT30三款传感器:
- DHT11(10元)精度低(±5%RH)
- SHT30(45元)精度高但成本高
- 折中选择DHT22(18元):
- ±2%RH湿度精度
- ±0.5℃温度精度
- 单总线通信节省IO口
其他关键器件:
- LCD1602显示屏(12元):2行16字符显示
- 有源蜂鸣器(3元):85dB报警音量
- 5V继电器模块(8元):可扩展控制通风设备
- DS1302时钟模块(5元):用于数据记录时间戳
2.2 电路原理图设计
整个系统电路分为五个模块:
-
电源模块:
- 采用AMS1117-3.3V稳压芯片
- 输入DC5V(可用手机充电器供电)
- 输出3.3V给STM32核心板
-
传感器接口:
c复制// DHT22连接示意图 VCC -- 3.3V DATA -- PA1 (需接4.7K上拉电阻) GND -- GND -
显示模块:
- LCD1602采用4位并行模式
- 对比度调节电位器10KΩ
-
报警输出:
- 蜂鸣器通过PNP三极管驱动
- 继电器线圈需加续流二极管
-
调试接口:
- SWD下载口预留
- USART1连接CH340G串口芯片
注意:DHT22数据线长度不宜超过20cm,否则可能因信号衰减导致读取失败。实际布线时建议传感器尽量靠近MCU。
3. 软件设计与实现
3.1 系统软件架构
采用分层设计模式:
code复制应用层
├─ 报警逻辑处理
├─ 数据显示更新
└─ 用户按键处理
驱动层
├─ DHT22传感器驱动
├─ LCD1602显示驱动
└─ 蜂鸣器控制驱动
硬件抽象层
└─ GPIO/I2C/定时器配置
3.2 关键代码实现
DHT22数据采集:
c复制#define DHT22_PIN GPIO_PIN_1
void DHT22_StartSignal(void) {
HAL_GPIO_WritePin(GPIOA, DHT22_PIN, GPIO_PIN_RESET);
HAL_Delay(18); // 主机拉低至少18ms
HAL_GPIO_WritePin(GPIOA, DHT22_PIN, GPIO_PIN_SET);
delay_us(30); // 主机拉高20-40us
}
uint8_t DHT22_CheckResponse(void) {
uint8_t response = 0;
delay_us(40);
if (!HAL_GPIO_ReadPin(GPIOA, DHT22_PIN)) {
delay_us(80);
if (HAL_GPIO_ReadPin(GPIOA, DHT22_PIN)) {
response = 1;
}
}
return response;
}
报警阈值判断逻辑:
c复制void CheckThresholds(float temp, float humidity) {
static uint8_t alarm_status = 0;
if(temp > temp_high_th || temp < temp_low_th) {
Buzzer_On();
LCD_ShowWarning("TEMP OUT RANGE!");
alarm_status |= 0x01;
}
if(humidity > humi_high_th) {
Buzzer_On();
LCD_ShowWarning("HUMI TOO HIGH!");
alarm_status |= 0x02;
}
if(alarm_status && (temp>=temp_low_th && temp<=temp_high_th && humidity<=humi_high_th)) {
Buzzer_Off();
LCD_ClearWarning();
alarm_status = 0;
}
}
3.3 重要参数配置
-
采样间隔:
- 默认设置为2秒(DHT22最小间隔)
- 可通过修改timer周期调整
-
报警延时:
- 连续3次超限才触发报警
- 防止瞬时波动误报
-
数据滤波:
- 采用滑动平均滤波算法
- 窗口大小=5
c复制#define SAMPLE_INTERVAL 2000 // ms
#define ALARM_DELAY_COUNT 3
#define FILTER_WINDOW_SIZE 5
float temp_filter_buf[FILTER_WINDOW_SIZE];
float humi_filter_buf[FILTER_WINDOW_SIZE];
4. 系统调试与优化
4.1 常见问题排查
问题1:DHT22读数不稳定
- 现象:偶尔返回-999错误值
- 解决方法:
- 检查电源是否稳定(建议并联100uF电容)
- 缩短数据线长度
- 增加读取失败重试机制(最多3次)
问题2:LCD显示乱码
- 现象:第二行显示异常字符
- 排查步骤:
- 确认初始化时序正确
- 调整对比度电位器
- 检查4位/8位模式设置
问题3:误报警频繁
- 优化方案:
- 增大滤波窗口至7
- 设置5秒报警延时
- 添加±0.5℃的死区范围
4.2 功耗优化技巧
-
低功耗模式:
- 采样间隔期间进入Stop模式
- 通过RTC唤醒节省电能
-
显示背光控制:
- 无操作5分钟后关闭背光
- 按键唤醒恢复
-
报警电路优化:
- 采用PWM驱动蜂鸣器
- 报警声间歇式鸣响(响1秒停1秒)
实测功耗对比:
| 模式 | 电流消耗 |
|---|---|
| 持续工作 | 45mA |
| 低功耗模式 | 3.8mA |
| 深度睡眠 | 0.5mA |
5. 功能扩展方案
5.1 无线传输模块
方案1:蓝牙HC-05
- 成本:25元
- 传输距离:10米
- 配套手机APP监控
方案2:LoRa模块
- 成本:75元(SX1278)
- 传输距离:3km(视距)
- 适合大型仓库多点组网
5.2 数据记录功能
-
SD卡存储:
- 添加SPI接口SD卡模块
- 按小时存储csv格式数据
-
OLED显示升级:
- 替换为0.96寸OLED
- 可显示历史曲线图
-
RTC时间戳:
c复制typedef struct { uint16_t year; uint8_t month; uint8_t day; uint8_t hour; uint8_t minute; uint8_t second; } DateTime;
5.3 联动控制扩展
-
通风设备控制:
- 湿度>70%自动启动排风扇
- 通过继电器控制220V设备
-
短信报警:
- 增加SIM800L模块
- 超限时发送预警短信
-
云平台对接:
- 通过ESP8266上传数据
- 微信小程序远程监控
6. 项目总结与心得
经过这个项目的完整开发周期,有几个关键经验值得分享:
-
传感器选型:不要盲目追求高精度,DHT22在成本与性能间取得了很好平衡,实测在25℃环境下,湿度误差不超过±3%RH。
-
抗干扰设计:
- 所有数字信号线加100Ω电阻串联
- 模拟电源增加LC滤波
- 外壳采用金属材质屏蔽
-
生产测试流程:
- 高温老化测试(85℃/8小时)
- 湿度循环测试(30%-90%RH)
- 2000次按键寿命测试
这个系统目前已在三个食品仓库稳定运行超过半年,期间经历过夏季高温高湿环境的考验。后续计划加入电池供电版本,方便在临时仓储场所使用。