智能城市植物灌溉系统:基于传感器的自动化浇水方案
组件与物料
| 组件 | 数量 | 备注 |
|---|---|---|
| 土壤湿度传感器 | 2 | 任意模拟输出型均可;两电极分压电路亦可替代(可选) |
| 雨滴传感器 | 1 | |
| 牛奶瓶(水箱) | 1 | 任何可盛水、可剪裁、可固定的容器;需安装在高处 |
| 软质塑料软管 | 1 | 任意管材;作者剪去两端的跳绳中空部分 |
| 杜邦线 | 37 | 视实际布线而定 |
| SparkFun Arduino 101 发明者套件 | 1 | 含 Arduino 101、舵机、面包板、电位器、LCD |
| 塑性粘土 | 1 | 用于密封管口 |
| 短塑料杆 | 1 | 支撑出水管,防弯折 |
| 330 Ω 电阻 | 1 |
所需工具
- 剪刀
- 十字螺丝刀
- 电工胶带、普通胶带
软件与在线服务
项目详解

本装置旨在改善城市环境下的植物灌溉。基于 Arduino 101,结合板载资源与外部传感器,自动计算最佳浇水时机并执行浇水。核心原理包含三部分:
1. 重力与水压驱动供水

以牛奶瓶为水箱,配合软管、粘土密封及舵机控制。水箱置于高处,既可接收雨水,也可人工注水。重力使水流经底部出水口,舵机臂平时竖直堵住管口,浇水时转动 135° 放行,浇完复位。水压既稳固水箱又助推水流,保证持续出水。
2. TMP36 温度传感器 + Intel Curie 模式匹配引擎 (PME)

最佳浇水温度约 25°C。系统每小时采样 30 次(间隔 2 分钟),去除首次读数后取平均值,送入 PME 学习。PME 是 Arduino 101 内置的 128 神经元神经网络,能对向量数据分类。每天 8:00–21:00 记录 14 个时段的平均温度,训练后将 25°C 对应的类别(即小时数)作为次日浇水时刻。首次运行将数据存入板载串行 Flash,掉电保持;后续每天重新学习并更新浇水时间。若 PME 无法分类,则退回各月经验峰值时刻(如冬季 12:00,夏季 16:00)。
3. Intel Curie 实时时钟 (RTC) + 蓝牙低功耗 (BLE)

RTC 负责定时采样、浇水及月份判断。首次上电需手动校准时间,通过 BLE 由手机 App (nRF Connect) 以十六进制依次写入:确认字节、时、分、日、月。Arduino 101 作为外设接收数据。
硬件制作步骤
- 按 Fritzing 图接线(土壤湿度传感器可选;雨传感器与舵机引线可能需延长)。
- 电池供电时:两组 4×AA 电池盒串联,正负极相连,用电工胶带捆绑,盖子合为一体,预留开关口;粘贴在 Arduino 底部,便于抽换。
- 将主板放入手工篮,侧面开两槽:一为编程/USB 供电,一为外设引线出口。
- 剪去牛奶瓶上部,底部钻孔插入软管,粘土密封上下管口。
- 舵机固定于瓶底,舵机臂绑扎软管中段与塑料杆,杆上端也固定软管。
- 水箱固定在高处台面。
- 植物置于出水口正下方;土壤湿度传感器插入盆土(可选),雨传感器贴地放置;外设插入主板,主板稍离水箱与植物。
编程与运行
使用 Arduino IDE(Curie Core 2.0.2+)烧录附件代码。首次上电等待 BLE 连接,通过 nRF Connect 依次发送十六进制时间数据,断开后系统等待次日 8:00 开始学习。若 Flash 已有数据则直接用作浇水时刻,否则进行为期 14 小时的采样学习。浇水时检测雨天或土壤过湿(可选)则跳过当天。循环往复,实现全自动优化灌溉。
代码
Arduino 101 灌溉系统主程序
需安装 CuriePME 库(GitHub),其余库 IDE 自带。代码含详细注释,此处仅展示关键片段:
/* 城市灌溉方案:利用 CuriePME 学习温度并分类最佳浇水条件 (25°C),
在该时刻浇水,随后遗忘重学,循环执行。 */
#include "CuriePME.h"
#include <CurieBLE.h>
#include <CurieTime.h>
#include <SerialFlash.h>
#include <SPI.h>
#include <LiquidCrystal.h>
#include <Servo.h>
Servo waterPipe;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#define THERMOMETER A3
#define RAIN_SENSOR 1
#define HUMIDITY1 A4
#define HUMIDITY2 A1
// ... 变量定义、BLE 服务与特征值设置 ...
void setup() {
waterPipe.attach(9); waterPipe.write(0);
pinMode(RAIN_SENSOR, INPUT);
lcd.begin(16, 2); lcd.clear();
// BLE 初始化,广播 "Arduino 101",等待手机写入时间
// 读取 Flash,决定是否首次学习
// 首次学习:8:00-21:00 每小时采样 30 次,取平均送入 PME,最后保存到 Flash
}
void loop() {
// 每天循环:用 PME 分类 25°C,得出类别即浇水小时;
// 无匹配则用月度默认值;随后遗忘 PME,等待 8:00 重新学习
// 浇水时检查雨传感器与土壤湿度,满足条件则舵机转动 135° 持续 7 秒
}
完整代码请下载附件 Arduino 101 Irrigation System.ino。
原理图
Fritzing 电路图(电池接左侧,土壤湿度传感器可选):
rainpoweredsmartirrigationsystem_OHtd4bVfb3.fzz制造工艺