Arduino MKR IoT Bundle 智能植物监护仪:自动化园艺物联网实战
硬件平台:MKR IoT Bundle
本教程基于 Arduino MKR IoT Bundle (含 MKR WiFi 1010 开发板、传感器套件、面包板、导线等)。MKR WiFi 1010 集成 SAMD21 Cortex-M0+ MCU + u-blox NINA-W102 WiFi/BLE 模块,内置加密芯片 (ATECC508A) 支持 TLS 1.2,非常适合物联网安全连接。
| Bundle 内核心组件 | 用途 |
|---|---|
| MKR WiFi 1010 | 主控,WiFi/BLE,RTC,低功耗 |
| TMP36 温度传感器 | 环境温度监测 (-40~125°C) |
| 光敏晶体管 (Phototransistor) | 光照强度监测 |
| DIY 土壤湿度探针 (2根导线+1MΩ电阻) | 低成本电阻式湿度检测 |
| 微动开关、LED、电阻、电容等 | 辅助电路 |
项目目标
- 实时监测植物环境:土壤湿度、温度、光照
- 通过 Zapier Webhook 发送每日邮件报告 (含 HTML 样式、ThingSpeak 图表链接)
- 土壤过干时发送紧急报警邮件
- 数据上传 ThingSpeak 云端绘制历史趋势图
- 利用 MKR1010 硬件 RTC 实现定时任务 (每日固定时间发报)
- 学习 HTTPS 请求、证书上传、API 测试 (Postman) 等工程化技能
核心知识点 (#ProTips)
| 技能点 | 说明 |
|---|---|
| Zapier 自动化 | 无代码连接 HTTP Webhook → Gmail,处理复杂 OAuth/认证 |
| HTTPS 请求与证书 | WiFi101 库 FirmwareUpdater 上传 hooks.zapier.com 根证书 |
| RTC 零功耗定时 | td>硬件 RTC 唤醒中断,无需持续运行 loop()|
| DIY 电阻式湿度传感器 | 两根导线+1MΩ分压,间歇供电防电解 |
| ThingSpeak 数据可视化 | 免费通道存储、绘图、MATLAB 分析 |
| HTML 邮件模板 | Zapier 支持内联 CSS,打造专业外观报告 |
| Postman API 调试 | 可视化构建/测试 HTTP 请求,生成代码片段 |
步骤 1:搭建 Zapier 自动化流 (Zap)
- 注册 Zapier,创建新 Zap
- Trigger:选择 Webhooks by Zapier → Catch Hook → 生成唯一 URL (如
https://hooks.zapier.com/hooks/catch/123456/abcdef/) - Test:在浏览器打开
URL?temperature=22&moisture=300&light=800&warning=All%20good,应返回{"status":"success"} - Action:选择 Gmail → Send Email → 连接 Google 账号
- 配置邮件模板:
To: 你的邮箱
Subject: 🌱 每日植物报告 - {{querystring__temperature}}°C
Body Type: HTML
Body: (见下方 HTML 模板)
- 开启 Zap,记录 Webhook URL 供 Arduino 使用
HTML 邮件模板 (可直接粘贴到 Zapier Body)
<!doctype html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
.container{margin:10%;background:#ECF1F1;padding:5% 10%;font-family:monospace;letter-spacing:2px;}
.title{text-align:center;color:#0CA1A6;font-size:1.5em;padding:0.2vh;}
.subtitle{text-align:center;color:#0CA1A6;font-size:1.1em;padding:4%;}
.data{padding:2% 5%;margin:0 15%;background:#F7F9F9;color:#4E5B61;font-size:1em;font-weight:bold;}
.bttn{padding:3%;margin:10% 25%;background:#00979D;text-align:center;color:#F7F9F9;font-size:1.4em;}
.disclaimer{text-align:center;color:#DA5B4A;font-size:1.1em;font-weight:bold;margin-top:10%;}
.bttn:hover{background:#008184;}
a{text-decoration:none;}
</style>
</head>
<body>
<div class="container">
<h2 class="title">HELLO !</h2>
<h4 class="subtitle">Here's your daily garden update ☘</h4>
<div class="data">♨ Temperature: {{querystring__temperature}} °C</div>
<div id="humidity" class="data">☔ Moisture: {{querystring__moisture}}</div>
<div class="data">☀ Light: {{querystring__light}}</div>
<div class="disclaimer">{{querystring__warning}}</div>
<a href="https://thingspeak.com/channels/YOUR_CHANNEL">
<div class="bttn">SEE THE GRAPH</div>
</a>
</div>
</body>
</html>
步骤 2:上传 WiFi 根证书 (关键!)
MKR WiFi 1010 验证服务器证书需本地存储 CA 根证书。操作:
- Arduino IDE → 文件 → 示例 → WiFi101 → FirmwareUpdater
- 上传该草图到 MKR1010
- 打开串口监视器 (115200),输入域名:
hooks.zapier.com - 工具会自动下载并烧录该域名的证书链到 Flash 安全区
- 注意:Arduino Web Editor 暂不支持此功能,必须用桌面版 IDE
步骤 3:硬件接线 (面包板搭建)
| 传感器 | MKR1010 引脚 | 电路说明 |
|---|---|---|
| TMP36 (Vout) | A1 | VCC→3.3V, GND→GND, Vout→A1 |
| 光敏晶体管 | A0 | 上拉电阻 10kΩ 接 3.3V,集电极接 A0,发射极接 GND |
| DIY 湿度探针 | A2 | 两根导线插土壤,串联 1MΩ 接 3.3V,中点接 A2,另一根接 GND |

步骤 4:核心代码实现
4.1 发送 HTTPS 邮件请求
#include <WiFi101.h>
#include <WiFiSSLClient.h>
const char* ssid = SECRET_SSID;
const char* password = SECRET_PSWD;
String httpsRequest = SECRET_REQUEST; // Zapier Webhook URL 路径部分,如 "/hooks/catch/123/abc/"
const char* host = "hooks.zapier.com";
WiFiSSLClient client;
void send_email(float temperature, int moisture, int light, String warning) {
warning.replace(" ", "%20"); // URL 编码空格
String _temp = String(temperature);
String _moist = String(moisture);
String _light = String(light);
if (client.connect(host, 443)) {
client.println("POST " + httpsRequest + "?temperature=" + _temp + "&moisture=" + _moist + "&light=" + _light + "&warning=" + warning + " HTTP/1.1");
client.println("Host: " + String(host));
client.println("Connection: close");
client.println();
delay(1000);
while (client.available()) {
Serial.write(client.read());
}
client.stop();
} else {
Serial.println("TLS connection failed");
}
}
4.2 RTC 定时触发每日邮件
#include <RTCZero.h>
RTCZero rtc;
bool email_sent_today = false;
void setup() {
rtc.begin();
rtc.setTime(16, 0, 0); // 设置初始时间 16:00:00
rtc.setDate(4, 12, 17); // 2017-12-04
rtc.setAlarmTime(16, 1, 0); // 每天 16:01 触发
rtc.enableAlarm(rtc.MATCH_HHMMSS);
rtc.attachInterrupt(alarmMatch);
}
void loop() {
if (!email_sent_today) {
// 读取传感器...
send_email(temp, moisture, light, "Daily report");
email_sent_today = true;
}
}
void alarmMatch() { // 中断服务程序:不可有 delay/串口/网络操作
email_sent_today = false; // 仅置标志位
}
4.3 DIY 湿度传感器读取 (平均滤波)
int moisturePin = A2;
int threshold = 800; // 干燥阈值,需实测标定
int get_average_moisture() {
int sum = 0;
for (int i = 0; i < 10; i++) {
sum += analogRead(moisturePin);
delay(10);
}
return sum / 10;
}
void check_emergency() {
int m = get_average_moisture();
if (m > threshold) { // 值越大 = 越干 (视分压极性)
send_email(temp, m, light, "⚠️ Soil too dry! Water needed!");
}
}
4.4 ThingSpeak 数据上传
#include "ThingSpeak.h"
WiFiClient tsClient;
unsigned long channelID = 356392;
const char* writeAPIKey = SECRET_WRITE_API;
void upload_thingspeak() {
ThingSpeak.setField(1, get_light());
ThingSpeak.setField(2, get_temperature());
ThingSpeak.setField(3, get_average_moisture());
ThingSpeak.writeFields(channelID, writeAPIKey);
}
4.5 完整整合版草图结构
void setup() {
Serial.begin(9600);
connect_wifi();
upload_certs_if_needed(); // 仅首次
rtc_init();
thingspeak_init();
}
void loop() {
rtc.run(); // 处理闹钟中断标志
if (email_due) { send_daily_report(); email_due=false; }
if (emergency_due) { check_emergency(); emergency_due=false; }
if (thingspeak_due) { upload_thingspeak(); thingspeak_due=false; }
// 低功耗睡眠直到下一个闹钟...
rtc.standbyMode(); // SAMD21 深度睡眠,RTC 唤醒
}
ThingSpeak 可视化配置
- 登录 ThingSpeak → Channels → New Channel
- 勾选 Field 1: Light, Field 2: Temperature, Field 3: Moisture
- 保存后获取 Write API Key 填入代码
- 在「Charts」标签页可自定义图表样式、嵌入网页
Postman API 调试技巧
- 导入 Zapier Webhook URL 到 Postman
- Params 标签添加 temperature, moisture, light, warning
- 发送 POST,查看响应、自动生成 Arduino/Curl/Python 代码片段
- 利用 Environment 变量管理多环境配置
常见坑点与避坑指南
| 问题 | 原因 | 对策 |
|---|---|---|
| TLS 连接失败 (-1 / -104) | 证书未上传 / 域名不匹配 / 系统时间不对 | 跑 FirmwareUpdater 上传证书;RTC 设置正确 UTC 时间 |
| Zapier 邮件未收到 | Webhook URL 错误 / 参数名不匹配 / 免费额度用尽 (100/月) | 核对 URL 路径;参数名与 Zapier 定义一致;付费或改用其他邮件服务 |
| 湿度读数漂移/异常 | 探针电解腐蚀 / 接触不良 / 供电噪声 | 间歇供电;焊接固定探针;加 0.1µF 滤波电容 |
| RTC 闹钟不触发 | 中断标志位未清 / 睡眠模式配置错误 | 在 alarmMatch() 仅置 volatile bool 标志;loop 中处理 |
| ThingSpeak 写入失败 | API Key 错误 / 频道号错 / 网络超时 / 频率限制 (15s) | 核对 Key/ID;增加重试逻辑;间隔 ≥ 16s |
扩展方向
- 接入 Blynk 或 Arduino IoT Cloud 实现手机 App 实时监控
- 添加 电磁阀 实现全自动滴灌,结合湿度阈值闭环控制
- 利用 MKR1010 的 BLE 功能,配合手机 App 就地配网 (无需串口改代码)
- 加装 太阳能板 + 充电管理芯片 (CN3791) 实现户外离网运行
- 引入 TensorFlow Lite Micro 在设备端跑轻量模型预测病虫害/生长阶段
本教程属于 MKR IoT Bundle 官方实验系列 (含 Love You Pillow、Puzzle Box、Pavlov's Cat 等)。完整代码、原理图、Zapier 模板请访问 Arduino Project Hub 原文页面下载。掌握这套「传感器→边缘计算→云端自动化→可视化」流程,即可快速构建各类生产级 IoT 设备原型。
制造工艺