前阵子凌晨两点我被一通电话吵醒。棚里夜班师傅语气挺急“南边三号棚温度掉到八度了叶子都蔫了你赶紧过来看看。”等我开车赶到现场卷帘机控制器显示一切正常但棚内温度计确实挂在八度附近。那天我们折腾到天亮最后发现是侧窗执行器卡死冷风灌了一整夜而棚里挂的那几根水银温度计根本没人会在半夜去看。这件事之后我就下了决心再不靠“人去巡棚”来发现问题了。于是断断续续折腾了两个月自己从零攒了一套智能温室环境监测系统。它不是什么了不起的大工程没有高大上的工业级仪表用的都是市面上买得到的模块和开源方案但就是这套东西让我们棚里连续三个季度再没出过半夜冻苗、白天闷棚的破事。这篇文章不是论文也不是产品说明书就是把我从选型、接线、写代码、布点到踩坑的全过程捋一遍。如果你正打算给自家大棚、小型农场或者屋顶温室配一套监测系统又不想一上来就掏小一万买成品那这篇文章大概率能帮你少走不少弯路。我会把关键元器件、通信方案、软件逻辑、布点细节和真实成本全部摊开讲你照着抄就能搭出七成功能剩下三成根据自己棚的结构微调。1. 我为什么放着现成方案不用偏要自己搭一套监测系统市面上不是没有温室监测的现成设备淘宝上一搜一大把几百到几千的都有。但我试用过几套之后发现几个绕不过去的痛点这也是我决定自己动手的根本原因。1.1 市售温室监测设备的通病数据封闭、扩展困难、价格虚高先说数据封闭。大多数几百块钱的一体机屏幕就那么大看看实时数值还行但数据不导出、不记录过几天就没了。我要的不只是“现在多少度”而是“过去这一周每天夜间的温度曲线”。只有拿到曲线才能判断到底是哪天的操作出了问题导致苗子长得慢。可很多成品设备要么不提供导出要么导出的是加密格式根本没法二次分析。第二是扩展困难。温室的监测需求不是一成不变的。今天只需要温湿度下个月可能想加土壤墒情再过阵子可能要给风机加联动控制。成品设备的传感器接口基本焊死想加一路通道就得换主机。换主机意味着数据格式又变前期积累的记录全废了。第三是价格虚高。一套能测四五个参数、带手机推送的成品系统报价普遍在两千到五千。我不是说这价格完全不合理人家做了外壳、做了APP、做了售后成本确实摆在那。但对于本身就懂点电子和代码的从业者来说这套东西的核心成本其实很低我最后全套做下来物料总价没过六百块。1.2 自建系统的目标拆解核心功能优先级排序动手之前建议别急着买硬件先把需求按优先级排好。我是这么拆的第一优先级环境参数实时采集。空气温湿度、光照强度、土壤湿度这三个是基础中的基础。温湿度决定作物生长的基本环境光照决定光合作用效率土壤湿度决定灌溉时机。第二优先级数据本地记录与曲线展示。采集的数据必须落库而且能按小时、按天回放。这是和淘宝一体机拉开差距的关键。第三优先级异常告警。超温、超湿、断电都要能推送最好是微信或者电话通知而不是本地响个蜂鸣器就完事。第四优先级联动控制。温度高了自动开风机湿度低了自动开喷雾。这一步我放在后面做先把前三点跑通。后来实际开发中我就是按这个顺序推进的。事实证明这个顺序很合理数据采集是一切的地基没有稳定可靠的数据后面所有分析、告警、联动都是空中楼阁。2. 传感器选型的取舍先定精度需求再谈品牌型号传感器是整套系统的眼睛这部分的选型最花时间。我最初的方案用的是DHT22贪图便宜一块多钱一个。后来发现这玩意在温室里就是灾难湿度稍高就直接飘到99%温度误差能有正负两度。果断换成SHT30之后才算稳定但SHT30也不是没有局限它的探头不带防护套直接暴露在棚里不到两个月精度就开始漂。2.1 核心测量参数的方案与精度要求我目前的采集参数一共六路空气温湿度、光照强度、土壤湿度、CO2浓度、配电箱温度、设备箱内温湿度。各传感器的选型逻辑如下参数传感器型号精度/量程选型理由空气温湿度Sensirion SHT30±0.3℃±2%RH长期稳定性好I2C接口价格适中约15元光照强度BH17501~65535 lxI2C接口直接输出光照度无需换算约5元土壤湿度电容式土壤湿度传感器0~100%原理基于介电常数测量不易腐蚀约10元CO2浓度MH-Z19B400~5000ppmNDIR非色散红外寿命长约90元精确度尚可配电箱温度DS18B20-55~125℃单总线协议抗干扰能力强约3元设备箱内温湿度DHT22精度一般放在室外设备箱内不接触高湿环境监测设备箱自身环境这里重点说一下几类传感器的选型原理。空气温湿度SHT30用的是电容式湿度传感器和带隙温度传感器输出经过校准的I2C信号。比DHT22的优势在于它出厂做了湿度校准长期漂移更小。温室这种高湿场景湿度测量比温度更难因为水汽会吸附在传感器表面影响读数。SHT30自带一个覆盖防护膜的型号SHT30-DIS这点很重要如果直接裸露使用传感器的响应速度和精度都会受到很大影响。光照传感器BH1750就是个光电二极管加ADC它输出的是lx勒克斯是人对光强的感知单位其实就是把接收到的光强按人眼灵敏度曲线做了加权。对于温室来说我们需要的是“作物能接收到多少光”lx这个单位虽然不是光合有效辐射PAR光合有效辐射但作为日常监测和趋势判断已经完全够用了。真想测光合有效辐射可以上量子传感器但那个价格就奔着几百上千去了普通大棚没必要。CO2传感器MH-Z19B用的是NDIR非色散红外原理利用CO2分子对4.26μm波长的红外光有特征吸收这一物理特性来测浓度所以不存在电化学传感器那种寿命问题用个三五年没有问题。它的本质就是个红外光源加一个带滤光片的光电探测器开个玩笑说你用光打过去看看有多少被吸收了就能算出浓度。土壤湿度这部分的坑最多。市面上廉价的土壤湿度传感器基本都是电阻式原理是测两个金属探针之间的电阻土壤越湿电阻越小。但探针长期插在土里通直流电会电解几个月就腐蚀了。我用的电容式传感器测的是土壤介电常数原理是土壤含水量不同介电常数就不同电容值随之变化测量端完全和土壤电气隔离寿命长很多。2.2 我踩过的“参数好看实际拉胯”的坑选型的时候光看参数表远远不够。比如DHT22的精度参数写的是±0.5℃听着不错实际拿到手用SHT30做对照同一位置同一时刻它俩能差两度多。后来我仔细研究了一下DHT22的湿度校准是在一个相对理想的环境里做的温室里那种长期高湿环境白天经常90%RH以上晚上凝露它的读数就完全放飞了。还有BH1750标称测量范围0~65535lx听起来很大但实际在正午阳光下直射这个量程根本不够用。大棚里的光照经常飙到80000lx以上BH1750会直接饱和输出卡在65535。所以我加了一个半透明遮光罩相当于给传感器“戴了个墨镜”这样虽然损失了部分量程但避免了饱和。具体的做法是在传感器外面套一个磨砂玻璃管或者用一层半透明的热缩膜包住。2.3 防护等级温室里的传感器为什么经常坏温室对传感器最大的考验是“凝露”。白天棚内湿度高到了晚上温度降下来水汽会直接凝结在传感器表面。水在PCB上只要一通电就是电化学迁移的温床铜箔会被慢慢吃掉最后信号飘得连亲妈都不认识。我的解决办法分几层外层用防水透气膜或百叶箱罩住这是我后来实测下来最有效的方案。温湿度传感器放在一个小型百叶箱里既保证空气流通又防止水汽直接凝结在传感器上。传感器电路板涂三防漆主要保护焊点和铜箔不被高湿环境腐蚀。这个成本很低一罐三防漆十几块钱效果却能延长传感器好几倍的寿命。接线端子用防水型防止水顺着线缆流进连接器内部。再强调一遍温室环境的恶劣程度远超一般室内环境。很多传感器设计时的目标场景是客厅、机房到了温室里这种接近100%RH的环境待上几个月问题就全都暴露出来了。3. 硬件链路怎么搭从电源到无线传输的每一环传感器选好了接下来是硬件架构。这一块的核心问题是数据怎么从传感器传到你的手机/电脑上我的方案是三层结构传感器节点、边缘网关、云端平台。传感器节点采集端 --- 边缘网关汇聚/判断 --- 云端存储/告警3.1 通信方案Wi-Fi、LoRa、4G怎么选先说结论温室内短距离用RS485有线从温室到值班室用LoRa从值班室到云端用4G或Wi-Fi。这是经过实际测试后的最终方案。最开始的方案是用ESP8266Wi-Fi芯片做传输每个传感器节点直接连Wi-Fi上报数据。听起来很直接但实际用起来遇到两个问题一是温室的钢架结构对Wi-Fi信号衰减很大尤其当把节点放在棚顶时信号强度直接掉到-70dBm以下丢包率感人二是ESP8266的供电要求是3.3V稳定电压温室里电压不稳的时候很容易反复重启数据断档。后来我换成了RS485有线连接温室内传感器这个方案稳定得让人安心。RS485是差分信号抗干扰能力强线缆可以拉个几十米没问题。传感器与主控之间用RS485连接用Modbus-RTU协议通信这套组合在工业领域用了二十年成熟度毋庸置疑。温室这种环境虽然也有电磁干扰但RS485完全扛得住。从温室到值班室这一段我用了LoRa模块。LoRa的频率是433MHz穿透能力比2.4GHz的Wi-Fi强得多而且工作在非授权频段不需要交费传输距离在开阔地能有几公里。在温室场景下即使中间隔着几堵墙和钢架也基本不会丢包。网关端用4G模块将数据传到云端不需要依赖农场本地宽带。如果不想折腾4G用值班室的路由器Wi-Fi接物联网云平台也行但前提是农场宽带别断。3.2 电源方案稳定是压倒一切的前提传感器的供电是我踩过比较多的坑之一。用USB充电宝给ESP8266供电两三天就得换一次完全没法用。后来改用12V铅酸电池加降压模块能用一周左右。最后还是从温室配电箱专门拉了一路220V到设备箱箱内放5V和3.3V的DC-DC降压模块这才算一劳永逸。电线上我用了RVV2×1.01.0mm²的铜芯线22V/12V足以带动几十米的传感器链而且压降也小。要注意的是温室里的电线一定要埋管或者走线槽不然容易被老鼠啃这个我在后面单独讲。设备箱里面把220V转12V的开关电源、12V转5V的DC-DC模块、LoRa网关、4G模块都装进去内部再用航空插头引出到各传感器的线缆方便检修。3.3 数据汇聚与边缘网关本地判断比云端更可靠边缘网关的核心职责是“本地判断”。就算云端挂了、4G断网了它仍然能靠本地逻辑来处理数据。因为告警这种事靠云端中转一旦断网就废了所以我把关键告警逻辑放在网关端用代码实现云端只是一个数据存储和展示的地方。我的网关用的是树莓派Zero 2 W价格约100元跑一个Python脚本轮询所有RS485传感器数据同时写本地SQLite数据库和通过MQTT协议推送到云端。局域网内还有一个简易的Web页面直接看实时数据和历史曲线值班室的电脑上打开浏览器就能看。这样即使在断网状态下本地的Web页面也依然能访问数据不丢告警也能通过声光报警器触发。树莓派Zero 2 W的性能虽然不强但跑PythonMosquittoMQTT BrokerSQLite毫无压力。全机功耗大约5V/2A哪怕用充电宝都能带得动。4. 软件平台从数据库建表到告警推送的完整流程软硬件接口这块很多人会忽略一个核心问题你的数据到底存成什么样才能方便后期使用我见过很多朋友的系统单片机往上发数据上位机就直接在界面上显示个数字数据没有落库也不做任何处理这样的系统只能叫“温度计延伸版”不能叫“监测系统”。我的数据流程是采集 → 解析 → 落库 → 判断 → 告警每一步都有明确分工。4.1 数据采集程序的骨架以Python为例我的采集程序运行在树莓派上核心逻辑用Python的modbus库和paho-mqtt库实现。下面是一个精简版的数据采集循环import time import sqlite3 import paho.mqtt.client as mqtt from pymodbus.client import ModbusSerialClient # RS485连接配置 client ModbusSerialClient( methodrtu, port/dev/ttyUSB0, baudrate9600, parityN, stopbits1, bytesize8, timeout2 ) def read_sensor(slave_id, address, length): 从地址address处读取length个寄存器 if not client.is_socket_open(): client.connect() rr client.read_holding_registers(address, countlength, slaveslave_id) if rr.isError(): raise Exception(fslave {slave_id} read error) return rr.registers def main(): while True: try: # 示例读取1号节点的温湿度假设温湿度分别存在0和1寄存器 regs read_sensor(1, 0, 2) temp regs[0] / 10.0 # 精度0.1℃ hum regs[1] / 10.0 # 精度0.1%RH # 写入SQLite conn sqlite3.connect(/data/greenhouse.db) conn.execute( INSERT INTO sensor_log(node_id, temp, hum, ts) VALUES (1, ?, ?, ?), (temp, hum, int(time.time())) ) conn.commit() conn.close() # 推送MQTT mqtt_client.publish(greenhouse/node1/env, f{{temp: {temp}, hum: {hum}}}) except Exception as e: log_error(str(e)) # 错误日志单独记录 time.sleep(30) # 每30秒采集一次 if __name__ __main__: mqtt_client mqtt.Client() mqtt_client.connect(localhost, 1883, 60) main()这段代码是骨架实际用的时候要改的地方是传感器地址映射和寄存器含义。不同厂家的Modbus设备寄存器定义不一样拿到手先看一下寄存器说明确认温度和湿度分别是几号寄存器、精度是几位小数不然读出来的数据完全是乱的。一个注意点SQLite写入和MQTT推送这两步一定要放在异常处理的保护下。我一开始没做异常处理结果某天RS485总线上一个传感器虚焊了整个程序直接崩溃退出数据全部停更但值班室那边还在傻等数据。4.2 阈值告警设计单点超限容易误报组合判断才靠谱告警逻辑是整个系统里最容易被忽视的环节。不少人设置告警就是简单粗暴温度超过35℃就触发。结果夏天白天棚里短时间到35℃是常有的事风扇一转就下来了就频繁推送“高温告警”到了晚上大家都麻木了真正出了问题反而没人看手机。我后来改进成了组合判断模式持续超限告警温度超过35℃并持续10分钟以上才触发告警。这样短暂的颠簸不会打扰人持续超限才说明问题真的存在。速率告警温度在10分钟内下降超过5℃这通常意味着卷帘或者侧窗出了问题冷空气大量灌入。这个条件下比温度绝对值更敏感可以提前发现问题。传感器断连告警任何传感器连续15分钟没有上报数据立刻告警因为数据源失效比数据异常更严重。断电告警在网关前端加了一个UPS检测模块市电断开时检测到断电马上上报。因为没有电系统很快就会失去响应所以这一条告警的触发优先级最高。实现方式我用了简单的状态机# 伪代码示意 state {} THRESHOLD_TEMP_HIGH 35.0 DURATION_TEMP_HIGH 10 * 60 # 秒 def check_temp(node_id, temp, now): if temp THRESHOLD_TEMP_HIGH: if node_id not in state: state[node_id] now # 记录升温起始时间 elif now - state[node_id] DURATION_TEMP_HIGH: send_alert(高温持续超限, node_id, temp) else: state.pop(node_id, None) # 温度回落清除状态这样把“持续条件”和“状态变化”绑定避免了单点触发带来的误报轰炸。4.3 数据为什么必须留原始值后期分析的前提很多系统埋了一个隐患——数据在上行时已经被处理过。比如网关把温度做了平均值平滑、把湿度做了四舍五入结果存到数据库里的是一串“加工过”的数字。这种数据用在实时显示上没问题但用在后期分析上就是个灾难。你想要判断“凌晨两点棚内温度波动率”结果存下来的只有5分钟均值细节全丢了。我的做法是所有原始采样值全部存表另外再建一张5分钟平均值表供日常展示。多存一行成本很低但积攒下来的数据价值却是指数级的。比如冬天的时候我用历史数据算出了最低温度出现的时段规律发现凌晨四点半到五点半棚内温度最低于是把值班师傅的巡棚时间改到了五点通风策略也跟着调整了效果立竿见影。5. 实地部署最大的一道坎温室环境对设备的不友好如果你以为把传感器装好、连线通电、程序跑起来就完事了那只能说运气好。温室环境对电子设备的“敌意”没有亲身经历过的人很难理解。这一章我专门讲部署和调试阶段遇到的问题每一件都是我花钱买来的教训。5.1 高湿和凝露让传感器漂移得莫名其妙我第一版把SHT30直接裸露挂在棚架上结果第9天开始湿度读数就一直在99%到100%之间飘温度也不对劲。排查到最后发现PCB板上的焊点和传感器引脚表面已经蒙了一层水膜电路板轻微漏电导致数据完全失真。解决方案就是我前面提到的给传感器戴上“百叶箱帽子”。我用一个纸质的一次性纸杯在杯壁上扎了十几个通风孔然后倒扣在传感器外面杯底留一个小孔穿线。这个简陋的装置效果出奇的好保留了通风挡住了凝露。后来我在淘宝上买了标准的百叶箱防护罩也就是那种白色带栅栏的小圆盒大概八九块钱一个设计上更规则通风面积更大直接替代了纸杯方案。布一个要点传感器不要贴墙挂也不要直接固定在铁架子上。墙面在夜间温度比空气低贴在墙上测出来的数值偏低铁架子是导热体晴天被太阳晒过之后温度偏高。最理想的悬挂方式是离地面1.5米左右离作物冠层上方20~30厘米周围无遮挡物。5.2 农药雾化和粉尘对采样精度的冲击温室防病虫害需要定期打药农药雾化之后会悬浮在空气中最后沉降到传感器表面。这对湿度传感器的影响尤其大——药液残留在传感膜上响应变慢读数不准。我在黄瓜棚里做过对照实验同样一台设备和备件一台放在打药棚里一台放在不打药的棚里三个月后打药棚里的温湿度传感器精度漂移量是用量的两倍还多。应对方法传感器探头尽量选择带保护膜的型号。SHT30有带防护膜的版本比如SHT30-DIS就是在感湿膜外面贴一层ePTFE材质的防水透气膜农药雾滴进不去水蒸气能进去。这种版本价格贵个几块钱但值得。定期清洁。我按季节维护春夏季打药频繁每个月把百叶箱罩拆下来洗一次传感器表面用软毛刷轻刷。秋冬季打药少两个月一次就好。传感器模块尽量侧装。如果传感器是升级安装的那灰落得极快。侧装能减少粉尘在感湿区域的沉降。5.3 布点位置不同读数差多少同一座温室不同位置的环境参数差异可能超乎你的想象。我做过一次全棚布点测试在一座东西长60米、南北宽24米的标准大棚里按每12米一个节点布了5组传感器连续记录24小时温差最大的时候出现在白天正午东侧比西侧高了3.2℃湿度差达到15%RH以上。原因是夏季太阳照射方向导致棚内受热不均西侧遮阴时间长东西侧环境差异巨大。这就说明了一个问题如果只装一个传感器点你只能知道“棚里某一点”的环境而不是“棚里整体”的环境。除非你的温室很小比如50平米以下否则建议至少分三个布点东、中、西各一个。对于我这种种长条形大棚的就是两边各一头加中间一个。还有一个常被忽略的点棚头门口的气温和棚中间能差出3~4℃因为开门的冷风灌入影响很大。所以如果有条件的把传感器布在中间区域会更具有代表性。6. 成本复盘与给后来者的建议最后聊聊钱。这套系统如果按我最终稳定的配置来算总物料成本写在下面。6.1 一套稳定版系统的物料清单项目型号/说明数量单价元备注主控树莓派Zero 2 W1105或者用香橙派Zero 290元RS485采集模块Modbus RTU温湿度传感器345三路布点用光照传感器BH1750 模块 磨砂罩212棚内、棚外对照CO2传感器MH-Z19B190需注意供电电流土壤湿度传感器电容式218埋在不同滴灌带位置LoRa模块E32-433T20DC233节点端 网关端4G模块EC200S-CN195插物联网卡电源模块220V转12V开关电源 降压模块1套45按实际功率选择防护罩/百叶箱传感器室外百叶箱防护罩39淘宝直接搜线材/线缆RVV2×1.0 屏蔽双绞线若干60根据距离加减其他防水盒、航空插头、端子、导轨若干35动手能力决定成本总计约620元不含调试人工这个价格比市面上两千起步的成品系统低了一大截而且功能完全够用还给了自己后续扩展的自由度。6.2 哪些钱可以省哪些钱绝对不能省先说哪些不用省传感器不要买最便宜的。DHT22那套方案我建议直接跳过省下来的十几块钱会在后期用成倍的时间和精力还回去。电源模块别买杂牌。温室电压波动大电容爆浆、纹波过大导致信号干扰这些事我都遇到过后来换了明纬的开关电源一年多没出过问题。明纬虽然贵一点但那点差价摊到整个生命周期的稳定运行上太值了。防护罩不要省。几百块的传感器都买了几十块钱的防护罩不舍得省下来的结果就是半年后拿着万用表去排查数据漂移问题那才叫烧钱。哪些可以省树莓派可以用香橙派代替。本质上跑Linux跑Python香橙派性能不差价格还便宜兼容性也不错。外壳不用追求极致防水。我的设备箱就是普通的防水接线盒100x68x50mm几块钱一个外面套一个大防水罩目前用了8个月没有进水迹象。4G模块可以先不用。如果棚和值班室在同一个Wi-Fi覆盖范围内直接用Wi-Fi转发到云平台就行。我是因为值班室离棚比较远才额外上了4G。6.3 下一步扩展联动控制是提升效益的关键入口系统跑稳之后我现在正在做第二阶段联动控制。既然监测数据已经有了那“读了数据只发个告警”远远不够最终目的是让设备根据环境自动调整。我在硬件端给树莓派增加了一个8路继电器模块控制排风扇、侧窗电机、喷雾泵、补光灯。联动逻辑分几类温度高于30℃且持续5分钟自动开启排风扇湿度低于40%且光照强度高于20000lx启动喷雾增加湿度温度低于5℃自动关闭侧窗并开启加热设备光照低于10000lx自动开启补光灯限时控制。这套联动逻辑目前正在测试阶段。我的看法是监测是基础联动是增益。真正值钱的是后面可以基于历史数据做温室的“环境决策”比如某个品种的番茄在哪个温湿度区间长得最好这些经验值是从数据里算出来的而不是靠感觉拍脑袋。如果后续有机会我还打算把气象预报数据接入系统做成“超前联动”——天气预报明天要降温今天就提前调整通风策略让棚内温度平滑过夜。这个目标能不能实现另说但至少数据已经攒了半年足够支撑起第一版的预测模型了。回头看看这套系统真正让我觉得值回票价的不是那个夜晚避免了一次冻害而是它让我慢慢改变了管理大棚的方式。原来是“出了问题去补救”现在是“看数据预判趋势”。半夜醒来瞄一眼手机看到每条曲线都走在正常区间就能安心继续睡。这种踏实感是那六百块材料钱买不回来的。