☰
ESP32土壤湿度监测系统实战:从传感器选型到Node-RED可视化
2026/10/3 6:49:34 网站建设 项目流程

放假前我把三盆绿萝浇透水,两周后回来,其中两盆叶尖发黄。不是缺水,是水太多导致烂根。这些年养植物,要么旱死要么涝死,浇水全靠手指戳土,表面干了不代表里面干了,表面湿乎乎的底下的根系可能早就缺水了。后来我给自己定了个目标:做一套IOT土壤监测系统,让数据替我做判断,什么时候该浇水、浇多少,不再靠猜。

这套系统说白了三层:传感器节点负责采集土壤湿度和温度,通过WiFi把数据送出去,然后在一个本地页面上展示实时数值和趋势曲线,顺便在土壤干过头的时候提醒我一声。硬件用了ESP32加几只电容式I2C土壤传感器,软件走MQTT协议,仪表盘用Node-RED搭建,全程没有用任何云平台,数据全部留在本地。这个方案成本不高,一套下来两三百块钱,而且所有零件都能买到现成的模块,不需要自己焊复杂电路。如果你也在搞阳台种植、大棚育苗,或者单纯对物联网采集链路感兴趣,这篇文章里踩过的坑和总结的规律,应该能帮你少走不少弯路。

1. 为什么我要做这套系统:浇水问题背后的真实需求

1.1 手指戳土法为什么总是不靠谱

先聊一个扎心的现实:绝大多数人判断土壤干湿用的是"手指戳土法",指尖往下探一截,觉得干了就浇水。但这个方法有两个先天缺陷。

第一,土壤水分不是均匀分布的。花盆表面那两三厘米晒得发白,底下五六厘米可能还是湿的;反过来,表面看起来正常,根系层因为排水不畅早就积水了。手指能探到的深度有限,你摸到的永远是表层状态,而植物真正依赖的是根区的湿度。第二,不同深度、不同位置的土壤含水量差异很大。同一个花盆,向阳面和背阴面、盆边和盆心,蒸发速度和根系密度完全不同,只摸一处根本代表不了整体。

我做过一个测试:同一盆土,分别在表层0~2厘米、中间5厘米、底部10厘米放了三只传感器,测出来的容积含水量分别是28%、46%、61%。表层看着快要干透,根系层却还有充足水分。如果这时候听表层的,一瓢水下去,底部就会积涝。这套数据让我彻底信服了一个结论——不测量就没有判断依据,靠体感和经验只能得到一个"模糊的平均状态"。

1.2 数据要回答的问题,远比"该不该浇水"多

设计了这套系统之后我才发现,一个土壤监测系统真正有价值的地方,在于它能回答一串连续的追问:

  • 当前土壤含水量到底是多少?这是最基础的,需要实时数值,而不是"有点干""还行"这种模糊描述。
  • 湿度变化的趋势是往上还是往下?浇水之后土壤含水量应该快速上升再缓慢下降,如果浇完水数值纹丝不动,说明水根本没渗进根系层,土可能板结了。
  • 一次浇水能维持多久?记录每次浇水前后的数据,就能算出这盆土在当前的季节、光照条件下,大概几天需要补一次水。出门在外前,这些数据对安排托管浇水特别有用。
  • 连阴天和大太阳天的蒸发差异到底有多大?天气预报对植物的影响通过土壤湿度曲线看得一清二楚。

我在项目边界上也做了一个明确取舍:这套系统只做监测和预警,不做自动浇灌。自动灌溉涉及电磁阀、水泵、管道和漏水保护,故障面一下子变大了很多。先老老实实把数据链路跑通,让数据指导人去浇水,比一开始就搞全自动靠谱得多。

2. 传感器和主控选型:这些坑在图纸阶段就该避开

2.1 电容式还是电阻式:一个决定寿命的问题

市面上常见的土壤湿度传感器分两大类:电阻式和电容式。如果你去电商平台搜土壤传感器,几块钱甚至一两块钱一个的就是电阻式的,十来块以上的多半是电容式,很多还带I2C接口。

电阻式传感器的原理很简单:两根金属探针插进土里,利用土壤作为电阻,湿度越高导电性越好,测到的电压就越低。听起来合理,但实际用起来问题很大。土壤中的水分并非纯水,而是含有各种盐类的电解质溶液。当直流电通过探针持续流过电极时,会发生电解反应,金属离子被慢慢析出,探针几个月内就会腐蚀发黑,读数逐渐漂移,最后干脆没法用。我自己用坏过好几个,都是同一个死法:读数越来越高,取出来一看探针已经锈得不像样了。

电容式传感器走的是另一条路。它不直接接触土壤导电,而是把一圈铜箔包裹在防护层里,利用土壤作为电介质的介电常数变化来感知水分。空气的介电常数大约是1,干土大概在3~5,而水的介电常数高达80。土壤里水分越多,整个电容值变化就越明显,电路把这种电容变化转换成频率或电压变化,再经过ADC变成数字值。因为探针不参与导电,就没有电解腐蚀问题,寿命比电阻式的长很多。虽然不能像专业仪器那样精确到绝对含水量,但作为趋势监测完全够用。所以我的结论很干脆:别省这几块钱,电容式是底线。

2.2 为什么选ESP32而不是Arduino

主控这块我一开始纠结过:Arduino Uno家族最普及、资料最多,但它是5V逻辑电平,板上没有无线模块,要联网就得外挂ESP8266或者串口WiFi模块,两条板子之间还得做电平转换,接线和调试都很繁琐。ESP32就不一样了,3.3V逻辑,WiFi和蓝牙都是内置的,双核160~240MHz,处理MQTT协议绰绰有余,价格跟一块Arduino板子差不多。更重要的是ESP32支持深度睡眠(deep sleep),这对以后想用电池供电的户外场景是刚需。所以我最终选了ESP32开发板,具体是ESP32 DevKitC那种最常见的板子,IO口够用,插上USB线就能烧录。

2.3 I2C版传感器到底比模拟版好在哪

土壤传感器接口又分两种:模拟输出和I2C数字输出。

模拟输出的传感器(比如老款YL-69、DFRobot SEN0193)只有一个模拟电压引脚,接到主控的ADC上,由主控自己完成模数转换和映射。这种方案便宜、代码直观,但有个现实问题:每只传感器要占一个ADC引脚,板上ADC还可能有精度差异,接多路得数引脚、走线,很折腾。另外模拟量在长距离传输时非常容易受干扰,线稍长一点读数就飘。I2C版本把ADC芯片集成在模块内部,土壤的模拟信号在探头端就已经被量化成数字,通过SDA/SCL两根线走I2C总线传输,抗干扰能力好得多,而且一条总线上最多可以挂几十个同地址的设备(只要解决地址冲突),扩展起来特别方便。我做了一个表格供你参考:

对比项电阻式模拟版电容式模拟版电容式I2C版
售价3~8元8~15元15~40元
寿命短,容易电解腐蚀长长
接线VCC/GND/AOUTVCC/GND/AOUTVCC/GND/SDA/SCL
多路扩展占ADC引脚占ADC引脚总线挂载,改地址即可
抗干扰弱弱强
精度低中中,且数字输出

多路扩展这里有一个特别容易忽视的坑:同型号I2C传感器的默认地址都一样,比如重型模块常见的是0x20或者0x22,两只一模一样的探头直接挂同一根总线上,I2C通信会冲突,什么都读不出来。解决办法有几条路:一是买那种带地址拨码开关的模块,通过拨码改地址;二是利用模块的某个引脚接不同的电平来切换地址;三是实在不行就分时供电——每次只给一只探头通电,测完再给另一只通电,把"同时在线"变成"轮流在线"。我最终用的是第三种方案,代码里按顺序给每个传感器上电、读取、断电,逻辑简单,还顺便解决了省电问题,一举两得。

3. 布线、布点和电源设计:决定读数可信度的细节工程

3.1 探头安装姿势:别把整个模块埋进土里

很多人拿到传感器直接往土里一插就完事了,我一开始也这么干,结果第一批探头读数越来越怪。问题出在安装方式上——模块的电路板部分沾上水和泥土后,焊盘很快就爬上了电解质,导致漏电流。

正确做法是:只有探针部分入土,电路板露在外面,悬空固定在花盆边缘或支架上。如果是室外场景,电路板要做好防水处理,用热熔胶封边或者干脆把模块装进一个小防水盒里,只让探针伸出来。接线端子千万别裸露在可能溅水的位置,我用的是带O型端子的防水航空插头,虽然成本高一点,但野外雨天是真能救命。埋探针的时候注意别太贴盆壁,盆壁附近水分蒸发最快,读数偏移明显;也别和根系缠在一起,换盆翻土的时候容易扯断线。理想位置是植物根系的活跃区域外围,探针水平朝上或略微倾斜埋在土里,深度约5~8厘米。

3.2 测量时序:供电与采样必须分离

这是我从第一版固件里踩出来的教训。最初我把所有传感器的VCC直接接在ESP32的3.3V电源上,测量的时候直接发起I2C读操作,结果是数据波动特别大,同一个探头在同一状态下,连续读出的数值能差上几百个原始值。

原因不难理解:传感器内部ADC工作时需要稳定的基准电压,而ESP32的3.3V在WiFi发射的时候会有明显压降和纹波。I2C读取瞬间恰好碰上WiFi射频开关,读数就被污染了。解决方案是把传感器电源单独控制,测量前先稳定供电,读完立刻断电。具体做法是用一个ESP32的GPIO引脚控制MOS管或直接用高电平驱动的三极管开关,把传感器VCC接在开关后面,只在采样前的500毫秒内打开电源,让内部电路充分稳定后再发起I2C读取,读完之后关闭电源。这样做还有个额外好处:不采样的时候传感器完全断电,电流损耗趋近于零,整机功耗被压下去一大截。

时序大致是这样的:从深度睡眠唤醒 → 打开WiFi并连接到路由器 → GPIO拉高给传感器供电 → 延时500毫秒 → 发起I2C读取 → 关闭传感器电源 → 通过MQTT发送数据 → 进入下一轮深度睡眠。整体一轮耗时不到10秒,和过去一直通电的工作方式相比,功耗下降了至少一个数量级。每次测量时WiFi是关还是开,最好固定下来:先开WiFi再读传感器,或者先读再开WiFi都行,但别在读取过程中让WiFi做重活,否则采样窗口里的读数容易带杂音。

3.3 为什么一个测量点不够

单只传感器代表不了整片土壤。我的花盆直径30厘米,单测一个点的时候,读数一会儿高一会儿低,后来才知道那是盆内空间不均匀造成的。不同位置的土质紧实度、根系密度、光线照射角度都不一样,湿度曲线差异能到10个百分点以上。

后来我在每个监测单元上挂了3只传感器:两只在根系活跃区两侧对称位置,一只放在盆底排水孔上方的土壤里,用来判断盆底是否积水。读数上报的时候,我会在Node-RED里对三路数据做平均和极差统计,如果三只探头的数据差异超过15%,我会收到一条提示消息——那通常意味着浇水不均匀或者局部积水了,比单纯看平均值有价值得多。多探头布点,本质是用冗余换可靠性。

3.4 电池和太阳能供电的计算思路

如果传感器布在户外,拉电源线是很麻烦的,我选择了电池加太阳能板的方案。电池用一节18650锂电池,容量约2400mAh;充电用TP4056模块,最大充电电流设为500毫安;太阳能板选6V 2W的单晶小板,足够在晴天维持充电。先说功耗估算:ESP32深度睡眠电流约10微安,几乎可以忽略;每次唤醒后WiFi连网加发送数据最长耗时约6秒,期间平均电流约120毫安(WiFi峰值瞬时能到300毫安,但平均下来没那么夸张)。按15分钟采样一次计算,一个周期平均电流大概是120mA x 6s / 900s + 0.01mA ≈ 0.81mA。周期长度翻倍,平均电流还能再减半。2400mAh ÷ 0.81mA ≈ 2962小时,大约123天。当然实际运行会打折扣,因为WiFi重试、电池自放电、低温影响都会吃一部分容量,但按这个量级去配太阳能板,日均充电量远大于放电量,连续多云天撑一周也没问题。这里有个经验:测量间隔不要低于10分钟,再密集的采样对园艺场景没什么意义,只会白白消耗电池和网络流量;如果场景固定,间隔1小时都够用。

4. 固件端逻辑:从原始ADC读数到一条可靠的消息

4.1 I2C读取的代码骨架

固件这部分我用的Arduino框架。需要说明的是,市面上的I2C电容式土壤传感器没有一个统一的寄存器标准,每个厂家定义的数据地址和格式都可能不同,所以代码里那几行寄存器地址一定要以你自己买的那块模块的说明书为准。下面这段代码的逻辑是通用的:先通过I2C总线向探头内部寄存器发起读取请求,把返回的字节拼成一个16位无符号整数。

#include <Wire.h> #include <WiFi.h> #include <PubSubClient.h> #define SOIL_I2C_ADDR 0x20 // 根据模块实际地址修改 uint16_t readSoilRaw() { Wire.beginTransmission(SOIL_I2C_ADDR); Wire.write(0x00); // 寄存器首地址,按模块文档修改 Wire.endTransmission(false); Wire.requestFrom(SOIL_I2C_ADDR, (uint8_t)2); uint16_t raw = 0; if (Wire.available() >= 2) { uint8_t hi = Wire.read(); uint8_t lo = Wire.read(); raw = (hi << 8) | lo; // 高字节在前 } return raw; }

要注意一个问题:有些模块的字节序是低位在前,有些是高位在前。怎么判断?把探头拿到空气中读一个值,关掉再开电源,再读一次,如果两次读数差距很大,说明你的拼接顺序错了,交换高低字节试试。这类"对着手册确认字节序和寄存器地址"的工作,在I2C设备调试里是没办法跳过的,占了我当时一大半的排错时间。

4.2 从原始值到百分比:两点映射法

读到的原始值只是一个无量纲的ADC数字,可能落在0~2000区间,可能落在0~65535区间,看芯片的ADC位数。它本身没有物理意义,要变成"土壤含水率百分比"就需要标定映射。一般做法是最简单的线性两点映射:分别测出干土时的原始值和饱和泥浆时的原始值,然后用线性插值算出百分比。

公式长这样:

干土基准值 dryBase = 在充分晾干的土里测得的原始值 饱和基准值 wetBase = 在吸水饱和的泥浆里测得的原始值 含水率% = 100 * (dryBase - 当前原始值) / (dryBase - wetBase)

注意方向问题:我用的电容式模块是湿度越大,原始读数越低(干土读数高,湿土读数低)。如果你的模块方向相反,把分子改成当前原始值 - dryBase就行。算完之后最好用约束函数把结果限制在0~100之间,因为极端情况下的读数可能越界:

float moisturePercent = 100.0 * (dryBase - raw) / (dryBase - wetBase); moisturePercent = constrain(moisturePercent, 0.0, 100.0);

为什么不用网上那些所谓"万能公式"直接换算?因为每只探头内部电容的初始值、出厂校准偏差都不一样,同型号探头插在同一盆土里,原始读数可能差出几百。硬套别人公式的结果,就是仪表盘上的数值和实际手感完全对不上。每只探头单独标定一次,5分钟的事,效果天差地别。具体标定步骤我在第6章详细说。

4.3 MQTT消息设计和发送策略

数据采集好之后,下一步是发出去。我用MQTT协议,broker跑在一台树莓派上,topic格式为soil/field1/node01/readings,按"地点/区域/节点/数据类型"分层命名,这样以后加传感器节点就不需要改动任何接收端逻辑。

JSON消息内容大概长这样:

{ "device": "node01", "ts": 1692000000, "moisture": 42.3, "soil_temp": 23.1, "battery": 3.87, "rssi": -61 }

发送的时候有两个细节值得注意。第一,MQTT的QoS用1(至少一次)就够,丢包的话重发,但别上QoS 2(只传输一次),那套握手机制在弱信号环境下会加重网络负担。第二,发布时把retain标志位设为true。这样新上线的仪表盘或订阅端,可以马上从broker拿到每台传感器最近一次的状态,不用等下一次上报才能看到数据,这个体验差异很大。

char payload[160]; snprintf(payload, sizeof(payload), "{\"device\":\"node01\",\"ts\":%lu,\"moisture\":%.1f,\"soil_temp\":%.1f,\"battery\":%.2f,\"rssi\":%d}", (unsigned long)time(nullptr), moisturePercent, soilTemp, batteryVolt, WiFi.RSSI()); client.publish("soil/field1/node01/readings", payload, true);

WiFi断线重连的逻辑也要写稳。我用WiFi.setAutoReconnect(true)加定时检查,在loop()里每10秒测一次:如果WiFi.status() != WL_CONNECTED,就主动执行WiFi.reconnect();MQTT那边同样,client.connected()返回假就重连。不要在主程序里做长延时阻塞,用millis()计时器和轮询的方式组织代码,才能让重连逻辑及时响应。

5. 数据接收端与可视化:不写前端也能看得懂数据

5.1 MQTT broker选型:树莓派上的轻量方案

数据发出来总得有人收。我选择在树莓派4B上运行Mosquitto作为MQTT broker。运行非常简单,一条命令安装,改一行配置允许匿名访问(内网环境下),然后订阅topic就能看到数据流:

sudo apt install mosquitto mosquitto-clients -y mosquitto_sub -h 127.0.0.1 -t 'soil/#' -v

为什么不用云平台?虽然阿里云、AWS IoT之类的平台功能很全,但免费层有限制,数据不在自己手里,而且公网传输物联网数据需要考虑安全的管道和证书认证,对个人项目来说复杂度有点高。家庭内网环境里跑一个本地broker,数据全在局域网内流动,快、稳、没有月费。真要远程查看数据,可以用内网穿透或者搭建一个带密码的MQTT加Web仪表盘网关,不过那是另一篇文章的话题了。

5.2 Node-RED+Dashboard:最小可用的可视化方案

仪表盘我用的是Node-RED,理由很实在:它在树莓派上安装方便,可视化流程拖拽节点就能编写逻辑,不需要懂前端三件套。数据流很简单:mqtt in节点订阅soil/#主题 →json节点解析payload →split节点按设备拆分 → 分别存入SQLite节点做历史记录,同时把实时值传递到chart节点和gauge节点展示。

仪表盘上我放了两种类型的卡片:每台传感器的实时含水率用仪表盘显示,最近24小时的湿度曲线用折线图显示。折线图的y轴范围固定为0~100%,这样一眼就能看出水分变化的绝对幅度,不会因为图表自适应缩放产生错觉。这一点很容易被忽略——折线图如果不固定坐标轴,看起来波动很大很吓人,其实只是5个百分点的变化。

历史数据我用SQLite存储,每个设备一张表,只存时间戳和含水率。查询最近7天的曲线,SQL写五行就够了;出远门前看一眼趋势,大概就知道这盆花还能撑几天。

5.3 阈值告警:从被动看图到主动提醒

光有可视化还不够,数据得在关键时刻"叫"人才有用。我在Node-RED里叠加了一个简单的判断逻辑:根据植物类型和季节设定下限阈值和上限阈值,实测数据低于下限时发送一条消息到手机上的通知应用(我用的Pushover和Bark双通道),提示该浇水了;高于上限时提示可能过湿,需要停止浇水并检查排水。阈值不是写死的,我把它们放在几个Dashboard的输入框里,直接在页面上拖滑条就能调整。这个设计让我在不同植物、不同季节切换时不需要进后台改代码。

这里还要提一个必须注意的地方:阈值告警要设置"持续超标"而不是"一次超标"立即触发。不然植物浇完水后数据短暂波动一下,通知就轰炸一遍,烦得很。我在Node-RED里加了一个窗口逻辑:连续三次采样都低于阈值才触发告警,每次告警后至少4小时不能再重复报警。这个改动看似简单,直接决定了这套系统是"好帮手"还是"烦人精"。

6. 校准实务:便宜传感器能不能信,取决于你做了什么

6.1 干土基准和饱和基准的具体标定方法

很多买了电容式土壤传感器的人,发现读数跟实际差距很大,就直接下结论说这种传感器是垃圾。其实绝大多数是没做标定的问题。便宜传感器是可以用的,前提是每只探头单独标定。具体做法如下:

第一步,测干土基准值。拿一份普通园土,在通风处自然晾晒三天以上,或者用烤箱80℃烘烤几小时(注意别引燃有机物),让土壤达到尽可能干的状态。把探头插进干土,等读数稳定,记录连续10次测量的平均值,这就是干土基准值。我在环境温度25℃左右测的一组数据是原始读数1980左右。

第二步,测饱和基准值。把同一份土壤加水拌成饱和泥浆,水加到泥浆表面微微渗水但探针区域完全被湿土包裹的状态。静置半小时让水分均匀渗透,再读取10次平均值。我在同样条件下测到的是520左右。

第三步,记录标定参数。把每只探头的干基、湿基两个值烧录进固件配置文件,或者写在一个小纸条上贴到模块旁边。千万不要试图把所有探头用同一组参数。我实测过三只同型号新探头,干土读数最大差到400多,换算成含水率能差出20个百分点,这个误差足以让整个监测系统失灵。

6.2 温度漂移:低成本补偿做法

电容式传感器的另一个现实问题是温度影响介电常数。水温、土温变化会导致同样含水量的土壤读数出现波动,冬天夏天同一个探头读数能差几个百分点。解决思路有两个层次。如果是精度要求不高的趋势监测,直接忽略温度漂移,只要标定时的环境温度跟使用温度差距不太大,偏差都在可接受范围内。如果追求更稳定,就在探头附近加一个DS18B20或者把模块自带的环境温度数据一起上报,然后在软件里做线性补偿:根据实测结果,以25℃为基准,每偏离1℃修正0.2个百分点。这个系数我自己在户外测出来的,具体到你的土壤类型和传感器型号可能有差异,但思路是一样的——记录温度和湿度数据,后期用软件修正历史曲线,不要在硬件上较劲。

6.3 探头个体差异与重复性测试

标定做完之后还有一个步骤经常被跳过:重复性测试。把同一只探头从土里拔出再插回原处,连续读取20次,记录最大最小值,如果波动超过5个百分点,说明要么接线接触不良,要么探头本身已经老化,数据可信度就很低了,需要重新插拔检查或者更换。

我自己的记录:新探头重复性波动大概在±1.5个百分点,用了半年后波动扩大到±4个百分点左右。这不是说传感器坏了,是内部电路老化加探针表面污损累积导致的。定期把探头取出来,用软毛刷和清水清理探针表面的盐垢,能明显改善重复性。

6.4 别被"相对值"骗了

最后强调一个容易误读的地方:经过两点映射得到的百分比只是该探头的相对含水率,不是严格意义上的土壤容积含水量(VWC)。它和标准仪器测出的绝对VWC之间可能差几个百分点,但趋势曲线和数据变化规律是高度一致的。对个人植物养护场景,我要的是"现在比上周干了多少""浇完水多久渗透到根区",这些相对变化才是决策依据。如果你的目标是给科研或精准农业提供精确的绝对含水率,预算至少得翻十倍以上,考虑专业级的FDR传感器或张力计,而不是这种百元以内的模块。

7. 长期运行的经验:稳定跑过两个种植季后我的几个建议

7.1 OTA升级:改代码不用拆传感器了

探头埋在土里之后,固件更新如果都要拆下来接线,体验会非常糟糕。我第一版系统就是每次改代码都要把传感器从土里拔出来、打开盒子、连上USB线烧录,一个星期折腾两三次就想弃坑了。后来我加了OTA(Over-The-Air)无线升级,用Arduino自带的ArduinoOTA库,几十行代码就能实现。核心要点是:OTA的鉴权密码一定要设,这玩意儿默认不设密码的话,局域网里任何人都能往你的板子里刷固件。设置了密码之后,每次改完代码选择网络端口烧录,一分钟搞定,完全不用碰硬件。

还有一个坑必须提醒:OTA升级不是一劳永逸的,如果固件本身有让WiFi反复重启的bug,升级过程中设备断了,板子会处于半砖状态。所以新固件先在自己本地的板子上测一遍,再推给正在运行的系统。

7.2 定期校准:半年不做,数据就慢慢失真

土壤传感器是消耗品,即使电容式的寿命比电阻式长很多,长期埋在潮湿土壤里还是会老化和漂移。我现在的维护节奏是每季度一次:

  • 取出所有探头,清理探针表面的盐垢和泥土;
  • 在空气里测一次读数,对比新探头的空气基准值,如果偏差超过数组记录值的10%,就需要重新标定;
  • 重新做干土和湿土两点标定,更新固件配置;
  • 检查电池电压、太阳能板表面灰尘、接线接头是否有松动。

这个维护流程看起来很琐碎,但实际上每次只需要半小时,却能保证仪表盘上的数据一直靠谱。监测系统的价值建立在数据可信度之上,数据一旦失真,整套系统就变成了昂贵的摆设。

7.3 常见故障的排查顺序

跑了两个种植季,我总结了一套标准的故障排查顺序,遇到问题从前往后试,基本不慌:

现象大概率原因排查方式
所有传感器都不上报WiFi掉线或MQTT broker挂了先看树莓派上mosquitto_sub能不能收到,再检查设备端WiFi信号
单个节点数据断断续续节点电池电压过低登录broker查消息,看battery字段是否低于3.3V
单个探头读数突然暴涨探针污损或线头接触不良清理探针、重新插拔接头
读数持续缓慢漂移探头老化,需要重新标定取出来做干湿两点标定
空气中读数异常大I2C总线冲突或字节序不对检查地址冲突,交换高低字节试验

其中低压问题出现最频繁。ESP32在板载稳压器工作正常的情况下,3.3V输出在输入降到3.6V以下就开始不稳,WiFi连接失败率直线上升。我在代码里对电源电压做了监测,每次上报都带电池电压字段,低于3.55V就在仪表盘上显示红色警告,提醒该充电或者检查太阳能板了。

7.4 谨慎扩展自动灌溉功能

很多人在做实数据监测后,下一步就想加自动浇水。我的看法是不要急。自动灌溉看着简单,其实涉及水泵启停、电磁阀、滴灌管路、漏水保护、停电恢复策略,任何一个环节掉链子,都是整个花盆被淹或者植物干死的代价。真要上自动灌溉,先做几个保障:一是电磁阀和水泵的启停必须能在本地手动切换和远程手动控制;二是每次自动浇水前检查排水是否通畅,连续雨天要自动跳过浇水;三是所有浇水事件都要记录日志。我自己现在还是手动浇水,但会根据系统提示选择浇水量,这是风险和收益最平衡的状态。

7.5 用了一年以后,这套系统到底值不值

说点主观感受。数据监测系统真正改变的不是我浇水的动作,而是我对"土壤状态"的认知方式。以前浇水是凭感觉的赌博,现在看到湿度曲线缓慢下降到一个阈值,心里很有底地给花浇水;出门前看一眼趋势曲线,就知道哪盆需要临行前补一次水,哪些盆不用管。这种确定性,是花几百块钱和几个周末的时间换来的。如果你也想做一套,我建议先从一个节点、两只探头开始,跑通数据链路再做扩展,别一开始就追求大而全。技术的价值在于解决问题,不在于设备数量多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询