哎,你还记得那个每年暑假都让咱们头疼的问题吗?就是家里没人,那几盆娇贵的绿植是不是得快渴死了?或者更实际点——孩子想赚点零花钱,但手头没啥技术门槛高深的东西能干?
其实这事儿吧,我真不夸张,前阵子我一个朋友家的侄子,才上初二,愣是靠着几十块钱的淘宝配件,搞了个“自动浇水神器”,不仅把自己家的花伺候得服服帖帖,还顺手帮邻居照看植物,暑假前前后后赚了快两千块。关键是他没买成品,全自己焊的、自己写的代码、自己搭的服务器逻辑。
这事儿吧,挺有意思,也挺接地气。今儿个咱们就从头到尾捋一遍:怎么花最少的钱,弄一个能手机远程控制的智能花盆。咱们不整那些虚头巴脑的学术名词,就当是聊天,一步一步带你做。
一、先说清楚:这玩意儿到底是个啥?
首先,你得明白,“智能花盆”说白了就是一个可以感知土壤干湿、并且能自动控制水泵浇水的装置。
它干三件事:
- 感觉:土壤有多干?(用湿度传感器)
- 思考:该不该浇水?(用单片机判断)
- 动手:打开水泵,把水从储水桶抽到花盆里。(用继电器控制水泵)
外加一个“远程”功能,让你躺在三亚沙滩上,也能用手机看看家里花盆干没干,甚至手动点一下浇水。
这个架构,听着复杂,其实核心就是一个小小的ESP32开发板。为啥是ESP32?因为它便宜(淘宝上20块钱能买到)、性能强、自带Wi-Fi和蓝牙,而且社区资料多到爆炸,你搜“ESP32 自动浇水”,出来的教程比面条还多。
二、采购清单:淘宝上怎么挑配件?
咱们别整那些进口的、高精尖的,就用最皮实、最便宜、最容易上手的。下面是我朋友侄子实际用的清单,价格都是2024年的大概价,你可以照着搜。
| 配件名称 | 推荐型号/规格 | 大概价格 | 为啥选它 |
|---|---|---|---|
| 主控板 | ESP32-DevKitC 或 ESP32-WROOM | ¥25-35 | 自带Wi-Fi,不需要额外模块,性能过剩,绝对够用 |
| 土壤湿度传感器 | Capacitive Soil Moisture Sensor V1.2 (电容式) | ¥3-5 | 注意!一定要买电容式的! 别买电阻式的,电阻式的用两次就锈了,电容式的能长期埋在土里 |
| 微型水泵 | 5V 防水潜水泵 (USB接口或带接线端子) | ¥5-8 | 小功率,静水流声,够用 |
| 水泵电源 | 5V 1A 手机充电头 + USB线 | ¥10 (已有可省) | 给水泵供电,顺便给ESP32供电,一个电源搞定 |
| 继电器模块 | 5V 单路继电器模块 (带光耦隔离) | ¥3-5 | ESP32输出电流太小,带不动水泵,需要继电器放大 |
| 杜邦线 | 母对母、母对公、公对公各一包 | ¥5 | 连线用 |
| 储水桶 | 任意塑料瓶或收纳盒 | ¥0 (家里有) | 储水容器 |
| 水管 | 硅胶软管 (内径3-5mm) | ¥3 | 把水从桶引到花盆 |
总成本:大概在 ¥50-60 左右。 比你买一个成品智能花盆便宜多了,而且坏了自己能修。
专家提示:买ESP32的时候,认准“USB接口”的版本,这样你直接插电脑就能下载程序,不用额外买CH340下载器。买传感器时,问客服:“是电容式的吗?” 如果客服说“这是电阻式湿度传感器,注意不要长期通电”,那你要三思,或者只在使用时通电。
三、硬件连接:别怕,就几根线
好,东西都买回来了。咱们开始接线。这个环节不需要电烙铁,用杜邦线插起来就行。
ESP32开发板上有很多引脚,咱们只用其中几个。为了方便,我画个简易的对应关系图(你脑子里要有这个画面):
1. 土壤湿度传感器接线
电容式湿度传感器有三个引脚:VCC, GND, AO (模拟输出)。
- VCC -> 接 ESP32 的 3.3V (注意!不是5V!电容式传感器通常支持3.3V-5V,但ESP32的逻辑电平是3.3V,接3.3V最稳妥,也能避免腐蚀)
- GND -> 接 ESP32 的 GND (随便找个GND就行,板上好几个)
- AO -> 接 ESP32 的 36号引脚 (VP) 或 39号引脚 (VN)。ESP32的ADC(模数转换)引脚主要集中在右侧那一排,36、39、34、35这几个都行。我们就用 36 (VP) 吧。
为啥选36脚? 因为它是ADC1的一个通道,在ESP32的Arduino框架里用得顺手,而且不容易跟其他功能冲突。
2. 继电器模块接线
继电器模块也有三个主要引脚:VCC, GND, IN。
- VCC -> 接 ESP32 的 5V (继电器线圈需要5V驱动,ESP32的5V引脚能提供足够的电流)
- GND -> 接 ESP32 的 GND
- IN -> 接 ESP32 的 2号引脚 (GPIO2)。这个引脚平时接板载LED,但咱们在代码里会把它当作普通IO用,放心。
3. 水泵接线(最关键,涉及强电,但咱们用5V低压,安全)
继电器本质上是一个“电子开关”。它有三个引脚:COM (公共端), NO (常开), NC (常闭)。我们只用到 COM 和 NO。
- 水泵正极 (+) -> 接到继电器的 COM 脚
- 水泵负极 (-) -> 接到 电源负极 (比如5V充电头的黑线)
- 继电器 NO 脚 -> 接到 电源正极 (比如5V充电头的红线)
- 电源正极 -> 同时接到继电器模块的 VCC (哦不对,继电器模块VCC已经接ESP32了,这里要小心)
更正一下,更清晰的接法:
咱们用一个独立的5V电源给水泵供电,ESP32也插在这个电源上(共用GND)。
- 5V电源正极 -> 接到继电器模块的 VCC
- 5V电源负极 -> 接到继电器模块的 GND,同时接到ESP32的 GND (共地!这步超级重要!)
- 5V电源正极 -> 接到继电器的 NO 脚
- 水泵正极 -> 接到继电器的 COM 脚
- 水泵负极 -> 接到 5V电源负极
这样,当ESP32给继电器 IN 脚发低电平信号时,继电器吸合,COM和NO导通,水泵正极就接到了5V电源正极,水泵转起来!
原理图简述:
[5V电源+] -----> [继电器 NO]
|
[COM] -----> [水泵+]
|
[水泵-] -----> [5V电源-] (GND)
|
[ESP32 GND] <--- (共地)
接线完成! 检查一下,别接反了,尤其是电源的正负极。电容式传感器怕接反,水泵接反了只是不工作,不会坏。
四、软件编程:让花盆“活”过来
好,硬件搞定了,现在让花盆有“脑子”。咱们用 Arduino IDE 来写代码,这是最主流、资料最多的方案。
第一步:安装ESP32开发板支持
如果你还没在Arduino IDE里装好ESP32的支持,先去 Arduino官网 或者 GitHub 找教程,大概就三步:
- 打开 IDE,进入 文件 -> 首选项
- 在“附加开发板管理器网址”里填入:
https://dl.espressif.com/dl/package_esp32_index.json - 进入 工具 -> 开发板管理器,搜索“ESP32”,安装第一个,作者Espressif Systems的。
第二步:写代码
咱们写一个简单的程序:
- 读取土壤湿度。
- 如果太干,打开水泵浇水,浇3秒,然后关掉。
- 每隔一段时间(比如10分钟)检查一次。
- 建立一个简单的Web服务器,让你能在手机浏览器里看到湿度,并手动浇水。
下面是我朋友侄子实际用的代码,我给它加了注释,你直接复制粘贴就能用(记得改Wi-Fi名和密码):
#include <WiFi.h>
#include <WebServer.h>
// ====== 配置区 ======
const char* ssid = "你的WiFi名字"; // 改这里!
const char* password = "你的WiFi密码"; // 改这里!
// 引脚定义
const int moisturePin = 36; // 土壤湿度传感器接的引脚 (VP)
const int pumpPin = 2; // 继电器控制引脚
// 阈值:湿度值小于这个数,说明太干了 (需根据你家土壤实测调整)
// 电容式传感器:干燥时输出高电压(接近4095),潮湿时输出低电压(接近0)
// 注意:不同传感器线性度不同,有的满水是高,有的满水是低,务必先测试!
// 以下假设:数值越小越湿,数值越大越干。这里我们设一个干燥阈值
const int dryThreshold = 3000; // 当湿度值 > 3000 时,认为太干
const int wateringDuration = 3000; // 浇水3秒
WebServer server(80);
// 读取土壤湿度的函数
int readSoilMoisture() {
return analogRead(moisturePin);
}
// 浇水的函数
void waterPlant() {
digitalWrite(pumpPin, LOW); // 继电器低电平触发
delay(wateringDuration);
digitalWrite(pumpPin, HIGH); // 关闭水泵
}
// 处理首页请求
void handleRoot() {
int moisture = readSoilMoisture();
String html = "<html><body><h1>我的智能花盆</h1>";
html += "<p>当前土壤湿度值: " + String(moisture) + "</p>";
html += "<p>干燥阈值: " + String(dryThreshold) + "</p>";
// 根据湿度显示状态
if (moisture > dryThreshold) {
html += "<p style='color:red;'>警告:土壤太干了!</p>";
} else {
html += "<p style='color:green;'>土壤湿度适宜</p>";
}
// 手动浇水按钮
html += "<a href='/water'><button>手动浇水</button></a>";
html += "<br><a href='/'>刷新</a>";
html += "</body></html>";
server.send(200, "text/html", html);
}
// 处理浇水请求
void handleWater() {
waterPlant();
server.sendHeader("Location", "/");
server.send(303);
}
// 处理404
void handleNotFound() {
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++) {
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
}
void setup() {
Serial.begin(115200);
// 设置引脚模式
pinMode(moisturePin, INPUT);
pinMode(pumpPin, OUTPUT);
digitalWrite(pumpPin, HIGH); // 初始状态关闭水泵 (继电器高电平断开)
// 连接WiFi
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// 设置路由
server.on("/", handleRoot);
server.on("/water", handleWater);
server.onNotFound(handleNotFound);
// 启动服务器
server.begin();
Serial.println("HTTP server started");
}
void loop() {
server.handleClient(); // 持续处理网页请求
// 自动浇水逻辑:每隔30秒检查一次 (避免太频繁)
static unsigned long lastCheckTime = 0;
if (millis() - lastCheckTime > 30000) {
lastCheckTime = millis();
int moisture = readSoilMoisture();
Serial.print("Soil moisture: ");
Serial.println(moisture);
if (moisture > dryThreshold) {
Serial.println("Soil is too dry! Watering...");
waterPlant();
}
}
}
代码关键点解释(给小朋友看的)
#include <WiFi.h>和#include <WebServer.h>:这俩是“工具箱”,一个负责连网,一个负责建立网页服务器。const char* ssid和password:把你的WiFi账号密码填进去,花盆就能上网了。analogRead(moisturePin):读取湿度传感器的值。这个值是一个0-4095之间的数字。dryThreshold = 3000:这是你设定的“警戒线”。重要! 你得先把传感器插进土里,打开串口监视器(Arduino IDE右上角的放大镜图标),看看湿润时是多少,干燥时是多少。比如,湿土是1000,干土是3500,那3000就是个合理的阈值。server.on("/", handleRoot):告诉服务器,如果有人访问根网址(比如192.168.1.100),就运行handleRoot函数。handleRoot函数:这个函数返回一段HTML代码,就是你在手机浏览器里看到的那个页面。里面有湿度数值和“手动浇水”按钮。loop()函数里的自动检查:我们每30秒 (30000毫秒) 检查一次湿度,如果超过阈值,就自动浇水。这样即使你不在,花也不会渴死。
第三步:上传代码
- 用USB线把ESP32连到电脑。
- 在Arduino IDE里,选择正确的开发板:工具 -> 开发板 -> ESP32 Arduino -> ESP32 Dev Module。
- 选择正确的端口:工具 -> 端口 -> COMx (Windows) 或 /dev/cu.usbserial-xxx (Mac)。
- 点击上传按钮(向右箭头)。
- 上传成功后,打开串口监视器,波特率设为 115200,你会看到ESP32连接WiFi的日志,最后打印出一个IP地址,比如
192.168.1.100。
第四步:手机上控制
拿出你的手机,连上同一个WiFi,打开浏览器,输入刚才那个IP地址,比如 http://192.168.1.100。
哇!屏幕上出现了你的智能花盆的监控页面!
- 你能看到实时湿度。
- 点击“手动浇水”,水泵就会咕嘟咕嘟工作3秒。
- 页面还会告诉你现在土壤是太干还是适宜。
这就成了! 一个只要50块钱,能远程监控、自动浇水的智能花盆,就这么出来了。
五、优化与进阶:让它更像个“产品”
刚才那个版本已经能用了,但要是你想让它更靠谱、更高级,还可以做这几件事:
1. 解决“阈值不准”的问题
不同土质、不同植物,需要的湿度不一样。你可以加一个“校准模式”。
- 在代码里加一个按钮,点击后进入校准。
- 把传感器插进土里,记录当前值,设为“当前湿度”。
- 再插进水里,记录值,设为“饱和湿度”。
- 把两者之间的范围映射到0-100%,这样显示的就是百分比湿度,更直观。
2. 增加“缺水报警”
当土壤极度干燥时,ESP32可以通过Wi-Fi发送一个通知到你手机。
- 可以用 Blynk 这种物联网平台,免费额度够用,还能推送APP通知。
- 或者用微信公众号、企业微信,写个简单的HTTP请求,发一条消息。
3. 用定时任务代替固定间隔
刚才代码里是每30秒检查一次,这有点浪费电(虽然
