Arduino + WiFi + IFTTT 自动办公室植物浇水系统:从土壤湿度到推送通知的完整物联网闭环
项目动机
办公室绿植因疏于浇水枯萎,作为 IoT 团队决定用技术解决:Arduino Due/Zero + Anduino WiFi 扩展板 + 电容式土壤湿度传感器 → Adafruit IO (MQTT) → IFTTT 阈值触发 → 推送/邮件/短信提醒浇水。实现“植物会说话”的数字化养护。
硬件架构
| 模块 | 选型 | 关键参数 |
|---|---|---|
| 主控 | Arduino Due / Zero | 3.3V 逻辑, SAM3X8E / SAMD21, 多串口 |
| WiFi | Andium Anduino WiFi Shield | ATWINC1500, 802.11 b/g/n, SPI 接口 |
| 传感器 | 电容式土壤湿度传感器 | 3.3V 供电, 模拟输出, 耐腐蚀, 白线以上不可浸水 |
| 供电 | USB 5V 或 7-12V DC | 由于 Due/Zero 为 3.3V,传感器直供 3.3V |


传感器原理与安装
电容式传感器以 PCB 走线形成电容极板,土壤介电常数随含水率变化(干土 ~2-5,水 ~80),测量电容变化输出电压。关键安装规范:
- 垂直插入根系区,白色绝缘线标记线以上严禁入土
- 避开施肥颗粒、金属网,防止局部电场畸变
- 引线远离电机/继电器,必要时加屏蔽层接地

校准流程(关键步骤)
- 传感器悬空自然干燥 30 分钟 → 记录
dryVal(如 807) - 传感器垂直插入水杯至白线处 → 记录
wetVal(如 415) - 代码中映射:
relHumidity = map(sensorVal, dryVal, wetVal, 0, 100)
// 校准草稿代码
int inputPin = A1;
void setup() { Serial.begin(115200); delay(3000); }
void loop() {
int val = analogRead(inputPin);
Serial.print("Raw: "); Serial.println(val);
delay(3000);
}
云端数据链路
[Arduino] --WiFi/MQTT--> [Adafruit IO Feed: officePlants] --IFTTT Webhook--> [推送/邮件/短信]
- Adafruit IO:建立 Feed
officePlants,记录 0-100% 相对湿度 - MQTT 主题:
username/feeds/officePlants - 发布周期:10 分钟(可调),QoS 1 保证送达
核心固件(关键片段)
#include <WiFi101.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include "AnduinoLCD.h" // 可选:板载 LCD 显示
#define WLAN_SSID "YourSSID"
#define WLAN_PASS "YourPassword"
#define AIO_SERVER "io.adafruit.com"
#define AIO_PORT 1883
#define AIO_USER "your_username"
#define AIO_KEY "your_aio_key"
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_PORT, AIO_USER, AIO_KEY);
Adafruit_MQTT_Publish humidityPub = Adafruit_MQTT_Publish(&mqtt, AIO_USER "/feeds/officePlants");
const int DRY_VAL = 807; // 你的校准值
const int WET_VAL = 415;
int humidityPrev = 0;
void setup() {
Serial.begin(115200);
connectWiFi();
connectAdafruit();
// LCD 初始化...
}
void loop() {
// 保持 MQTT 连接
if (!mqtt.ping(3)) { if (!mqtt.connected()) connectAdafruit(); }
int raw = analogRead(A1);
int humidity = map(raw, DRY_VAL, WET_VAL, 0, 100);
humidity = constrain(humidity, 0, 100);
// 发布
char buf[4]; sprintf(buf, "%d", humidity);
if (humidityPub.publish(buf)) {
Serial.print("Published: "); Serial.println(humidity);
updateLCD(humidity, humidityPrev);
}
humidityPrev = humidity;
delay(600000); // 10分钟
}
void connectWiFi() {
WiFi.begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print('.'); }
Serial.println(" WiFi OK");
}
void connectAdafruit() {
int8_t ret;
while ((ret = mqtt.connect()) != 0) {
Serial.print("MQTT retry: "); Serial.println(ret);
delay(1000);
}
Serial.println("Adafruit IO Connected!");
}
IFTTT 告警配置
- IFTTT 新建 Applet:If This → Adafruit IO → “Monitor a feed” → 选择
officePlants→ “Value below” → 设定 20(%) - Then That 可选多动作:
- Notifications(手机推送)
- Email(发送详细湿度值)
- SMS(Twilio,紧急提醒)
- Google Sheets(自动记录日志)
- Webhooks(触发自动浇水电磁阀/蠕动泵)



实测数据样例

曲线显示:浇水后湿度跃升至 90%+,随后指数衰减;阈值 20% 触发告警准确对应需浇水时刻。
常见问题与优化
| 问题 | 原因 | 对策 |
|---|---|---|
| 读数漂移/异常 | 传感器腐蚀、施肥盐分、温度漂移 | 定期重新校准、改用陶瓷电容/电阻式传感器、加温度补偿 |
| MQTT 频繁断连 | WiFi 信号弱、路由器踢闲连接 | 增大 ping 间隔、加心跳、固定 IP、外置天线 |
| IFTTT 不触发 | Feed 名称错、阈值逻辑反、Applet 关闭 | 检查 Feed 完整路径、测试手动发布、查看 IFTTT 活动日志 |
| LCD 显示乱码 | 字符数组未终止、刷新过快闪屏 | 补 '\0'、脏矩形更新、降低刷新率 |
进阶演进
- 自动浇水执行器:IFTTT Webhook → ESP8266 继电器 → 12V 蠕动泵 + 定时阀,实现全闭环
- 多盆植物管理:I²C 多路复用器 (TCA9548A) 接 8 路传感器,单 Due 管理
- 边缘推理:移植 TensorFlow Lite Micro,学习干湿周期预测最佳浇水时机
- 能量采集:太阳能板 + 充电管理 IC (BQ25570) + 超级电容,免维护供电
- 数据可视化:Grafana + InfluxDB 长期存储,构建植物健康数字孪生
资源链接
- Anduino 库:GitHub
- Adafruit IO 文档:MQTT/HTTP API
- IFTTT 平台:创建 Applet
制造工艺
- 化肥:科学、生产与可持续未来
- DIY 蓝牙控制 Arduino 间谍小车
- FlickMote:基于手势的智能家居红外遥控器
- DIY Arduino TV-B-Gone:万能关机遥控器
- 自制大尺寸LED主时钟带闹钟功能 — 12米外清晰可见
- Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
- Arduino 项目优化供电方案:从按键开关到电池监测与数据记录
- Arduino 井字棋游戏:MAX7219 点阵屏 + 纸板外壳 DIY
- TinyML 植物健康评估:Arduino Nano 33 BLE Sense + 步进电机扫描建模
- 从零构建智能 Arduino 四足机器人:完整指南
- DIY Arduino 手柄方向盘 - 游戏竞速模拟器自制指南
- 利用 Arduino Nano R3 自制全功能 CNC 雕刻机