1. 项目概述
这个基于STM32的温湿度采集报警系统,是我去年为一个农业大棚监控项目设计的核心模块。当时农户需要实时掌握棚内环境参数,并在异常情况下立即获得提醒。市面上成品监测设备要么功能过剩价格昂贵,要么扩展性不足,于是我决定用STM32F103C8T6这款性价比极高的MCU自主开发一套解决方案。
系统通过DHT11传感器采集环境温湿度数据,当数值超出预设阈值时,触发蜂鸣器和LED灯进行声光报警。整个设计包含硬件电路搭建、STM32程序开发、阈值配置界面三大部分,成本控制在50元以内,实测稳定性完全满足农业生产需求。下面我将从设计思路到具体实现,完整分享这个项目的开发过程。
2. 核心需求解析
2.1 农业环境监控的特殊要求
与传统工业监测不同,农业应用有三个关键特点:
- 需要兼顾温湿度两个参数的联合监测(例如高温高湿易引发病害)
- 报警阈值需根据不同作物生长阶段灵活调整
- 设备必须耐受粉尘、潮湿等恶劣环境
这决定了我们的系统需要:
- 采用防潮封装的传感器
- 设计参数可调的报警逻辑
- 保留至少2个扩展接口以备后期添加CO2等传感器
2.2 硬件选型依据
主控选择STM32F103C8T6(蓝色pill开发板)的原因:
- 72MHz主频足够处理传感器数据
- 内置ADC可扩展其他模拟量传感器
- 价格仅10元左右
- 丰富的GPIO方便连接外设
传感器选用DHT11而非更精确的DHT22,主要考虑:
- 大棚监测不需要±0.5℃的高精度
- DHT11的±2℃精度完全够用
- 成本仅为DHT22的1/3
3. 硬件设计详解
3.1 电路原理图设计
整个系统包含5个核心模块:
- STM32最小系统电路
- DHT11传感器接口电路
- 蜂鸣器驱动电路
- LED报警指示灯电路
- USB转串口下载电路
关键设计要点:
- 在DHT11数据线上拉4.7K电阻保证信号稳定
- 蜂鸣器采用PNP三极管驱动(比NPN更省电)
- 所有I/O口预留ESD保护二极管
注意:DHT11的供电电压必须稳定在3.3V-5.5V之间,直接连接STM32的3.3V可能导致工作异常,建议单独使用LDO稳压供电。
3.2 PCB布局技巧
经过多次打样测试,总结出以下经验:
- DHT11传感器应通过1米延长线外置,避免板载发热影响读数
- 蜂鸣器下方铺地可以减少电磁干扰
- 电源走线宽度不小于0.5mm
- 在STM32的NRST引脚放置0.1uF去耦电容
实测证明,按照以上规则设计的PCB,在-20℃~60℃环境下都能稳定工作。
4. 软件实现关键点
4.1 传感器数据采集
DHT11的通信时序要求严格,具体实现步骤如下:
c复制// 步骤1:主机拉低总线18ms以上
GPIO_ResetBits(DHT11_PORT, DHT11_PIN);
delay_ms(20);
// 步骤2:主机释放总线等待传感器响应
GPIO_SetBits(DHT11_PORT, DHT11_PIN);
while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN));
// 步骤3:读取40bit数据
for(int i=0; i<40; i++){
while(!GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)); // 等待低电平结束
delay_us(30);
if(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN))
data[i/8] |= (1<<(7-i%8));
while(GPIO_ReadInputDataBit(DHT11_PORT, DHT11_PIN)); // 等待高电平结束
}
4.2 报警逻辑实现
采用状态机设计模式,系统有三种工作状态:
- 正常状态:LED慢闪(1Hz),蜂鸣器静音
- 预警状态:LED快闪(5Hz),蜂鸣器间歇鸣响
- 报警状态:LED常亮,蜂鸣器持续鸣响
状态转换条件通过以下代码实现:
c复制if(temp > temp_threshold || humi > humi_threshold){
if(++alarm_counter > 3){ // 连续3次超阈值才触发
current_state = ALARM_STATE;
}else{
current_state = WARNING_STATE;
}
}else{
alarm_counter = 0;
current_state = NORMAL_STATE;
}
5. 系统调试与优化
5.1 传感器校准技巧
发现DHT11在以下情况会出现读数偏差:
- 阳光直射时温度偏高2-3℃
- 结露时湿度显示100%后恢复缓慢
解决方法:
- 给传感器加装白色防辐射罩
- 在程序中添加以下滤波算法:
c复制// 滑动平均滤波
temp_sum = temp_sum - temp_buf[index] + new_temp;
temp_buf[index] = new_temp;
current_temp = temp_sum / BUF_SIZE;
5.2 低功耗优化
通过以下措施使待机电流从25mA降至8mA:
- 关闭未使用的GPIO时钟
- 采用PWM驱动蜂鸣器(比直流驱动省电30%)
- 采集间隔从1秒调整为5秒(对农业应用足够)
6. 常见问题解决方案
6.1 DHT11无响应排查
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 一直返回255 | 接线错误 | 检查VCC/GND/DATA连接 |
| 偶尔数据错误 | 时序不准 | 调整delay_us精度 |
| 完全无反应 | 传感器损坏 | 更换DHT11 |
6.2 误报警处理
遇到环境突变时容易产生误报,通过以下方式改善:
- 设置10秒延迟报警(过滤短时波动)
- 增加红外人体传感器(区分人为开门与环境异常)
- 采用双阈值设计(预警阈值和报警阈值)
7. 项目扩展方向
实际部署后,用户又提出了新需求:
- 增加手机短信报警功能
- 方案:添加SIM800C GSM模块
- 成本:增加约35元
- 实现多节点组网
- 方案:改用STM32+LoRa模块
- 传输距离:实测可达800米
这个项目给我的启示是:工业级可靠性不一定需要复杂的方案,用对的设计方法,低成本单片机也能完成专业监测任务。最近我正在移植到STM32G0系列,使BOM成本再降低20%。