ESP32 智能农业物联网监控系统实战指南:3步80元搞定土壤数据上云
【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32
这篇指南带你用一块 ESP32-C3 和开源的 arduino-esp32 核心,搭一套能上云的物联网土壤监控系统:土壤干了自动上报,数据随时可查。硬件总花费约 80 元,全程约 90 分钟。读完你就能自己接线、烧录固件,并把数据传到自己的服务器。
动手之前:物联网监控硬件与软件清单
先说人话:你要做的东西本质是一台"会看土的迷你电脑"——ESP32-C3 是主控,板子自带 2.4GHz WiFi 和 12 位 ADC(也就是把模拟电压信号翻译成数字的"翻译官"),传感器负责感知,云平台负责存。
| 名称 | 用途 | 参考价 / 获取方式 |
|---|---|---|
| ESP32-C3 DevKitM-1 开发板 | 主控,板载 2.4GHz WiFi 与 12 位 ADC | 约 18 元 |
| FC-28 土壤湿度传感器 | 电阻式探头,AO 口输出 0~3.3V 模拟电压 | 约 5 元 |
| 面包板 + 杜邦线 10 根以上 | 免焊接临时接线 | 约 10 元 |
| USB-C 数据线 | 给板子供电 + 串口通信 | 约 10 元 |
| Arduino IDE | 代码编辑、编译、烧录 | 免费,从 arduino.cc 官网下载 |
| arduino-esp32 开发板支持包 | 本文主角:ESP32 家族的 Arduino 官方核心 | 免费,用开发板管理器安装 |
前置条件,一共三条:
- 一台能联网的电脑(Windows、macOS、Linux 均可)
- 一个2.4GHz 的 WiFi。先说人话:ESP32-C3 只认 2.4GHz 频段,如果你家路由器只开 5GHz,它连都连不上
- 一个能接收数据的 HTTP 接口地址(你自己的服务器或测试环境即可,第四步才用到)
替代方案:手头没有 FC-28 也没关系,任何带电压输出(AO)的电容式土壤传感器都能替代,代码一字不改;连传感器都没有,可以先拿一个 10K 电阻接在 GPIO4 和 GND 之间把代码跑通,之后再换真传感器。
全局视角:土壤数据从探头到手机的流向
整条链路一句话:探头阻值变化 → ADC 转成 0~4095 → 换算百分比 → WiFi 发包 → 云端存储 → 手机查看。
ESP32 内部 GPIO 矩阵示意图:传感器信号经 IO_MUX 分配到具体引脚,再由 GPIO 矩阵送往 ADC 等外设
拆开看就四件事:
- 探头插进土里,含水量变化让电阻变化,ESP32 通过 ADC 引脚读到一个 0~4095 的原始值
- 代码把原始值线性换算成 0~100% 的湿度百分比
- 板子以 STA 模式(Station,即"客户端"身份)接入家里 WiFi
- 通过 HTTP 把 JSON 数据 POST 到你的服务器,由你决定怎么展示和报警
🛠️ 第一步:安装 arduino-esp32 支持包并选中开发板
做什么:让 Arduino IDE 认识 ESP32-C3 这块板子,这是所有后续操作的前提。
怎么做:
- 安装 Arduino IDE(1.8 以上版本即可),从官网下载安装包一路下一步
- 打开 IDE 的偏好设置窗口(File → Preferences,Linux 在 Edit → Preferences),在 Additional Boards Manager URLs 一栏填入 ESP32 支持包的索引地址,完整 URL 可直接查官方安装文档,稳定版以
package_esp32_index.json结尾 - 依次点 Tools → Board → Boards Manager,搜索 "esp32",点 Install
- 重启 IDE,在 Tools → Board 里选中 "ESP32C3 Dev Module"
在 Additional Boards Manager URLs 中填入 ESP32 支持包索引地址,这是开发板管理器能找到 esp32 包的关键一步
开发板管理器里搜到 esp32 包并点 Install,下载需要几分钟,耐心等进度条走完
验证点:选中开发板后,Tools 菜单下会出现一整排 ESP32 专属选项(USB CDC On Boot、Flash Size、PSRAM 等),IDE 底部状态栏显示当前板型号。如果菜单里空空如也,说明第 2 步的 URL 没保存成功,重启 IDE 再试一次。
第二步:接线土壤湿度传感器并验证串口读数
做什么:把传感器接上,确认读数会随干湿变化,排除硬件问题后再谈联网。
怎么做:
- 传感器 VCC 接板子 3V3,GND 接 GND,AO 接GPIO4
- 在 IDE 新建草图,把下面代码粘贴进去,改好引脚号
- 选中板子和串口号,点上传
- 打开串口监视器(Serial Monitor),波特率选 115200
ESP32-C3 DevKitM-1 引脚布局图:AO 信号接 GPIO4(对应 ADC1_4),电源用 3V3 和 GND
const int SOIL_PIN = 4; // C3 的 ADC1_4 引脚 void setup() { Serial.begin(115200); Serial.setDebugOutput(true); // 串口当调试输出 } void loop() { int raw = analogRead(SOIL_PIN); // 12 位 ADC,0~4095 float percent = map(raw, 1000, 3200, 100, 0); // 干湿区间换算成百分比 percent = constrain(percent, 0, 100); Serial.printf("土壤湿度: %.1f%%\n", percent); delay(2000); }Arduino IDE 中打开草图、选择 ESP32 开发板与串口号,点绿色箭头即可编译烧录
验证点:串口里每 2 秒刷一行湿度值。用手捏住探头,数值应明显上升;松开回落。如果读数常年钉死在 0 或 4095,先查 VCC/GND 是否接反,再看探头是否真的插进了介质。踩过的坑直接告诉你:map里 1000、3200 这两个区间不是魔法数字,烧录后拿干土和湿土各读一次原始值,把它换成你实测的区间,百分比才准。
第三步:连接家里 WiFi 并验证网络通信
做什么:让板子以 STA 身份接入 2.4GHz WiFi,拿到局域网 IP。
怎么做:在第二步的代码基础上补上 WiFi 连接部分,整段替换 setup:
#include <WiFi.h> void setup() { Serial.begin(115200); WiFi.begin("你的WiFi名", "你的WiFi密码"); while (WiFi.status() != WL_CONNECTED) { // 等联网成功 Serial.print("."); delay(500); } Serial.println(); Serial.print("拿到IP: "); Serial.println(WiFi.localIP()); }⚠️ 两处最容易翻车:密码里含中文输入法状态会抄错,逐字符对照输入;路由器开了"双频合一"时,确认设备列表里确实有 2.4GHz 信号。
ESP32 作为 WiFi 客户端(STA)接入无线路由器的连接关系示意
验证点:串口打印一串点后,出现拿到IP: 192.168.x.x。如果一直打点、IP 永远出不来,99% 是密码错或连了 5GHz 网络,回到第 2 步重查。
第四步:搭建数据上传循环与深度睡眠节能
做什么:把"读一次 → 传一次 → 睡一会儿"变成自动循环,这是整个物联网监控系统跑起来的最小闭环代码。
怎么做:
- 头文件加上
#include <HTTPClient.h>(该库已随 arduino-esp32 核心内置,无需另装) - 把 setup 换成第三步的 WiFi 连接代码
- loop 改为下面这段,把 URL 换成你自己的接口
如果现场没有现成 WiFi,ESP32 还能切换为 AP(热点)模式发射信号,方便设备直连配置
void loop() { int raw = analogRead(SOIL_PIN); String body = "{\"moisture\":" + String(raw) + "}"; HTTPClient http; http.begin("http://你的服务器/上报接口"); http.addHeader("Content-Type", "application/json"); Serial.printf("上传状态码: %d\n", http.POST(body)); // 发出 JSON http.end(); // 进入深度睡眠(即让设备"闭眼省电"的模式),5 分钟后再自动醒来 esp_sleep_enable_timer_wakeup(5 * 60 * 1000000); esp_deep_sleep_start(); }深度睡眠唤醒的细节(RTC 数据保留、唤醒原因判断)可以参考仓库自带的深度睡眠官方示例。
验证点:串口打出上传状态码: 200,同时你的服务器接口收到一条 JSON。拔插 USB 后观察串口重新打印 IP——这说明"醒来→联网→上报"的完整周期成立了。如果状态码是 4xx/5xx,那是你服务器接口的问题,与 ESP32 无关。
✅ 跑通之后:三个值得做的升级
断电不丢配置:把阈值存进闪存
现在报警阈值写死在代码里,改一次就要重烧一次固件。核心思路:用 Preferences 库把阈值、服务器地址写进芯片闪存,开机自动读回。涉及核心内置的 Preferences 库,几十行代码即可完成,Preferences 库目录里有完整 API 说明。
不拆壳升级固件:接入 OTA 远程更新
设备埋进地里后,每次改代码都拔线太反人类。核心思路:代码里引入核心自带的 ArduinoOTA 库,固件里注册一个名字和密码,之后就能通过局域网推送新固件,升级过程在网页端完成并需要登录校验。
OTA 升级的网页登录界面:升级入口带密码校验,防止他人未授权刷写你的设备
现场无网也能配:AP 热点配置模式
农田现场经常没有现成 WiFi,让设备自己当路由器是标准解法。核心思路:调用 WiFi.softAP() 让板子发射热点,再配合核心内置的 WebServer 库做一个配置页,手机连上去填一次 WiFi 名和密码即可,配置存 Preferences,下次开机直连。
⚠️ 翻车急救站
| 现象 | 最可能原因 | 30秒内能做的排查动作 |
|---|---|---|
| IDE 里搜不到 esp32 开发板 | 索引 URL 没填或没保存 | 重开偏好设置确认 URL 完整,保存后重启 IDE |
| 设备管理器里不出现 COM 口 | 用了充电专用线 / 缺驱动 | 换一根数据线;Windows 装 CP2102 或 USB-SERIAL-JTAG 驱动 |
上传卡在Connecting....后报错 | 未按住 BOOT 键 / 板子没进下载模式 | 按住 BOOT 不松,点上传,等出现 "Connecting" 再松开 |
| 湿度读数恒为 0 或 4095 | VCC/GND 接反或探头断路 | 万用表量传感器两端电压,确认 3V3/GND 没反 |
| WiFi 一直打点拿不到 IP | 密码错 / 连的是 5GHz 网络 | 手机连同一网络测速确认可用,路由器后台确认有 2.4GHz 信号 |
| 上传状态码不是 200 | 服务器接口拒绝请求 | 手机浏览器直接访问该 URL 看响应,先排除板子因素 |
如果以上都没解决,把 IDE 里 "Show verbose output: during upload" 打开后完整重传一次,将这段日志连同你的接线方式贴到项目 Issue 区,通常能快速定位。
最后
你手里现在有一套会自己看土、定时上报的物联网监控系统。今晚就做一件小事:拿干土和湿土各读 5 次原始值,把代码里map的两个区间换成实测数,再跑一轮——你的湿度百分比立刻从"大概对"变成"真的准"。
【免费下载链接】arduino-esp32Arduino core for the ESP32 family of SoCs项目地址: https://gitcode.com/GitHub_Trending/ar/arduino-esp32
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考