スマートプラントコミュニケーター: Arduino MKR IoT Bundleで自動ガーデニング
必要な部品
| 部品名 | 数量 |
|---|---|
| Arduino MKR IoT Bundle (MKR1000 + センサーキット) | 1 |
使用サービス
- Zapier: Webhook受信 → Gmail送信、複雑なAPI連携をノーコードで自動化
- ThingSpeak: センサーデータのクラウド記録・グラフ化
プロジェクト概要
植物はコミュニケーションが苦手。枯らしてしまう前に、MKR1000とIoT Bundleのセンサーで「植物の声」を可視化し、メール通知・グラフ化・アラートで見守るデバイスを作ります。
ひとことで言うと
- 土壌湿度、温度、光量を監視し、植物の健康を守る
- 日次レポートメール (HTML/CSSで見やすく) とグラフリンクを自動送信
- 閾値以下で緊急アラートメール送信
使用センサー (Bundle付属)
- TMP36 温度センサー
- フォトトランジスタ (光センサー)
- DIY土壌湿度センサー (1MΩ抵抗 + 2本のワイヤーで自作)
学習目標
- ZapierによるWebhook→Gmail自動化
- ArduinoからのHTTP/HTTPSリクエスト送信
- RTCZeroライブラリでリアルタイムクロック・アラーム管理
- DIY土壌湿度センサーの原理と自作
- ThingSpeakでデータ可視化 #ProTip
- HTML/CSSでメール装飾 #ProTip
- PostmanでAPIテスト #ProTip
関連実験 (同Bundleで製作可能)
- Love You Pillow
- Puzzle Box
- Pavlov's Cat
- The Nerd
- Plant Communicator (本プロジェクト)
Zapierセットアップ (Webhook → Gmail)
- Zapierで新規Zap作成 → Trigger: Webhooks by Zapier / Catch Hook
- 生成された固有URLをコピー (例:
https://hooks.zapier.com/hooks/catch/xxxxxx/) - テスト用パラメータを付けてブラウザでアクセス:
...?temperature=0&moisture=0&light=0&warning=0 - 「Test & Review」で成功確認 → Action: Gmail / Send Email を追加
- Gmailアカウント連携 → 宛先・件名・本文を設定 (本文はHTML指定可能)
- 動作テスト後、ZapをONにする
※ 無料プランは月100リクエストまで。頻度に注意してください。
MKR1000ボードセットアップ
必要ライブラリ
WiFi101: Wi-Fi接続・ネットワークスキャンRTCZero: リアルタイムクロック・アラーム割り込み
ライブラリマネージャからインストール。
SSL証明書のアップロード (重要)
MKR1000でHTTPS通信するには、接続先ドメインのルート証明書をボードに書き込む必要があります。Zapierの場合 hooks.zapier.com を登録します。
- Arduino IDE (デスクトップ版) で
ファイル → スケッチ例 → WiFi101 → FirmwareUpdaterを開く - スケッチ内のドメインリストに
hooks.zapier.comを追加 - MKR1000に書き込み実行 (シリアルモニタで進捗確認)
注意: Arduino Web Editorでは未対応。デスクトップ版IDE必須。
HTTPリクエスト送信 (基本スケッチ)
#include
#include
const char* ssid = SECRET_SSID;
const char* password = SECRET_PSWD;
String httpsRequest = SECRET_REQUEST; // Zapier Webhook URLのパス部分
const char* host = "hooks.zapier.com";
WiFiSSLClient client;
void setup() {
Serial.begin(9600);
while (!Serial); delay(2000);
Serial.print("Connecting: "); Serial.println(ssid);
while (WiFi.begin(ssid, password) != WL_CONNECTED) { Serial.print("."); delay(500); }
Serial.println("\nWiFi connected");
}
void loop() {
float temperature = 22;
int moisture = 150;
int light = 40;
String warning = "This is a warning message";
warning.replace(" ", "%20"); // URLエンコード (スペース→%20)
send_email(temperature, moisture, light, warning);
delay(20000); // 20秒ごと (テスト用。本番はRTCアラームで制御)
}
void send_email(float temperature, int moisture, int light, String warning) {
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()) { char c = client.read(); Serial.write(c); }
client.stop();
} else {
Serial.println("Connection failed");
}
}
RTCとアラームで定期実行
MKR1000内蔵RTCを使い、毎日決まった時刻にメール送信。アラームは割り込みで動作するため、割り込み内では delay() 禁止。フラグ変数で loop() 側に処理を委譲します。
#include
RTCZero rtc;
const byte seconds = 0, minutes = 0, hours = 16; // 16:00:00
const byte day = 4, month = 12, year = 17; // 2017/12/4
bool email_sent = false;
void setup() {
Serial.begin(9600); while(!Serial); delay(2000);
rtc.begin();
rtc.setTime(hours, minutes, seconds);
rtc.setDate(day, month, year);
rtc.setAlarmTime(16, 1, 0); // 16:01にアラーム
rtc.enableAlarm(rtc.MATCH_HHMMSS);
rtc.attachInterrupt(alarmMatch);
}
void loop() {
if (!email_sent) { send_email(...); email_sent = true; }
}
void alarmMatch() { email_sent = false; } // 割り込みでフラグクリア
DIY土壌湿度センサー
土に刺した2本のワイヤー間抵抗が湿度で変化する性質を利用。1MΩ抵抗と分圧回路を作り、アナログ入力で電圧を読み取ります。「湿っているほど抵抗が下がり、電圧が上がる (読み値が大きくなる)」のが特徴です。
int moisturePin = A2;
int threshold = 800; // 乾燥/湿潤の境界値 (実測で調整)
void setup() { Serial.begin(9600); while(!Serial); delay(2000); }
void loop() {
Serial.println(get_average_moisture());
delay(5000);
}
int get_average_moisture() {
int sum = 0;
for (int i = 0; i < 10; i++) { sum += analogRead(moisturePin); delay(10); }
return sum / 10;
}
乾燥土・湿潤土で実測し、閾値を決定してください。閾値を下回ったら「水やり必要」アラートを飛ばせます。
温度・光センサー追加
配線は回路図参照。読み取り関数:
float get_temperature() {
int reading = analogRead(A1); // TMP36 Vout
float voltage = reading * 3.3 / 1024.0;
float tempC = (voltage - 0.5) * 100; // 10mV/°C, 500mVオフセット
return tempC; // 華氏なら (tempC * 9/5) + 32
}
int get_light() { return analogRead(A0); } // フォトトランジスタ
#ProTip: ThingSpeakでデータ可視化
- ThingSpeakでチャネル作成 → Write API Key取得
ThingSpeakライブラリインストール- 以下のスケッチで1分ごとにアップロード
#include
#include
#include "ThingSpeak.h"
const char* ssid = SECRET_SSID;
const char* password = SECRET_PSWD;
WiFiClient tsClient;
unsigned long channel = 356392;
const char* writeKey = SECRET_WRITE_API;
int lightPin = A0, tempPin = A1, moisturePin = A2;
void setup() {
Serial.begin(9600); while(!Serial); delay(2000);
while (WiFi.begin(ssid, password) != WL_CONNECTED) { Serial.print("."); delay(500); }
Serial.println("\nWiFi connected");
ThingSpeak.begin(tsClient);
}
void loop() {
ThingSpeak.setField(1, get_light());
ThingSpeak.setField(2, get_temperature());
ThingSpeak.setField(3, get_average_moisture());
ThingSpeak.writeFields(channel, writeKey);
Serial.println("Sent to ThingSpeak");
delay(60000);
}
// get_temperature, get_average_moisture, get_light は上記参照
RTCアラームで1分ごと起動するよう組み込めば、継続的なログが取れます。Gmailにグラフを埋め込めないため、メール本文にThingSpeakチャートへのリンクボタンを設置するのがおすすめ。
#ProTip: HTML/CSSでメールを装飾
Zapierのメール本文タイプを「HTML」にし、以下のテンプレートを貼り付けると美しいレポートメールになります。
HELLO !
Here's your daily update about your garden ☘
♨ Temperature: {{querystring__temperature}} C
☔ Moisture: {{querystring__moisture}}
☀ Light: {{querystring__light}}
{{querystring__warning}}
SEE THE GRAPH
{{...}} はZapierがWebhookパラメータで置換してくれます。
#ProTip: PostmanでAPIテスト
HTTPリクエストの組み立て・デバッグに Postman が便利です。ZapierのWebhook URLを貼り付け、パラメータを追加して送信すれば、レスポンスと完成URLが確認できます。
完全版スケッチ (ProTip統合版)
RTCアラーム駆動で毎日決まった時刻にメール送信 + 1分ごとThingSpeakアップロード + 閾値監視アラートを統合した完全版スケッチは、元記事の「Complete sketch」セクションを参照してください。
回路図

TMP36 → A1, フォトトランジスタ → A0, DIY湿度センサー → A2 (1MΩプルダウン)
製造プロセス
- 『Reliable Plant』創刊号:メンテナンス卓越性への信頼できるガイド
- プラントメンテナンスを解き明かす:モダンインダストリーのベストプラクティス
- 肥料:科学、生産、持続可能な未来
- 集積回路(IC):現代エレクトロニクスを支える微小強力チップ
- MOSMusicプロジェクトキット: MOSFET、Arduinoで音楽同期照明制御
- ボール盤の主要構成部品と機能:ベースからモーターまで完全解説
- プラントメンテナンスの極意:信頼性の高いエネルギー生産のための実証済みプラクティス
- 内燃機関の主要コンポーネント:構造と機能
- バルク化学プラントの価値最大化:成長のための戦略
- SPICEネットリスト構文マスター:コンポーネント命名、受動・能動素子、電源定義
- 産業用IoT予測2018:スマート・プラントが製造業をどう変えるか