尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ESP32 智能灌溉系统完整指南:用 Arduino 打造土壤湿度自动浇花器

ESP32 智能灌溉系统完整指南:用 Arduino 打造土壤湿度自动浇花器 ESP32 智能灌溉系统完整指南用 Arduino 打造土壤湿度自动浇花器【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32一块 6 平方米的家庭菜畦靠人眼判断浇水平均每天多浪费 12 升水而把一块 ESP32 模块成本几十元配上土壤湿度传感器就能搭出一套能自己决定浇不浇、浇多久的物联网智能灌溉系统。本文基于开源项目arduino-esp32Arduino core for the ESP32 family of SoCs按感知—决策—执行—通信—能源的动手流程带你从接线、编程、校准到低功耗部署完整走一遍 ESP32 智能灌溉系统的搭建过程。灌溉设备的四层职责划分在写第一行代码之前先把设备拆成四层每层只解决一件事后面所有工作都能对号入座层职责本文方案感知层采集土壤湿度与环境参数电容式湿度探头ADC、DHT11、BH1750 光照计决策层判断是否需要浇水、浇多久ESP32 内的多条件策略表执行层通断水泵/电磁阀并限制时长继电器模块 12V 电磁阀通信层数据上云、本地留底Wi-Fi STA HTTP POST SD 卡能源层太阳能场景下的低功耗运行深度睡眠 传感器电源门控硬件上推荐 ESP32-WROOM-32D 模组Wi-Fi 稳定、性价比高传感器选电容式土壤湿度探头——电阻式探头长期插在土里会发生电解腐蚀读数漂移严重这是选型时最容易踩的坑。ESP32 Arduino 开发环境搭建三步装好支持包第 1 步添加开发板源。打开 Arduino IDE进入文件 → 偏好设置在附加开发板管理器网址一栏填入 ESP32 支持包的索引地址具体地址见项目内 docs/en/installing.rst 安装文档第 2 步安装开发板包。打开工具 → 开发板 → 开发板管理器搜索esp32选中官方包安装第 3 步选择板子并验证。开发板选 ESP32 Dev Module上传任意 Blink 示例串口监视器设 115200 波特率能看到滚动输出即环境就绪Arduino 土壤湿度检测接线与三点校准先看清引脚再动手。ESP32 的 ADC 分两组ADC1 不受 Wi-Fi 射频干扰是采集模拟信号的首选。土壤湿度探头接 GPIO34ADC1_CH6完整引脚分布参考下图接线很简单VCC → 3.3VGND → GND信号 → GPIO34。湿度值必须校准才有意义。探头出厂不标定同一型号不同个体读数也差很多。做法是取两个极端探头悬空记录干值探头浸入清水记录湿值之后用线性映射换算百分比// 湿度探头接在 ADC1 的 GPIO34输入专用、远离射频干扰 #define SOIL_PIN 34 // 校准基准自己实测的两个极端读数 const int DRY_RAW 4095; // 探头悬空完全干燥 const int WET_RAW 1500; // 探头浸入清水 // 把 ADC 原始值换算成 0~100% 的湿度百分比 float soilPercent() { int raw analogRead(SOIL_PIN); float pct 100.0f * (DRY_RAW - raw) / (DRY_RAW - WET_RAW); return constrain(pct, 0.0, 100.0); // 裁剪到合理区间 }经验值多探头部署时每个探头单独校准并在程序里打印原始值观察一周比一次性的两点校准更贴近真实土况。环境参数走两路DHT11 用单总线接 GPIO4BH1750 光照计挂 I2CSDA/SCLESP32 作为 I2C 主机同时带这两个器件毫无压力#include DHT.h #include Wire.h #include BH1750.h DHT dht(4, DHT11); // DHT11 数据脚 BH1750 lightMeter; // I2C 光照计 void sensorInit() { dht.begin(); Wire.begin(); lightMeter.begin(); } // 读取三个环境量isnan 检查防止传感器掉线时算出垃圾值 void readEnv(float tempC, float rh, float lux) { tempC dht.readTemperature(); rh dht.readHumidity(); lux lightMeter.readLightLevel(); if (isnan(tempC) || isnan(rh)) { tempC rh -1; // 标记无效上层决策时直接忽略 } }智能灌溉决策逻辑把浇不浇写成一张策略表把决策拆成一条主条件 若干修正条件比所谓的加权算法更直观、更好调参条件类型判断动作主条件土壤湿度 30%触发灌溉基础时长 30 秒修正条件 1气温 30°C 且空气湿度 50%时长 15 秒蒸发快修正条件 2光照 50000 lux时长 10 秒蒸腾强保护条件距上次灌溉 1 小时跳过防止重复触发保护条件 2单次时长 300 秒拒绝执行防止误参数struct Plan { bool doWater; int seconds; String cause; }; Plan makePlan(float soil, float tempC, float rh, float lux) { Plan plan {false, 0, }; if (soil 30.0f) return plan; // 土壤够湿直接放行 plan.doWater true; plan.cause 湿度低于阈值; plan.seconds 30; if (tempC 30.0f rh 50.0f) plan.seconds 15; // 高温低湿 if (lux 50000.0f) plan.seconds 10; // 强光 return plan; }执行侧加两道保险防止参数错误把水泵干烧#define VALVE_PIN 13 #define CAP_SECONDS 300 // 单次灌溉上限 #define COOLDOWN 3600 // 两次灌溉最小间隔 unsigned long lastRun 0; void runIrrigation(int seconds) { if (seconds 0 || seconds CAP_SECONDS) { Serial.println(时长参数越界拒绝执行); return; } unsigned long now millis() / 1000; if (now - lastRun COOLDOWN) { Serial.println(冷却期未到跳过本次); return; } Serial.printf(开泵 %d 秒\n, seconds); digitalWrite(VALVE_PIN, HIGH); delay(seconds * 1000); digitalWrite(VALVE_PIN, LOW); lastRun now; }避坑清单继电器模块用外部 5V 供电不要从 ESP32 的 3.3V/5V 脚取电线圈吸合电流会拖垮主板电源。水泵/电磁阀接继电器的 COM 与 NO 触点模块自带续流二极管反向电动势不用额外处理。delay()期间程序会停摆量产版建议改成记录开泵时刻 在 loop 里判断是否到期关泵的非阻塞写法。ESP32 物联网数据上传Wi-Fi 连接与 HTTP 推送ESP32 以 STA工作站模式接入家庭路由器是整个系统联网的关键#include WiFi.h #include HTTPClient.h const char* SSID 你的WiFi名; const char* PASSWD 你的WiFi密码; const char* ENDPOINT http://服务器地址/api/irrigation; void attachWiFi() { WiFi.begin(SSID, PASSWD); int tick 0; Serial.print(正在连路由器); while (WiFi.status() ! WL_CONNECTED tick 20) { delay(500); Serial.print(.); tick; } Serial.println(WiFi.status() WL_CONNECTED ? 已连接 : 失败); } // 组 JSON 上行失败只记录不重试下轮循环自然补数据 void pushCloud(float soil, float t, float h, float lux) { if (WiFi.status() ! WL_CONNECTED) attachWiFi(); if (WiFi.status() ! WL_CONNECTED) return; HTTPClient http; http.begin(ENDPOINT); http.addHeader(Content-Type, application/json); String body {\soil\: String(soil) ,\temp\: String(t) ,\rh\: String(h) ,\lux\: String(lux) }; int code http.POST(body); Serial.printf(上传%s状态码 %d\n, code 0 ? 成功 : 失败, code); http.end(); }云端链路之外再留一份本地底账SD 卡按 CSV 追加写入断网期间数据也不丢事后可以导入表格做趋势分析#include SD.h #define SD_CS 5 void appendLog(float soil, float t, float h, float lux, bool watered, int sec) { File f SD.open(/irrigation.csv, FILE_APPEND); if (!f) return; // 开文件失败只跳过不卡死主流程 f.print(millis() / 1000); f.print(,); f.print(soil); f.print(,); f.print(t); f.print(,); f.print(h); f.print(,); f.print(lux); f.print(,); f.print(watered ? Y : N); f.print(,); f.println(sec); f.close(); }低功耗灌溉控制深度睡眠与传感器电源门控太阳能供电时常开 Wi-Fi 是功耗大头。策略是醒来—采样—上行—睡下的轮询周期#include esp_sleep.h #define DUTY 300 // 一轮采样上行周期秒 void reportWakeCause() { switch (esp_sleep_get_wakeup_cause()) { case ESP_SLEEP_WAKEUP_TIMER: Serial.println(定时唤醒开始采样); break; default: Serial.println(非定时唤醒检查供电); break; } } void sleepUntilNextCycle() { esp_sleep_enable_timer_wakeup(DUTY * 1000000ULL); // 单位微秒 Serial.println(进入深度睡眠); delay(100); // 给串口缓冲区一点排空时间 esp_deep_sleep_start(); // 从此处不会返回 }在setup()开头调用reportWakeCause()区分本次醒来是否正常loop()结束采样和上行后再调sleepUntilNextCycle()。睡眠期间 GPIO 状态丢失唤醒后需重新初始化传感器。第二刀砍在传感器电源上用一个 MOSFET 或晶体管开关挂在 GPIO14只在采样窗口给传感器供电#define SENSOR_EN 14 void sensorPower(bool on) { digitalWrite(SENSOR_EN, on ? HIGH : LOW); if (on) delay(100); // 等供电稳定后再读数避免采到爬坡值 }田间验收上线前对照检查表验收项通过标准传感器读数探头干湿两端读数与校准值偏差 5%决策逻辑人为制造干湿两种土况触发/跳过行为与策略表一致执行保护把时长参数改成 999程序应拒绝执行继电器通断电 50 次接触稳定水泵无异常发热Wi-Fi 上行连续 24 小时断连后能自动重连无漏报SD 日志断电重启后旧 CSV 文件完整可追加低功耗睡眠电流 20mA用串口电流表实测进阶方向从单点走向系统系统跑稳之后按投入产出比排序的四个扩展方向多区域轮灌——一个继电器板扩 4 路阀各区域独立阈值Plan结构体复制一份即可。天气联动——定时拉取天气 API预报降雨自动压低当天灌溉时长比任何本地判断都准。远距离通信——Wi-Fi 覆盖不到的田块换 LoRa多节点组 Mesh。数据闭环——用积累的 CSV 历史训练简单预测模型把阈值灌溉升级为趋势灌溉。获取代码与深入学习入口完整源码可从项目仓库获取git clone https://gitcode.com/GitHub_Trending/ar/arduino-esp32本文涉及的底层驱动与库都在仓库内建议对照阅读GPIO 驱动cores/esp32/esp32-hal-gpio.hADC 采样接口cores/esp32/esp32-hal-adc.h串口底层cores/esp32/esp32-hal-uart.hWi-Fi 库libraries/WiFi/SD 卡库libraries/SD/HTTPClient 库libraries/HTTPClient/I2C 库Wirelibraries/Wire/先让探头读出一个稳定的湿度值再让水泵按策略表动起来最后把数据推上云端——这三步走完你的智能灌溉系统就真正跑起来了。【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表