十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

用ESP32搭建智能灌溉系统:5步跑通从湿度到深睡

用ESP32搭建智能灌溉系统:5步跑通从湿度到深睡 用ESP32搭建智能灌溉系统5步跑通从湿度到深睡【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32把一块 ESP32 塞进菜地旁边的防水盒再接上一根土壤湿度探头和一个继电器这套 ESP32 智能灌溉系统就能自己决定什么时候浇水。全程只需要五步接好引脚、装好驱动、写判断逻辑、把日志落到 SD 卡、最后让板子深度睡眠省电。不需要云端账号也不需要手机 App先把读数—判断—执行水泵这个本地闭环跑通。接线探头、继电器和三条电源线硬件清单很克制一块 ESP32 DevKitC、一个带 ADC 输出的电容式土壤湿度探头、一个 5V 继电器模块可选一块 SD 卡模块。电容式探头的好处是长时间插土里不会像电阻式探头那样电解腐蚀读数更稳。连接关系只有三组照图上的标注找引脚即可探头VCC→3V3GND→GNDADC→GPIO34即 ADC1_CH6继电器IN→GPIO13VCC→ 独立 5V 电源GND→ 与 ESP32 共地SD 卡模块CS→GPIO5其余按模块默认 SPI 引脚GPIO 接口在 cores/esp32/esp32-hal-gpio.hADC 接口在 cores/esp32/esp32-hal-adc.h。为什么探头选 GPIO34 而不是随便一个口GPIO34到GPIO39是纯输入引脚正好落在 ADC1 上。这一点很关键ESP32 的 ADC2 在 Wi-Fi 开启期间被射频模块占用读不出来探头放在 ADC1 侧后面接 Wi-Fi 上传数据时读数不受影响。装好驱动串口里打出第一个读数Arduino IDE 打开首选项把 ESP32 包的索引地址本仓库安装文档 docs/en/installing.rst 里有完整地址填进附加开发板管理器网址然后在开发板管理器里搜索 esp32 安装装完选择开发板型号烧入下面这段串口监视器设到 115200 波特率const int SOIL_PIN 34; // ADC1_CH6纯输入 float raw analogRead(SOIL_PIN); // 12位0~4095 对应 0~3.3V // 校准值探头悬空记为 DRY完全浸入清水记为 WET const float DRY 4095, WET 1500; float moisture constrain(100.0 * (DRY - raw) / (DRY - WET), 0, 100); Serial.printf(土壤湿度: %.1f%%\n, moisture);这段代码做的事是读一个 12 位 ADC 原始值用干和湿两个校准点把它线性映射成 0 到 100% 的湿度再截断到合理范围后打印。 探头插进实际土壤后干湿两端的原始值会和悬空/清水时差几十个点正式部署前拿你的土重新记一遍DRY和WET再烧进去。让 ESP32 自己决定浇不浇水判断逻辑故意做得很直白湿度低于阈值就浇但两次浇水之间强制留一个冷却间隔防止水泵在阈值边缘反复启停。阈值判断加最小间隔#define RELAY_PIN 13 #define DRY_THRESHOLD 30.0 // 低于30%要浇水 unsigned long lastWater 0; const unsigned long MIN_GAP 3600; // 最小浇水间隔秒 void checkAndWater(float moisture) { if (moisture DRY_THRESHOLD) return; unsigned long now millis() / 1000; if (now - lastWater MIN_GAP) return; // 冷却期内跳过 digitalWrite(RELAY_PIN, HIGH); // 继电器吸合水泵通电 delay(30 * 1000); // 浇 30 秒 digitalWrite(RELAY_PIN, LOW); // 停水 lastWater now; }这段代码做的事是湿度不够且不在冷却期内就拉高继电器信号 30 秒完成一次浇水并记下本次时间。⚠️ 继电器模块的VCC必须接独立的 5V 电源GND与 ESP32 共地不要从 ESP32 的3V3直接给继电器线圈供电既可能吸合不上也容易把板子拖挂。水泵、电磁阀这类感性负载同样走外部供电。把日志丢到 SD 卡上留底农场断电断网之后想知道昨天到底浇了几次水只能靠本地记录。仓库自带的 libraries/SD/ 库把 SD 卡封装成了文件接口追加写一行 CSV 只要几行代码#include SD.h #define SD_CS 5 void logLine(float moisture, bool watered) { File f SD.open(/log.csv, FILE_APPEND); if (!f) return; // 卡没挂上就跳过不崩 f.printf(%lu,%.1f,%s\n, millis() / 1000, moisture, watered ? 是 : 否); f.close(); }这段代码做的事是每次测量后在 SD 卡的log.csv里追加一行运行秒数,湿度,是否浇水文件用 Excel 或任何表格软件直接打开就能看趋势。想远程盯着的话把读数 POST 出去本地闭环跑通之后联网只是加一个函数的事。ESP32 以 STA 模式连你家的路由器libraries/WiFi/ 库负责连接HTTPClient 负责发请求#include WiFi.h #include HTTPClient.h void upload(float moisture, float temp) { if (WiFi.status() ! WL_CONNECTED) return; HTTPClient http; http.begin(http://你的服务器/api/irrigation); http.addHeader(Content-Type, application/json); String body {\moisture\: String(moisture) ,\temp\: String(temp) }; int code http.POST(body); // 返回 200 说明服务器收下了 http.end(); }这段代码做的事是连上 Wi-Fi 后把湿度和温度打包成一个 JSON用 HTTP POST 发给服务器返回码大于 0 就是成功。服务器端只需要一个能接 POST、落库的简单接口前端画不画曲线是后话。换深度睡眠模式把电量省下来常开 Wi-Fi 的 ESP32 功耗在几十到几百毫安靠电池撑不过一天深睡时电流掉到微安级同一个场景续航可以从天级拉到周级。仓库核心里就有现成的deepSleep接口cores/esp32/Esp.h官方示例在 libraries/ESP32/examples/DeepSleep/TimerWakeUp。#include esp_sleep.h void goSleep() { // 5分钟微秒后定时器唤醒单位注意是 µs esp_sleep_enable_timer_wakeup(5ULL * 60 * 1000000); esp_deep_sleep_start(); }这段代码做的事是让整块芯片进入深度睡眠5 分钟后由内部定时器自动叫醒醒来后程序从setup()重新跑一遍。唤醒后想区分定时醒还是复位醒用esp_sleep_get_wakeup_cause()查一下即可。 深睡期间 Wi-Fi 会断开所以把WiFi.begin()和上传逻辑都放在唤醒之后的主循环里别在睡前提前连网。验收检查确认系统真的在工作烧完代码别急着埋进地里用三个检查过一遍读数检查晃动探头、拿湿纸巾压探头串口里的湿度应该平滑地往两个方向走干端接近 100%湿端接近 0%。数值跳得乱就回到接线先查 GND 有没有共好。执行检查把探头信号线临时悬空模拟干旱看继电器是否在 30 秒后准时断开再等一小时内连续触发确认冷却间隔真的拦住了第二次启动。留底检查拔下 SD 卡插电脑打开log.csv核对行数和时间戳每一轮测量都应该对应一行。三项都过了再考虑往系统里加东西接一个 DHT11 把温度湿度并进判断条件、加几路继电器分区灌溉或者让服务器端根据历史数据把DRY_THRESHOLD调得随季节变化。先让它跑满一周串口和 SD 卡里的数据会告诉你下一步该优化哪里。【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表