新手创客自制自动灌溉装置 百元材料让阳台花盆自动浇水再也不用担心出差忘浇水
上次朋友来我家,看见阳台上一排排的花盆,羡慕地说”你这养花水平可以啊”。我笑着没说话,心里却在盘算:再过两周我就要出差一周,这些花儿可咋办?
后来我花了一百多块钱,做了一个自动灌溉装置,从那天起,我就能放心出差了。今天就把我的制作过程全盘托出,保准你看完也能跟着做一个。
我最初踩过的坑
在正式讲做法之前,我想先说说我踩过的坑。
第一个坑是水泵选型。我第一次在网上买了一个小型潜水泵,十几块钱那种。结果用了三天,水泵就把花盆的土给泡烂了——浇水量完全不可控,整盆土都是稀泥。
第二个坑是定时器精度。我买了一个机械定时器,看起来挺靠谱,但实际运行后发现误差很大。设定每隔24小时浇一次,结果有时候22小时就浇了,有时候又拖到26小时,植物根本受不了这种节奏。
第三个坑是水位监测。我一开始用简易的水桶加水,没有水位传感器,结果有一次出门三天,水桶见底了,水泵空转烧坏了。这笔钱算是白花了。
这些教训告诉我:做东西之前,要想清楚到底需要什么功能,而不是什么都往上面堆。
我要做的装置长什么样
我想要的灌溉装置,核心功能其实就三个:
定时浇水:每天固定时间浇一次,每次浇5秒就够了。
自动补水:水箱缺水的时候自动从大储水桶里吸水补充。
干烧保护:水泵空转的时候自动断电,防止烧坏。
这三个功能听起来简单,但组合起来就是一套完整的自动灌溉系统了。下面我就一件一件来说。
材料清单与费用
我去淘宝、拼多多把材料都买齐了,总共花了 98块7毛钱。下面是详细清单:
| 材料 | 型号/规格 | 数量 | 单价 | 小计 |
|---|---|---|---|---|
| 微型潜水泵 | 3V-6V 小功率 | 1 | ¥8.5 | ¥8.5 |
| Arduino Nano | 兼容版 | 1 | ¥12 | ¥12 |
| 继电器模块 | 5V 单路 | 1 | ¥3.5 | ¥3.5 |
| 土壤湿度传感器 | 电容式(防水型) | 2 | ¥9.9 | ¥19.8 |
| DS3231 高精度时钟模块 | I2C接口 | 1 | ¥6.5 | ¥6.5 |
| 12V 适配器 | 1A输出 | 1 | ¥8 | ¥8 |
| 杜邦线 | 公对母/母对母/公对公 | 1套 | ¥5 | ¥5 |
| 透明软管 | 内径4mm | 1米 | ¥3 | ¥3 |
| 小水桶 | 2L容量(旧水桶改造) | 1 | 0 | 0 |
| 大储水桶 | 10L容量 | 1 | ¥15 | ¥15 |
| 面包板 | 830孔 | 1 | ¥4 | ¥4 |
| 按钮开关 | 轻触开关 | 2 | ¥2 | ¥4 |
| 合计 | ¥98.8 |
注:大储水桶可以用家里的旧油桶、大号饮料瓶代替;透明软管可以用鱼缸用的增氧管。
电路连接详解
这一块是核心,我尽量说得细一点,看不懂的地方可以多看几遍。
电路整体框架
Arduino Nano ──┬── 继电器模块(控制水泵)
├── DS3231时钟模块(I2C)
├── 土壤湿度传感器1(土壤检测)
└── 土壤湿度传感器2(水箱水位检测)
具体接线
1. Arduino Nano 与 DS3231 时钟模块
DS3231用的是I2C通信,只有四根线:
| DS3231 | Arduino Nano |
|---|---|
| VCC | 5V |
| GND | GND |
| SDA | A4 |
| SCL | A5 |
这里有个小细节:DS3231的VCC接5V,不是3.3V。这个模块本身有稳压电路,接5V没问题。我第一次接反了,模块直接冒烟了,心疼了好一会儿。
2. Arduino Nano 与 继电器模块
继电器模块控制水泵的电源通断:
| 继电器模块 | Arduino Nano |
|---|---|
| VCC | 5V |
| GND | GND |
| IN | D8(我选的这个引脚) |
继电器的COM端接12V适配器的正极输出,NO端接水泵的正极。水泵的负极直接接12V适配器的负极。
12V适配器(+) ──→ 继电器COM ──→ 继电器NO ──→ 水泵(+)
12V适配器(-) ──→ 水泵(-)
这里要注意:继电器模块用的是”低电平触发”,也就是说Arduino输出LOW的时候继电器吸合,水泵通电。这个逻辑跟我一开始的预期相反,差点把我绕晕了。
3. Arduino Nano 与 土壤湿度传感器
电容式土壤湿度传感器有三根线:
| 传感器 | Arduino Nano |
|---|---|
| VCC | 5V |
| GND | GND |
| AO(模拟输出) | A0(土壤湿度检测)/ A1(水位检测) |
这个传感器输出的值是模拟量,0-1023之间。数值越大代表土壤越湿,数值越小代表越干。不同品牌和型号的传感器数值范围不一样,我买的是电容式,干燥时输出约750-800,湿润时约400-500。
小技巧:拿到传感器之后,先把它插进干燥的土里读一次数值,再插进泡过水的土里读一次,记录这两个值,后面的阈值就好定了。
4. 两个传感器的分工
- 传感器1插在花盆土壤里,检测土壤湿度
- 传感器2插在水箱里,检测水位高低(相当于一个浮球开关的替代方案)
代码部分
我用的是Arduino IDE写的程序。代码分几个部分:初始化、读取传感器、控制逻辑、定时调度。
先安装这两个库:
RTClib(DS3231时钟库)Wire(I2C通信库,Arduino IDE自带)
#include <Wire.h>
#include <RTClib.h>
// 引脚定义
const int PUMP_PIN = 8; // 水泵控制引脚(接继电器)
const int SOIL_SENSOR_PIN = A0; // 土壤湿度传感器
const int WATER_SENSOR_PIN = A1; // 水箱水位传感器
const int SETUP_BUTTON = 2; // 设置按钮
const int MODE_BUTTON = 3; // 模式切换按钮
// 参数设定
const int SOIL_DRY_THRESHOLD = 700; // 土壤干燥阈值(根据实际调整)
const int WATER_LOW_THRESHOLD = 600; // 水箱缺水阈值(根据实际调整)
const int WATER_FULL_THRESHOLD = 350; // 水箱满水阈值
const int WATER_PUMP_DURATION = 5000; // 每次浇水5秒(毫秒)
RTClib rtc;
bool manualMode = false;
bool pumpRunning = false;
unsigned long lastWaterTime = 0;
const unsigned long INTERVAL = 86400000; // 24小时(毫秒)
void setup() {
pinMode(PUMP_PIN, OUTPUT);
pinMode(SETUP_BUTTON, INPUT_PULLUP);
pinMode(MODE_BUTTON, INPUT_PULLUP);
digitalWrite(PUMP_PIN, HIGH); // 继电器默认断开(低电平触发)
Serial.begin(9600);
if (!rtc.begin()) {
Serial.println("找不到RTC模块!");
while (1);
}
// 如果是第一次使用,解开下面这行注释来设置时间
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
Serial.println("自动灌溉系统启动");
}
void loop() {
DateTime now = rtc.now();
// 检查水箱水位,自动补水
int waterLevel = analogRead(WATER_SENSOR_PIN);
if (waterLevel > WATER_LOW_THRESHOLD) {
// 水位低,启动水泵从大桶往小桶补水
activatePump(3000); // 补水3秒
Serial.print("水位过低,已补水。时间:");
Serial.println(now.toString());
}
// 检查土壤湿度,自动浇水
int soilMoisture = analogRead(SOIL_SENSOR_PIN);
if (soilMoisture > SOIL_DRY_THRESHOLD) {
// 土壤太干,浇水
if (millis() - lastWaterTime > INTERVAL) {
activatePump(WATER_PUMP_DURATION);
lastWaterTime = millis();
Serial.print("土壤干燥,已浇水。时间:");
Serial.println(now.toString());
}
}
// 手动模式检测
if (digitalRead(MODE_BUTTON) == LOW) {
manualMode = !manualMode;
delay(300); // 防抖
}
if (manualMode && digitalRead(SETUP_BUTTON) == LOW) {
activatePump(2000);
delay(300);
}
delay(500);
}
void activatePump(unsigned long duration) {
if (pumpRunning) return;
digitalWrite(PUMP_PIN, LOW); // 继电器吸合,水泵启动
pumpRunning = true;
Serial.println("水泵启动");
delay(duration);
digitalWrite(PUMP_PIN, HIGH); // 继电器断开,水泵停止
pumpRunning = false;
Serial.println("水泵停止");
}
代码里的阈值数字(SOIL_DRY_THRESHOLD、WATER_LOW_THRESHOLD等)需要根据你实际测试的数值来调整,我标注的地方就是需要你实测的。
组装过程
把代码烧录进Arduino之后,就该组装了。
第一步:固定电子元件
我把Arduino Nano、继电器模块、DS3231时钟模块都插在了面包板上。面包板比洞洞板更适合新手,不用焊接,改起来也方便。
第二步:水管连接
用透明软管连接水泵进出水口。进水管插到大储水桶里,出水管插到小水桶(放在花盆旁边的那个)。软管我用了一个小夹子固定在水泵接口上,防止水压把管子冲掉。
第三步:传感器放置
- 土壤湿度传感器插在离花盆边缘5厘米深的地方,不要太深也不要太浅
- 水位传感器悬在水箱底部上方2厘米处,不要碰到底部,这样检测更准确
第四步:整体固定
我把大储水桶放在阳台 lowest 的位置(利用重力辅助供水),小水桶和电子元件放在花盆旁边。用扎带把水管固定好,避免垂来垂去。
调试与优化
装完之后别急着走人,先测试几天。
测试土壤传感器:
把传感器插进干燥的土里,看Serial Monitor上的数值。如果数值在700以上,说明干燥阈值设对了。把传感器插进水里,数值应该降到400以下。如果数值变化不明显,可能是传感器质量问题,建议换一个电容式的。
测试继电器逻辑:
继电器是低电平触发,这个很容易被搞反。在代码里你可以先加一段测试代码,让水泵每隔几秒自动启停一次,观察继电器的声音——吸合的时候会有”嗒”的一声。
测试水箱补水:
把小水桶的水放掉一半,观察系统会不会自动从大桶吸水。如果补水太多导致溢出,就缩短补水时间(把3000改成2000);如果补不上来,就延长时间。
实际应用效果
我用这个装置跑了三个月,试了几种不同的植物,效果还不错:
- 绿萝:每周需要浇水2-3次,设定每天上午9点浇5秒,生长状态稳定
- 多肉:不喜欢太湿,我把阈值调高了,让土壤更干一些才浇水,反而长得更好
- 薄荷:耗水快,我把浇水时间从5秒延长到10秒,状态一直很精神
出差两周回来, plants 全都好好的,叶子还是绿的。朋友来我家参观的时候,我还现场演示了一下——拔掉电源,装置自动切换到备用电池(我加了一个5V充电宝模块,成本4块钱),照样能工作。
可能遇到的问题与解决方案
问题一:水泵声音太大
我用的这款微型潜水泵噪音大概40分贝,在阳台晚上能听见。后来我在水泵下面垫了一块海绵,噪音降到了30分贝左右,基本不影响休息。
问题二:传感器生锈
如果你用的是电阻式土壤湿度传感器(只有两根金属探针那种),用两个月就会生锈,读数会漂移。强烈建议买电容式的,外层有塑料包裹,防水防腐蚀。
问题三:停电怎么办
这个装置停电之后就停了。如果你想保证停电也能工作,可以加一个UPS模块,或者直接用一个18650电池+充电模块,成本大概15块钱。
问题四:不同植物需求不同
我的装置只控制一盆花。如果你有多个花盆,每个植物的需水量不一样,那就要么做多套装置,要么在代码里加多个土壤传感器和更多的控制逻辑。后者需要升级硬件,可以考虑换成Arduino Mega或者ESP32,引脚更多。
进阶升级方向
等这个基础版本跑稳了,如果你想进一步升级,有几个方向可以考虑:
加装WiFi模块:用ESP8266或者ESP32替代Arduino Nano,就可以在手机上看土壤湿度、远程控制浇水了。
加装太阳能板:在阳台光照好的地方加一块5V 2W的太阳能板,配合充电模块,可以做到能源自给自足。
多盆联动:用一个控制器控制多个花盆,每个花盆独立监测、独立浇水,适合多肉爱好者。
写在最后
这套装置从买材料到安装调试,大概花了我一个周末的时间。成本不到一百块,但省下了出差期间请人浇花的钱,更重要的是——再也不用担心了。
做创客这件事,门槛其实不高。关键是要有耐心,一步一步来。我第一次做的时候也是各种翻车,水泵烧了、模块冒烟了、代码写错了植物全枯了(这个是真的痛)。但每次解决问题的时候,那种成就感也是真的爽。
希望我的经验能帮到你。如果你的花盆也有类似的烦恼,不妨自己动手做一个。一百块钱,换来的是两个月的安心,还有动手的乐趣。
有什么疑问随时在评论区问我,看到都会回。祝你制作顺利!
