拓冰建站拓冰建站
首页 / 资讯中心 / 正文

基于Agrumino与模拟传感器的低成本智能土壤湿度监测系统搭建指南

1. 项目概述为什么我们需要更聪明的土壤湿度监测在阳台种菜、打理花园或者管理一个小型温室时最让人头疼的问题之一就是浇水。浇多了植物烂根浇少了又容易干死。传统的“看天浇水”或者凭手感对于番茄、草莓这类对水分敏感的作物来说风险太高。我折腾过不少土办法比如插根筷子看干湿或者买那种几十块钱带个简易显示屏的土壤湿度计但问题一大堆要么读数不准要么数据没法记录更别提远程查看了。直到我开始尝试将开源硬件和模拟传感器结合起来才真正找到了一个低成本、高灵活度且数据可追溯的解决方案。这个项目的核心就是利用Agrumino这块专为农业物联网设计的小板子搭配经典的模拟量土壤湿度传感器构建一个智能化的土壤墒情监测节点。它不仅仅是简单读个数而是能实现数据的本地显示、无线传输、云端存储甚至为未来的自动灌溉打下基础。无论你是园艺爱好者、家庭种植者还是从事小型农业或教育研究这套方案都能让你以极低的门槛迈入精准农业的大门。接下来我就把自己从硬件选型、电路连接、代码编写到数据可视化的完整搭建过程以及踩过的那些坑毫无保留地分享出来。2. 核心硬件选型与设计思路拆解2.1 为什么是Agrumino它的独特优势在哪里市面上常见的物联网开发板很多比如ESP8266、ESP32它们功能强大且通用。但我最终选择Agrumino Lemon这是其具体型号作为本项目的主控是经过深思熟虑的主要看中了它“开箱即用”的农业物联网特性。首先高度集成省时省力。Agrumino在一块板子上集成了ESP32微控制器负责核心计算与Wi-Fi连接、一个0.96英寸的OLED显示屏、一个用于测量环境光强度的光照传感器、一个DS18B20温度传感器接口以及最重要的——一个专门用于连接“柠檬状”土壤湿度传感器的接口本质上是模拟输入和电源控制。这意味着要实现一个具备显示、温湿度监测、联网功能的节点我们几乎不需要额外焊接和连接杂乱的杜邦线大大降低了硬件搭建的复杂度和故障率。其次专为低功耗设计。农业监测设备往往需要长期在户外部署电池供电是常态。Agrumino的固件和硬件设计充分考虑了这一点支持深度睡眠模式。我们可以编程让设备每隔一段时间例如30分钟唤醒一次采集传感器数据并上传然后继续睡眠从而将电池续航从几天延长到数月。这对于太阳能电池板锂电池的离网部署方案至关重要。最后强大的软件与社区支持。Agrumino拥有完善的Arduino库和示例代码其内置的AgruminoWebThing服务可以快速将设备数据以标准Web Thing API形式暴露方便与Home Assistant、Node-RED等智能家居平台集成。社区也积累了丰富的应用案例。当然它价格比裸ESP32模块贵一些但考虑到节省的时间、集成的传感器和稳定性对于专注农业应用的开发者来说这笔投资是值得的。2.2 模拟传感器 vs. 数字传感器一个关键的选择土壤湿度传感器的选择是项目的另一个核心。市场上主要分两大类模拟量输出和数字量输出。我这次选用的是最常见的电容式模拟土壤湿度传感器型号如FC-28或其兼容版本。它的工作原理是传感器上的两个电极构成一个电容土壤作为电介质其含水量变化会导致电容值变化进而转化为0-Vcc通常是3.3V或5V之间的模拟电压信号。输出电压越高土壤越干燥输出电压越低土壤越湿润。选择它的理由很直接成本极低、接口简单、技术成熟。一个模块通常不到10元人民币。我们只需要将其VCC、GND连接到Agrumino并将信号线AO连接到Agrumino的任意一个模拟输入引脚如GPIO32、GPIO33等即可。读取的值是一个0-4095ESP32的ADC为12位的原始数值通过一个简单的映射公式就能换算成百分比湿度。但它也有明显的缺点这也是需要特别注意的地方电解腐蚀问题老式的电阻式传感器通过测量土壤电阻会因电极电解而快速腐蚀。电容式虽有所改善但长期埋在土中电极仍会氧化。因此它不适合7x24小时持续通电监测。最佳实践是间歇性供电仅在需要读数时通过Agrumino的一个数字引脚如GPIO4控制传感器电源读数后立即断电。这能极大延长传感器寿命。需要校准传感器读数受土壤类型沙土、黏土、壤土、盐分含量、紧实度影响极大。出厂值“0-100%”只是理论范围。必须针对你的具体土壤进行校准才能获得有意义的百分比数据。精度限制作为模拟传感器其读数易受电源电压波动、导线长度干扰。对于科研级精度要求可能需要选择更专业的频域反射FDR或时域反射TDR传感器但那些价格昂贵。相比之下数字传感器如一些I2C接口的传感器通常集成了信号处理芯片输出经过校准的数字值抗干扰能力更强但价格也更高且灵活性可能不如模拟传感器自定义校准。注意无论选择哪种传感器长期土壤监测都要面对一个现实没有传感器是“永久”的。定期如每季度或每半年检查并清洁或更换传感器探头是保证数据可靠性的必要维护。3. 硬件连接与电路搭建详解3.1 Agrumino与传感器的物理连接Agrumino Lemon的引脚布局非常清晰。对于本项目我们需要连接的有模拟土壤湿度传感器VCC- 连接到Agrumino的VIN引脚或一个可通过程序控制的GPIO引脚如GPIO4。我强烈推荐后者以实现间歇供电。GND- 连接到Agrumino的任一GND引脚。AO模拟输出- 连接到Agrumino的GPIO32或其他空闲的模拟输入引脚如GPIO33、GPIO34、GPIO35、GPIO36、GPIO39。注意ESP32的GPIO34、GPIO35、GPIO36、GPIO39仅能作为输入非常适合接传感器。电源Agrumino可以通过Micro-USB接口供电也可以通过其底部的电池接口连接一块3.7V锂电池。对于户外部署建议使用“太阳能充电控制器18650锂电池组”的方案将控制器的输出接到Agrumino的电池接口。OLED显示屏已经集成在板子上无需额外连接。接线示意图文字描述模拟土壤湿度传感器模块 VCC --- Agrumino GPIO4 (用于电源控制) GND --- Agrumino GND AO --- Agrumino GPIO32 (用于读取模拟值) Agrumino自身通过USB或锂电池供电这种接法允许我们通过程序将GPIO4设置为高电平来给传感器供电读取数据后再设置为低电平断电。3.2 避免常见硬件坑电源与信号稳定性在焊接或使用杜邦线连接时有几个细节决定了项目的稳定性电源去耦尽管Agrumino板载了稳压电路但在传感器电源控制引脚GPIO4附近最好并联一个0.1uF的陶瓷电容到地以滤除数字开关引起的瞬间电压毛刺为传感器提供更干净的电源。这对于提高ADC读数稳定性有奇效。信号线保护如果传感器需要通过较长导线0.5米连接到Agrumino信号线AO容易引入干扰。可以尝试使用双绞线或屏蔽线。在Agrumino端的信号输入引脚GPIO32与GND之间并联一个100pF的小电容作为低通滤波器滤除高频噪声。在代码中采用多次读取取平均值的算法来软件滤波。ADC参考电压ESP32的ADC参考电压默认是它的供电电压VDD通常3.3V。如果电池电压随着放电从4.2V降到3.0V这个参考电压是不稳定的会导致ADC读数漂移。Agrumino使用了独立的稳压芯片为ESP32核心供电所以这个问题不严重。但对于极致精度要求可以使用ESP32的analogReadMilliVolts()函数直接读取毫伏值或者使用板载的VREF引脚如果有作为外部基准。4. 软件环境配置与核心代码解析4.1 开发环境搭建与库安装我们使用Arduino IDE进行开发。首先需要添加Agrumino的板支持打开Arduino IDE点击“文件”-“首选项”在“附加开发板管理器网址”中添加https://raw.githubusercontent.com/agrimo/Agrumino/master/package_agrumino_index.json点击“工具”-“开发板”-“开发板管理器”搜索“Agrumino”找到并安装“Agrumino by Agricoltura Aperta”。安装完成后在“工具”-“开发板”中选择“Agrumino Lemon”。还需要安装以下库“工具”-“管理库...”中搜索安装Agrumino官方的核心库。WiFiESP32内置通常已包含。ArduinoJson用于处理JSON数据如果涉及HTTP上传。PubSubClient如果需要连接MQTT服务器如Home Assistant。U8g2或Adafruit_SSD1306用于驱动OLED屏Agrumino库可能已封装但了解其原理有帮助。4.2 核心代码流程与关键函数下面是一个精简版的核心代码框架包含了传感器控制、数据读取、OLED显示和深度睡眠。#include Agrumino.h #include “esp_sleep.h” // 用于深度睡眠 // 引脚定义 #define SENSOR_POWER_PIN 4 // 控制传感器电源的GPIO #define SOIL_MOISTURE_PIN 32 // 土壤湿度传感器模拟输入引脚 // 校准参数必须根据你的土壤和传感器实测调整 #define AIR_VALUE 3200 // 传感器在空气中读取的原始ADC值干燥 #define WATER_VALUE 1200 // 传感器完全浸入水中读取的原始ADC值湿润 Agrumino agrumino; void setup() { Serial.begin(115200); agrumino.begin(); // 初始化Agrumino板载功能 pinMode(SENSOR_POWER_PIN, OUTPUT); digitalWrite(SENSOR_POWER_PIN, LOW); // 初始确保传感器断电 pinMode(SOIL_MOISTURE_PIN, INPUT); // 连接Wi-Fi此处省略具体代码可参考Agrumino示例 connectToWiFi(); // 执行一次测量和上传 takeMeasurementAndUpload(); // 进入深度睡眠定时器唤醒例如30分钟 const int sleepMinutes 30; esp_sleep_enable_timer_wakeup(sleepMinutes * 60 * 1000000ULL); // 微秒 Serial.println(进入深度睡眠...); esp_deep_sleep_start(); } void loop() { // 由于使用了深度睡眠loop()永远不会执行 } void takeMeasurementAndUpload() { // 1. 给传感器供电 digitalWrite(SENSOR_POWER_PIN, HIGH); delay(500); // 等待传感器稳定非常重要 // 2. 读取模拟值并计算湿度百分比 int sensorValue analogRead(SOIL_MOISTURE_PIN); // 多次读取取平均减少噪声 for(int i 0; i 10; i) { sensorValue analogRead(SOIL_MOISTURE_PIN); delay(10); } sensorValue / 10; // 3. 立即关闭传感器电源以节省能耗并防止腐蚀 digitalWrite(SENSOR_POWER_PIN, LOW); // 4. 将原始值映射到百分比湿度注意AIR_VALUE对应0% WATER_VALUE对应100% // 因为ADC值越大表示越干所以需要反向映射 int moisturePercent map(sensorValue, AIR_VALUE, WATER_VALUE, 0, 100); moisturePercent constrain(moisturePercent, 0, 100); // 限制在0-100范围内 // 5. 读取板载传感器数据 float temperature agrumino.readTempC(); float brightness agrumino.readLux(); // 6. 在OLED上显示 displayData(moisturePercent, temperature); // 7. 通过Wi-Fi上传数据例如发送到MQTT或HTTP API uploadDataToCloud(moisturePercent, temperature, brightness); Serial.print(土壤湿度原始值: ); Serial.print(sensorValue); Serial.print( | 湿度百分比: ); Serial.print(moisturePercent); Serial.println(%); Serial.print(温度: ); Serial.print(temperature); Serial.println( °C); } void displayData(int moisture, float temp) { // 使用Agrumino库内置的显示函数或直接调用U8g2 agrumino.turnScreenOn(); agrumino.clearScreen(); agrumino.setFont(TEXT); agrumino.print(Soil: ); agrumino.print(moisture); agrumino.println(%); agrumino.print(Temp: ); agrumino.print(temp, 1); // 显示一位小数 agrumino.println(C); agrumino.renderDrawBuffer(); // 更新屏幕显示 delay(3000); // 显示3秒 agrumino.turnScreenOff(); // 关闭屏幕省电 }代码关键点解析校准 (AIR_VALUE和WATER_VALUE): 这是最关键的步骤。你需要将传感器完全干燥在空气中和完全浸入清水中分别记录下sensorValue填入这两个宏定义。map函数会根据这两个基准点进行线性插值。传感器供电延迟 (delay(500)): 给传感器通电后其内部电路需要一定时间达到稳定状态立即读取会导致数值不准。500ms是一个比较保守且可靠的值。多次采样平均:analogRead单次读数噪声较大连续读取10次取平均能有效平滑数据。立即断电: 读取完成后立刻将SENSOR_POWER_PIN拉低这是保护传感器、延长其使用寿命的核心操作。深度睡眠:esp_deep_sleep_start()会使ESP32进入最低功耗模式只有RTC定时器在工作。整个系统电流可以降到10微安级别。定时唤醒后程序会从setup()开始重新运行而不是loop()。4.3 数据上传MQTT与云端可视化数据上传有多种选择我推荐使用MQTT协议因为它轻量、高效非常适合物联网设备。搭建MQTT Broker: 可以在本地树莓派上安装Mosquitto或者使用云服务商提供的MQTT服务如EMQX Cloud、阿里云物联网平台等。对于家庭使用本地部署更可控。设备端发布数据: 使用PubSubClient库让Agrumino连接上MQTT Broker然后以JSON格式发布消息到特定主题例如agrumino/garden/soil。// 在uploadDataToCloud函数中 String payload “{“moisture”:” String(moisturePercent) “,“temp”:” String(temperature) “}”; mqttClient.publish(“agrumino/garden/soil”, payload.c_str());数据接收与可视化:Home Assistant: 在HA中添加MQTT集成自动发现该主题并创建土壤湿度和温度的传感器实体。然后可以在仪表盘上添加漂亮的卡片甚至设置自动化当湿度低于20%时发送通知到手机提醒浇水。Node-RED: 用Node-RED订阅MQTT主题将数据解析后可以存入数据库如InfluxDB再用Grafana制作带历史曲线图的专业仪表盘。云平台: 像ThingsBoard、Blynk这类平台也提供了从MQTT接入并快速生成仪表板的功能。5. 传感器校准与数据验证实战5.1 分步校准法获得真实的百分比校准是让数据从“毫无意义的数字”变成“可信赖的指导”的唯一途径。我采用的方法是获取“空气值”Dry Value将传感器探头彻底擦干放置在远离土壤和水源的空气中。运行一个只读取并打印sensorValue的程序连续观察几分钟取一个稳定的最高值或平均值作为AIR_VALUE。这个值代表0%湿度理论上。获取“水值”Wet Value准备一杯干净的蒸馏水自来水中的矿物质可能影响读数。将传感器探头完全浸入水中确保电极部分被水覆盖但不要淹没整个电路板。同样运行程序取一个稳定的最低值作为WATER_VALUE。这个值代表100%湿度。土壤实测验证将传感器插入你实际要监测的花盆或土地中浇透水至饱和状态有水从盆底渗出。等待几分钟让水分均匀分布然后读取湿度百分比。理论上它应该接近100%。如果偏差很大比如只有70%说明你的土壤特性如盐分、质地影响了传感器此时可能需要微调WATER_VALUE使其在该饱和状态下显示为95%-100%。这是一个迭代过程。实操心得不要指望一次校准管永久。季节变化、土壤板结、肥料施用都可能改变土壤的电学特性。建议每个种植季开始前或者发现读数明显“不对劲”时重新进行一次简易校准至少验证一下空气值和当前湿润状态的读数。5.2 应对数据波动与异常值即使经过校准和软件滤波在真实环境中数据仍会有波动。以下策略可以帮助你获得更可靠的数据设定采集频率对于土壤湿度变化是相对缓慢的。每15-30分钟采集一次数据完全足够。过于频繁的采集如每秒只会得到大量噪声数据并浪费电能。应用滑动平均滤波在代码中不仅可以单次采样平均还可以对历史数据例如最近5个读数进行滑动平均这能有效平滑掉短期突变。#define READINGS_COUNT 5 int moistureReadings[READINGS_COUNT]; int readIndex 0; int total 0; int average 0; // 每次获得新读数后 total total - moistureReadings[readIndex]; // 减去最旧的读数 moistureReadings[readIndex] newMoistureValue; total total moistureReadings[readIndex]; // 加上最新的读数 readIndex (readIndex 1) % READINGS_COUNT; average total / READINGS_COUNT; // 这就是平滑后的湿度值设置合理的数据范围报警在云端或Home Assistant中设置报警规则。例如如果连续3个读数都低于15%则触发“需要浇水”的警报如果读数在1小时内从30%骤升至85%则可能是传感器故障或线路受潮触发“数据异常”检查通知。6. 系统部署、优化与长期维护6.1 户外部署的防护与供电方案将设备放到阳台或花园你需要考虑防水外壳选择一个合适的防水接线盒IP65或更高等级。将Agrumino主板、锂电池如果有放入其中。传感器引线穿过防水格兰头引出。务必在盒子上方或侧面开几个小的透气孔防止内部结露。可以用防水透气膜戈尔特斯膜原理覆盖透气孔。传感器探头的保护不要将整个传感器模块埋入土中只埋入探针部分。电路板部分可以用热缩管或防水胶进行密封处理。探针长期使用后表面可能会附着矿物质或藻类定期每1-2个月拔出清洁一下。太阳能供电对于长期户外部署一块6V 2W的小型太阳能板配合一个TP4056之类的充电管理模块和一块18650锂电池就足以让系统在晴天自给自足阴雨天也能续航数周。将太阳能板输出接到充电模块充电模块输出接到Agrumino的电池接口。6.2 低功耗深度优化技巧要让电池撑得更久除了使用深度睡眠还有几个技巧缩短Wi-Fi连接时间在setup()中连接Wi-Fi后立即上传数据然后马上调用WiFi.disconnect(true)和WiFi.mode(WIFI_OFF)来彻底关闭Wi-Fi射频。这比单纯让ESP32睡眠但Wi-Fi模块仍待机要省电得多。优化上传策略非必要不频繁上传。可以设定一个阈值只有当湿度变化超过一定幅度例如5%时才触发一次数据上传。或者每天只在固定几个时间点上传。降低CPU频率在setup()开始时调用setCpuFrequencyMhz(80)将ESP32的CPU主频从240MHz降到80MHz能显著降低工作期间的功耗而对传感器读取和简单逻辑处理来说性能完全足够。关闭不用的外设Agrumino库提供了agrumino.turnScreenOff()和agrumino.turnBoardOff()后者会关闭所有传感器电源函数在睡眠前确保调用。6.3 常见问题排查与解决下表汇总了我在部署过程中遇到的一些典型问题及解决方法问题现象可能原因排查步骤与解决方案ADC读数始终为0或40951. 引脚连接错误或虚焊。2. 传感器电源未正确接通。3. 引脚配置错误如将仅输入引脚设置为输出。1. 用万用表检查传感器VCC和GND之间是否有电压通电时。2. 检查代码中SENSOR_POWER_PIN的控制逻辑。3. 确认使用的GPIO引脚支持模拟输入如GPIO32。读数波动剧烈毫无规律1. 电源噪声干扰。2. 信号线引入干扰线太长或未屏蔽。3. 传感器未稳定即读取。1. 在传感器电源引脚加滤波电容0.1uF和10uF并联。2. 缩短导线或使用屏蔽线/双绞线在信号线加小电容滤波。3. 确保digitalWrite(HIGH)后有足够的delay(500)。Wi-Fi连接经常失败1. 信号强度弱。2. 深度睡眠后Wi-Fi模块未正确初始化。3. 路由器设置了MAC地址过滤。1. 在代码中加入Wi-Fi信号强度(RSSI)打印确保大于-70dBm。2. 尝试在setup()开始时调用WiFi.persistent(false)并在连接前先WiFi.mode(WIFI_STA)。3. 检查路由器设置或将Agrumino的MAC地址加入白名单。深度睡眠后无法唤醒1. 唤醒源配置错误。2. 电源问题电压在睡眠时跌落。3. 代码逻辑导致重启后卡住。1. 检查esp_sleep_enable_timer_wakeup()的参数单位是否正确微秒。2. 测量睡眠时电池电压确保高于ESP32的最低工作电压约2.3V。3. 在setup()开头加入串口打印观察是否每次唤醒都执行了。检查是否有全局变量未妥善保存/恢复。OLED屏幕不显示1. 屏幕排线接触不良。2. 代码中未调用显示更新函数。3. 屏幕亮度被调至最低或已损坏。1. 重新插拔Agrumino上的OLED屏幕排线。2. 确认代码中调用了agrumino.turnScreenOn()和renderDrawBuffer()。3. 检查是否在代码或初始化中关闭了屏幕。7. 项目扩展与进阶玩法基础监测系统稳定运行后你可以考虑以下扩展方向让项目变得更强大多节点组网与对比制作多个监测节点部署在花园的不同区域向阳处、背阴处、盆栽、地栽。通过同一个MQTT Broker收集所有数据在可视化面板上进行对比你就能精确掌握整个园子的水分分布差异实现分区精准管理。联动自动灌溉系统这是最自然的延伸。当土壤湿度低于你设定的阈值时Home Assistant或Node-RED可以触发一个自动化通过继电器模块控制一个12V的电磁阀打开进行定时浇水。务必加入冗余安全机制比如每天最多触发一次浇水时必须同时满足“湿度低于阈值”和“时间是早晨”两个条件可以手动一键停止等。集成气象数据从网络API如和风天气获取当地的天气预报、蒸发量数据。结合土壤湿度数据可以构建一个简单的作物需水模型。例如如果预测明天是高温晴天即使当前土壤湿度尚可系统也可以建议你提前少量补水。数据记录与长期分析将数据持久化存储到InfluxDB或MySQL数据库中。通过分析长期数据你可以总结出不同植物在不同季节的耗水规律优化浇水计划甚至为来年的种植计划提供数据支持。更换或增加传感器Agrumino的模拟输入引脚和I2C接口是开放的。你可以轻松接入更多传感器例如土壤电导率EC传感器监测土壤肥力。pH传感器监测土壤酸碱度。大气温湿度传感器如SHT30获取更精确的小气候数据。这个项目的魅力在于它从一个简单的“土壤湿度计”开始却可以像乐高一样根据你的需求和兴趣不断叠加新的功能模块。从读取一个模拟信号到构建一个完整的智慧农业微系统整个过程充满了动手和学习的乐趣。最重要的是通过它种出来的花草蔬果会因为这份精准的关照而长得更好这种正反馈才是持续折腾的最大动力。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门