1. 项目概述
这个温湿度报警系统是我去年为一个农业大棚监控项目设计的核心组件。当时农户需要实时掌握大棚内的环境参数,特别是在夜间和恶劣天气时能及时收到异常警报。基于这个实际需求,我选择了STM32F103C8T6作为主控芯片,搭配DS18B20温度传感器和湿敏电阻,构建了一套成本低廉但可靠性高的监控方案。
系统最核心的功能在于实时监测环境温湿度,当数值超过预设阈值时,会通过本地声光报警和远程APP推送两种方式同时提醒用户。这种双重报警机制在实际应用中非常实用——本地报警确保现场人员能立即察觉,而远程推送则让不在现场的管理者也能及时掌握情况。
整个系统硬件成本控制在百元以内,但实现了商业级监控设备80%的功能。特别值得一提的是,我通过优化电路设计和软件算法,将温度测量精度稳定在±0.5℃以内,湿度测量误差不超过±3%RH,完全满足农业生产的精度要求。
2. 硬件设计详解
2.1 核心器件选型
主控芯片选择STM32F103C8T6是经过多方比较后的决定。这款ARM Cortex-M3内核的MCU具有72MHz主频,64KB Flash和20KB RAM,性能足够处理传感器数据并运行轻量级TCP/IP协议栈。相比传统的51单片机,它的优势在于:
- 丰富的外设接口(3个USART、2个SPI、2个I2C)
- 充足的GPIO资源(37个I/O口)
- 内置12位ADC,可直接读取模拟传感器信号
- 低功耗特性(运行模式约36mA,待机模式低至2μA)
温度传感器选用DS18B20而非DHT11,主要基于三点考虑:
- 测量范围更宽(-55℃~+125℃ vs 0℃~50℃)
- 精度更高(±0.5℃ vs ±2℃)
- 单总线接口节省IO资源
湿度检测采用HS1101湿敏电容,配合555定时器构成振荡电路,将湿度变化转换为频率信号。这种方案比直接使用数字湿度传感器成本更低,且线性度良好(在30%~90%RH范围内误差<±3%)。
2.2 关键电路设计
传感器接口电路需要特别注意抗干扰设计:
c复制// DS18B20连接示意图
VDD ──┬── 3.3V
│
4.7KΩ
│
DQ ───┴── PA0
湿敏电容振荡电路采用经典的555多谐振荡器配置:
code复制HS1101 ──── 555 TIMER
│
100pF
│
10KΩ POT (用于校准)
WiFi模块选用ESP-01S,通过串口与STM32通信。这里需要电平转换电路,因为ESP模块是3.3V器件而STM32部分IO可容忍5V:
code复制STM32 TX ──| 1KΩ |── ESP RX
STM32 RX ──| 2KΩ |── ESP TX
│
3.3V
注意:所有长距离信号线(>10cm)都应加装100Ω电阻进行阻抗匹配,防止信号反射导致通信异常。
3. 软件架构实现
3.1 主程序流程图
系统采用前后台架构,主循环中依次处理各模块任务:
c复制void main() {
hardware_init(); // 硬件初始化
wifi_connect(); // 连接WiFi
while(1) {
read_sensors(); // 读取传感器数据
process_data(); // 数据处理
check_threshold(); // 阈值判断
update_display(); // 刷新OLED
mqtt_publish(); // 数据上传
delay_ms(500); // 500ms周期
}
}
传感器读取采用时间片轮询方式:
- DS18B20:每2秒读取一次(单总线协议耗时约750ms)
- 湿度传感器:每5秒采样一次(需稳定振荡时间)
- 按键检测:每100ms扫描一次
3.2 关键算法实现
温度补偿算法:
c复制float get_corrected_temp() {
float raw = ds18b20_read();
static float history[5] = {0};
// 移动平均滤波
for(int i=4; i>0; i--)
history[i] = history[i-1];
history[0] = raw;
float avg = 0;
for(int i=0; i<5; i++)
avg += history[i];
return avg/5.0 * 0.98 + 0.5; // 线性补偿
}
湿度频率转换公式(需校准):
code复制RH% = (F_measured - F_dry) / (F_wet - F_dry) * 100
// F_dry: 干燥环境频率(约7350Hz)
// F_wet: 潮湿环境频率(约6050Hz)
4. 系统调试与优化
4.1 校准流程
温度校准:
- 将DS18B20与标准温度计置于恒温水浴槽
- 在0℃、25℃、50℃三个点记录传感器输出
- 根据偏差修改补偿系数
湿度校准更复杂:
- 使用饱和盐溶液创造已知湿度环境
- 75%RH:NaCl饱和溶液
- 33%RH:MgCl2饱和溶液
- 记录各湿度点对应的振荡频率
- 在代码中更新F_dry和F_wet参数
4.2 常见问题解决
问题1:WiFi频繁断开
- 检查电源稳定性(ESP模块峰值电流可达200mA)
- 添加AT+CIPRECONNCFG=1,1,10,30指令自动重连
- 在代码中加入心跳包机制(每30秒发送ping)
问题2:DS18B20读取失败
- 确保上拉电阻(4.7KΩ)已连接
- 检查时序精度(特别是复位脉冲需480μs±10%)
- 尝试降低总线速度(将延时从us级改为ms级)
问题3:OLED显示闪烁
- 减少全屏刷新频率(改为局部更新)
- 使用硬件SPI替代软件模拟(速度提升8倍)
- 增加显示缓冲区,避免直接操作显存
5. 实际应用效果
在三个月实地测试中,系统表现出色:
- 平均无故障运行时间 > 800小时
- 温度测量一致性 ±0.3℃
- 湿度测量重复性 ±2%RH
- WiFi断线后平均恢复时间 12秒
功耗测试结果(3.7V锂电池供电):
- 正常模式:23.5mA
- 报警状态:45mA(蜂鸣器工作)
- 深度睡眠:0.15mA(保留RTC唤醒)
几个值得分享的优化技巧:
- 在STM32的ADC采样时,短暂关闭WiFi模块可降低噪声
- 使用DMA传输SPI数据到OLED,可节省30%CPU资源
- 将频繁访问的变量定义为"__IO volatile"类型,避免编译器优化导致读取异常
这个项目最让我满意的不是技术实现,而是实际帮农户避免了两次极端天气造成的损失。一次是寒潮来临前系统提前报警,让他们有时间加盖保温层;另一次是持续降雨时湿度超标预警,及时通风避免了霉菌滋生。这种能解决实际问题的项目,才是嵌入式开发最大的价值所在。
