简介:基于单片机的粮仓温湿度检测与控制系统设计文档,面向电子、自动化及粮食仓储相关专业学生、课程设计与毕业设计人员,也适合粮库管理者参考。系统以AT89S52单片机为控制核心,采用SHT10数字传感器采集仓内温湿度,经分析处理后由TC1602液晶显示当前数值,并依据预设上下限驱动报警电路,实现超限提醒,从而降低人工检测强度、减少粮食损失。文档为华北电力大学本科毕业设计论文《大型粮库的温湿度检测及控制系统设计》,包括中英文摘要、关键词、目录、总体设计、硬件电路、软件流程及调试结论等完整章节。压缩包内共1个docx文件,大小1.25MB,结构完整,便于参照完成毕业设计或课程报告。目前已有322人学习,适合需要借鉴单片机温湿度控制系统设计思路者。
1. 粮仓温湿度控制:为什么只盯着温度曲线,仓还是照样霉
粮仓温湿度控制难,难在仓房是个“慢热”容器。外面天气骤变,仓内温度和湿度要滞后大半天甚至一整天;等你在监控屏上看出异动,粮堆表层的水分可能已经涨上来了。这个标题拆开看是两件事:一是测准,二是控住。测准靠传感器选型与布点,控住靠通风、除湿和降温的先后逻辑,两者都依赖传输链路和数据规则。这套系统不是“买几个温湿度传感器接个大屏”那么简单,它适合粮库保管员、仓储管理员和农业自动化集成商,尤其适合正在做旧仓改造、预算有限又要求可靠性的团队。下面按选型、链路、策略、排障、维护的顺序,把一条能落地的闭环讲清楚。
2. 传感器选型与布点:先把测量做准,才能谈控制
2.1 温度、湿度、粮温三类传感器如何取舍
粮仓里通常要同时关心三组数据:仓内空气温湿度、粮堆内部的粮温、以及室外大气温湿度。它们作用不同,不能互相替代。
仓内空气温湿度决定了粮食表面是否容易吸湿。粮食是吸湿性物料,环境相对湿度超过 65% 时,小麦、稻谷的表层水分就会明显上升。粮温则反映粮堆内部的发热状况,粮食是热的不良导体,粮堆内部的温度变化很缓慢,一旦局部粮温异常升高,往往是微生物或储粮害虫活动的信号。室外温湿度则是判断能否开窗通风的依据,不能凭体感拍脑袋。
选型上的常见做法是:
- 仓内空气温湿度使用壁挂式温湿度变送器,输出 RS-485 信号。
- 粮温使用“测温电缆”或“粮情测控分机”加温度传感器链,按粮堆高度分层布置。
- 室外使用带防辐射罩的温湿度变送器,避免太阳直射造成测量偏高。
这里有一个常被忽略的细节:仓内粮食表面的空气温湿度传感器的精度等级,应优先看湿度精度。温度误差 ±0.5℃ 在仓储场景完全够用,但湿度误差 ±3%RH 和 ±5%RH 的传感器,在通风判断上的表现差异非常大。湿度是决定霉变的关键变量,预算有限时,宁可选湿度精度高的型号,也不要买温湿度精度都平庸的产品。
2.2 布点密度与位置:探头的“代表性问题”
布点不是均匀撒网就行,核心原则是“哪里容易出问题,哪里就多放”。
粮堆内部测温电缆的典型布置方式是按仓房面积划分网格,每 100 到 200 平方米布一条测温电缆,电缆上每隔 1.5 到 2 米设一个测温点。电缆从粮堆表面垂直插入,深度覆盖粮堆的上、中、下三层。这样做的原因是粮堆内部热量不易散发,局部发热点如果没有对应的测温点,就会成为监控盲区。某粮库曾发生这样的情况:一条电缆上 5 个测温点全部正常,但两米外有一个因杂质聚集形成的发热点,直到表层出现结露才发现。这不是传感器坏了,而是空间采样密度不够。
仓内空气温湿度探头应布置在粮堆表面以上 0.5 米处,这个位置代表粮面附近微环境。探头不要贴着墙壁或窗户,墙体温度会干扰测量;也不要正对通风口,通风时高速气流会带来瞬时读数跳动,影响控制判断。
室外温湿度变送器要装在仓房背阴面,加防辐射罩。阳光直射下,传感器测得的气温会比真实气温高出好几度。若用这个错误数据做通风判断,会让系统在白天误开窗,引进热湿空气。
2.3 选型参数速查表
| 参数 | 仓内空气温湿度 | 粮温测量 | 室外温湿度 |
|---|---|---|---|
| 温度量程 | -20℃ ~ 60℃ | -40℃ ~ 85℃ | -40℃ ~ 60℃ |
| 湿度量程 | 0%RH ~ 100%RH | 不需要湿度 | 0%RH ~ 100%RH |
| 温度精度 | ±0.5℃ | ±0.5℃ | ±0.5℃ |
| 湿度精度 | ±3%RH(重点看) | 不涉及 | ±3%RH |
| 信号输出 | RS-485 / 4-20mA | RS-485 或脉冲计数 | RS-485 |
| 防护等级 | IP54 以上 | 护套抗压、防熏蒸腐蚀 | IP65 以上 |
这里的 IP54 和 IP65 差异要注意:粮仓在熏蒸杀虫时会释放腐蚀性气体,仓内传感器外壳和电路板必须做防腐蚀处理。便宜的家用传感器在这样的环境里用不了几个月,读数就会漂移甚至失效。室外传感器要防雨,IP65 是底线。
3. 数据采集链路搭建:从 RS-485 到上位机的通信细节
3.1 总线拓扑与地址分配
温湿度传感器和测温分机绝大多数采用 RS-485 总线接入采集器或上位机。RS-485 是半双工差分总线,支持多点挂接,一条总线上可挂 32 到 128 个设备,具体数量取决于采集器驱动能力和线缆质量。粮仓项目常见的做法是:每个仓房拉一条 RS-485 总线,室内用屏蔽双绞线,穿管敷设,所有传感器并联在这条总线上,最后统一接入一个串口服务器或 PLC 采集模块。
地址分配上有一个容易踩的坑:不同厂家的温湿度变送器,默认地址都是 1。如果直接把多台设备挂上总线而不改地址,通讯时所有设备都会响应,总线冲突,数据全乱。所以现场安装的第一件事,就是给每台传感器编唯一地址。常见做法是用厂家提供的调试软件,通过 USB 转 RS-485 适配器逐台修改,地址从 1 开始顺序分配,并在设备外壳上用标签注明仓房号和点位号。这个标签在后续排查故障时能节省大量时间。
总线拓扑应尽量采用“手拉手”方式,从采集器引出,经过传感器 A 再到 B、C,避免星形分支。RS-485 在星形分支处容易产生信号反射,距离稍长或分支较多时会出现偶发性通讯错误。这个现象在粮仓现场非常典型:系统刚装好时一切正常,运行两周后开始随机丢数据,查到最后往往是现场接线图没有按总线拓扑施工,某段线缆变成了 T 型分支。
3.2 用 Modbus 把小量程数字化:一个可复现的读数据片段
绝大部分工业级温湿度变送器支持 Modbus RTU 协议。上位机通过串口或 TCP 网关发送读保持寄存器的指令,就能拿到温度和湿度值。下面给一个用 Python 读传感器数据的可复现片段:
import minimalmodbus import time # 假设传感器从站地址为 1,串口为 /dev/ttyUSB0 instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 1) instrument.serial.baudrate = 9600 instrument.serial.bytesize = 8 instrument.serial.parity = 'N' instrument.serial.stopbits = 1 instrument.serial.timeout = 0.5 def read_sensor(): # 多数国产变送器的温度保存在寄存器 0x0001,湿度在 0x0002 # 部分型号温度在 0x0000,湿度在 0x0001,需以说明书为准 temperature = instrument.read_register(0x0001, 0, 3) # 函数码 0x03 humidity = instrument.read_register(0x0002, 0, 3) # 部分设备寄存器值的精度需要除以 10 或 100 才是真实数值 return temperature / 10.0, humidity / 10.0 while True: try: temp, humi = read_sensor() print(f"温度: {temp:.1f} C, 湿度: {humi:.1f} %RH") except Exception as e: print(f"读取失败: {e}") time.sleep(30)这段代码里read_register(0x0001, 0, 3)的三个参数分别是寄存器地址、小数位数和函数码。小数位填 0 表示按整数读取,填 2 表示自动除以 100。很多初用者在读出离谱数值时,第一反应是传感器坏了,其实十有八九是小数位参数与设备说明书不一致。温度 25.3℃ 读出来变成 2530,就是因为小数位填错了。另外,串口参数中的波特率必须与传感器拨码开关设置一致,常见速率是 9600 和 4800,两者混用时通讯会完全失败。
3.3 线缆与供电:现场总线翻车的高发区
粮仓现场的 RS-485 布线和机房里的网线完全不是一个逻辑。现场常见问题集中在供电电压跌落和线缆屏蔽接地两个方面。
RS-485 总线供电距离超过 100 米时,如果使用 24V 直流集中供电,线尾传感器电压可能跌破工作下限。我一般会在总线末端实测传感器供电端子电压,如果低于 20V,就把供电线加粗或者改用分布式供电,在总线中段补一个电源。另一个做法是采用“一线供电”方式,但这种方式对线径要求更高,粮仓项目里性价比一般,不如老老实实拉两根电源线。
屏蔽层接地也常被搞反。粮仓动力线路多,变频通风机启动时会产生较强的电磁干扰。屏蔽双绞线的屏蔽层应单端接地,且接在采集器侧的真正大地地线上,不是接在开关电源的负极上。如果屏蔽层两端都接地,反而会形成接地环路,干扰比不屏蔽还大。还有一种情况是屏蔽层悬空不接,这等于没有屏蔽,通讯距离一长就丢包。
判断总线质量有一个很直接的办法:用串口调试工具连续读取 100 帧数据,统计错误帧数。错误率超过 1%,不要急着加中继器,先检查线缆压接是否牢固。粮仓振动环境倒不多,但老鼠咬线和熏蒸后接线端子氧化是高频故障点,压接处最好做灌胶或热缩处理。
4. 控制策略:通风、降温、除湿的先后逻辑
4.1 判断依据:绝对湿度比温度先说话
粮仓通风降温的常见误区是“降温就开窗”。实际上,判断能否通风以及通风多久,依据不是温度差,而是绝对湿度差。绝对湿度是指单位体积空气中所含水蒸气的质量,单位是 g/m³。即使外面的温度比仓内低,如果外面空气的绝对湿度高于仓内,开窗通风就会把湿气带进粮堆表层。
粮食的吸湿和解吸是一个缓慢过程,但表层粮食与空气接触面大,响应速度比粮堆内部快得多。一次错误的通风可能让粮面水分从 12.5% 涨到 14%,而 14% 的水分恰好踩在霉菌快速生长的临界点上。所以控制逻辑的第一优先原则是:绝对湿度高于仓内的空气,一律不开窗。
绝对湿度可以通过温度和相对湿度换算得到。常用近似公式为:
import math def absolute_humidity(temp_c, rh_pct): # 饱和水气压,温度单位摄氏度 e_sat = 6.112 * math.exp(17.67 * temp_c / (temp_c + 243.5)) # 实际水汽压,单位 hPa e_act = e_sat * rh_pct / 100.0 # 绝对湿度,单位 g/m^3 ah = 1000 * e_act / (461.5 * (273.15 + temp_c)) return ah # 示例:仓内 20℃ / 65%RH 与仓外 25℃ / 55%RH inner_ah = absolute_humidity(20.0, 65.0) outer_ah = absolute_humidity(25.0, 55.0) print(f"仓内绝对湿度: {inner_ah:.1f} g/m3") print(f"仓外绝对湿度: {outer_ah:.1f} g/m3") print("可通风" if outer_ah < inner_ah else "不可通风")换算成代码后,通风判断就不再依赖拍脑袋。这里仓内温度 20℃ 湿度 65%,算出来的绝对湿度大约是 11.2 g/m³;仓外 25℃ 但湿度只有 55%,绝对湿度反而高达 12.4 g/m³,数值上明显高于仓内。这就是一个典型场景:仓库管理员体感觉着外面“干爽凉快”,实际上外面的空气比仓内更湿,开窗就会出事。
4.2 控制规则表与不动作区(死区)
自动控制不能做成一个简单的比较器。温度传感器和湿度传感器的测量噪声、粮食自身的滞后性,都会导致频繁启停设备。控制策略中必须引入死区和回差。
以通风机控制为例:
| 条件 | 动作 |
|---|---|
| 仓外绝对湿度 < 仓内绝对湿度 - 1.0 g/m³ | 允许开启通风 |
| 仓外绝对湿度与仓内差在 ±1.0 g/m³ 内 | 不动作,保持当前状态 |
| 仓外绝对湿度 > 仓内绝对湿度 + 1.0 g/m³ | 关闭通风窗 |
| 仓内温度 > 28℃ 且仓外温度 < 仓内温度 - 3℃ | 优先执行降温通风 |
| 仓内相对湿度 > 75%RH | 启动仓内除湿机 |
| 仓内温度 < -5℃ | 禁止通风,防止粮堆内形成“冷心” |
死区设为 1.0 g/m³ 的意义在于,传感器和天气波动很容易让差值在零附近来回跳动,没有死区的话通风机会在几分钟内反复启停,电机寿命和电网冲击都受不了。通风窗和风机的启停间隔应不小于 30 分钟,这个逻辑也可以直接写进控制程序里。
4.3 联动控制的代码骨架
控制程序不宜直接在传感器采集线程里做判断,建议把采集、决策、执行分离。下面给一个常见的决策骨架:
# 采集后的数据字典示例 data = { "inner_temp": 21.0, # 仓内温度 "inner_rh": 70.0, # 仓内相对湿度 "inner_ah": 12.1, # 仓内绝对湿度 "outer_temp": 18.0, # 仓外温度 "outer_rh": 55.0, # 仓外相对湿度 "outer_ah": 8.2, # 仓外绝对湿度 } AH_DEADBAND = 1.0 # 绝对湿度死区,单位 g/m3 TEMP_RISE_LIMIT = 28.0 # 仓内温度上限 AFTER_ACTION_WAIT = 1800 # 两次动作之间的间隔,单位秒 def decide(data, last_action_time): import time if time.time() - last_action_time < AFTER_ACTION_WAIT: return "no_action" ah_diff = data["outer_ah"] - data["inner_ah"] if ah_diff < -AH_DEADBAND: return "open_vent" if ah_diff > AH_DEADBAND: return "close_vent" if data["inner_temp"] > TEMP_RISE_LIMIT and data["outer_temp"] < data["inner_temp"] - 3.0: return "cooling_fan" return "no_action"这段决策代码的关键点在于优先级:外湿大于仓内时,即使温度很高也不能开窗,先关窗再考虑其他手段。这个优先级顺序是粮仓控制与普通空调控制最大的不同。普通空调只要负责把室温降下来就可以了,粮仓却要同时守住水分这条底线。温度超标可以事后补救,水分一旦升上去,翻仓、晾晒的代价就大了。所以任何控制逻辑中“湿优先于温”的判断顺序不能颠倒。
5. 粮仓温湿度控制的避坑清单:五种高频故障怎么排查
5.1 现象:总线通讯不稳定,偶发性丢数据
新建系统运行一两周后开始随机丢包,有时整个仓房的数据都读不到,过一会儿又自己恢复。
原因是 RS-485 总线存在隐性故障,多半是某个接线端子氧化、松动,或是总线存在星形分支。粮仓熏蒸期间,含硫气体对端子镀层的腐蚀非常快,铜端子表面会生成一层暗色的氧化膜,接触电阻变大。
解决时按顺序排查:先用万用表量总线 A/B 之间的静态电压,正常应在 1.5V 到 5V 之间;再打开所有接线盒逐段目测端子,氧化严重的直接剪线重压。分支问题则需要重新走线,把 T 型分支改成手拉手。排障时最忌讳的就是不查物理线缆,反复修改采集程序超时时间。超时时间加长只能掩盖症状,不能修复接触电阻带来的信号畸变。
5.2 现象:夏季粮堆内部“热点”检测不到
温度报警没有触发,但开仓检查时发现粮堆局部已经发热结块。
原因是测温电缆布置间距过大。粮堆内部的发热源往往是不均匀杂质区,微生物活动集中在一个很小的区域,半径可能不到半米。如果测温点网格间距超过 3 米,这个小热点就很难落在探头上。
解决方法是加密局部测温点,特别在入粮口、杂质聚集区和靠近墙壁的粮堆边缘补设测温电缆。另一个做法是增加“粮温变化速率”报警指标,而不是只盯着绝对温度。粮堆内部日升温速率超过 0.2℃/天时,即使绝对值还没到报警线,也需要人工取样检查。
5.3 现象:通风机开启一晚,粮面反而更湿了
夜间通风,第二天早上发现粮面结露,表层水分明显升高。
原因是控制程序只按温度差判断通风,忽略了绝对湿度比较。夜间室外气温确实低,但相对湿度往往在 90% 以上,绝对湿度不一定低于仓内。把凉而湿的空气引入仓内,碰到温度更低的粮面,水分直接在粮面凝结。
解决方法是把通风判断条件改为“仓外绝对湿度低于仓内”作为主条件,温度差作为辅助条件。在这个案例中,操作者把温度优先改成湿度优先之后,同类问题就不再出现。排查时不要只看白天数据,要看凌晨 3 点到 5 点这个时段的绝对湿度曲线。一天中这段时间室外相对湿度最高,也是最容易出事的时段。
5.4 现象:湿度传感器读数漂移,长期偏高
同一台传感器的湿度读数从最初的 62%RH 慢慢漂到了 70%RH,仓内实际水分却没有明显变化。
原因是高分子湿度传感器在长期高湿和熏蒸环境下会缓慢劣化,感湿材料吸附杂质后响应特性改变。粮仓内部的粉尘和熏蒸药剂残留是传感器漂移的主要推手。
解决方法是建立定期校准制度,每半年用标准盐溶液校准一次。仓内悬挂的传感器如果读数偏差超过 5%RH,直接更换探头,不值得在软件里做偏移修正。这是因为湿度传感器的漂移往往不是线性的,低湿段和高湿段的偏差方向不一致,软件修正反而会把低湿区的误判放大。
5.5 现象:自动控制频繁启停通风窗,电机过热
通风窗电机在一个小时内反复开关七八次,执行机构过热保护跳闸。
原因是死区设置太小或完全没有。温湿度传感器读数本身有波动,室外空气在傍晚会快速变凉,绝对湿度差在零附近来回振荡,导致控制逻辑反复切换。
解决方法是把死区加大到 1.0 g/m³ 以上,同时加入最小动作间隔。前文的代码骨架中AFTER_ACTION_WAIT参数就是干这个用的。还有一个细节:通风窗执行器应选用带行程限位的型号,避免因为程序发出重复指令而让电机持续堵转。
6. 季节性手段与校准习惯:让这套系统在三年后仍能复用
6.1 春秋季节的通风模式切换
粮仓温湿度控制不能一套参数用到黑。春秋两季是自然通风的黄金窗口,控制目标应切换为“保水降温”——在 3 月到 5 月和 9 月到 11 月,每天午后和夜间各评估一次通风条件。午后评估利用高温低湿时段排湿,夜间评估利用低温空气蓄冷。这两个窗口要分别计算绝对湿度,不能合并简化。实践中,春季的主导方向是降低粮温防止夏季陈化,秋季则是利用夜间低温把粮温降到 15℃ 以下,为来年夏季争取缓冲时间。夏冬两季则相反,夏季要关窗隔热、密封压盖,冬季要防止粮面过冷结露,此时通风窗甚至要加装保温措施。
6.2 半年做一次校准的操作顺序
校准没必要买昂贵的湿度校准仪,使用标准盐溶液就可以完成。常见做法是用氯化钠饱和溶液,20℃ 时理论相对湿度为 75.5%RH,把传感器探头放入密封罐中静置两小时,读取数值,偏差超过 5%RH 就直接更换。温度校准则使用冰水混合物的 0℃ 点和恒温箱的 50℃ 点。每次校准后把结果贴在仓房门口的记录表上,标明仓号、传感器编号、校准前后读数和日期。这套校准习惯最大的价值不是精度本身,而是长期趋势追踪——同一位置的传感器每次校准偏差都在增大,就说明这个位置的防护措施失效了,可能是密封盒破损,也可能是熏蒸防护罩脱落。
6.3 用“粮情报表”反向验证传感器状态
我习惯每周打印一份粮情报表:每个测温点的温度、仓内湿度、通风设备动作次数,以及散热窗口的执行情况。报表的价值在于横向比较。当粮堆中间的某一层温度曲线与上层曲线突然脱节时,我会怀疑测温点本身出了问题,而不是相信“出现了局部发热”。这个习惯可以用一句话概括:传感器也会撒谎,但它撒谎的方式通常有规律。数据曲线长期平滑得异常,或与相邻点位完全同步,都值得现场复核。真正掌握这套系统的人,不会只在监控屏前盯曲线,而是把曲线当作现场问题的索引。希望帮到你。
本文还有配套的精品资源,点击获取