ブログ
ESP32 スマートガーデン:土壌水分センサーで自動水やり
問題
水やりを忘れて植物が枯れる。あるいは水をやりすぎて根が腐る。必要なのは、植物が実際に喉が渇いているタイミングを感知して、自動で水をやってくれる仕組みです。
ESP32、土壌水分センサー、リレーがあれば、完全自動のスマートガーデンを作れます:
- 土壌の水分を24時間365日モニタリング
- (固定スケジュールではなく)必要なときに水をやる
- 水タンクが空になったらアラートを送信
作るもの
ESP32 駆動の自動水やりシステム。1時間ごとに土壌水分を読み取り、土が乾いたら水ポンプを起動します。任意で WiFi に接続し、MQTT 経由でのリモート監視も可能。
難易度: 初心者 | 所要時間: 45分 | 費用: 部品代 約$35
必要なハードウェア(部品リスト)
| 部品 | 型番 | 数量 | 価格 | 購入 |
|---|---|---|---|---|
| マイコントローラー | ESP32 DevKitC V4 | 1 | $13.49 | 製品を見る |
| 土壌水分センサー | Capacitive Soil Moisture v1.2 | 1 | $4.49 | 製品を見る |
| リレーモジュール | 2-Channel 5V Relay | 1 | $5.24 | 製品を見る |
| ディスプレイ | 0.96″ OLED SSD1306 | 1 | $5.99 | 製品を見る |
| ブレッドボード | 830点 | 1 | $4.49 | 製品を見る |
| ジャンパーワイヤー | M-M 40本 | 1 | $2.99 | 製品を見る |
さらに、ミニ水ポンプ(5V、どのホームセンターでも約$3)とシリコンチューブが必要です。ポンプのプラス線はリレーを通して接続します。
ステップ1:配線
ESP32 ↔ 土壌水分センサー
| センサーピン | ESP32 ピン | 備考 |
|---|---|---|
| VCC | 3V3 | 電源 |
| GND | GND | 接地 |
| AOUT | GPIO 34 | アナログ出力(ADC1_CH6) |
ESP32 ↔ リレーモジュール
| リレーピン | ESP32 ピン | 備考 |
|---|---|---|
| VCC | 5V/VIN | 電源 |
| GND | GND | 接地 |
| IN1 | GPIO 26 | リレー制御信号 |
ESP32 ↔ OLED ディスプレイ
| OLED ピン | ESP32 ピン | 備考 |
|---|---|---|
| VCC | 3V3 | 電源 |
| GND | GND | 接地 |
| SDA | GPIO 21 | I2C データ |
| SCL | GPIO 22 | I2C クロック |
重要: 水ポンプはリレーの NO(ノーマリーオープン)端子と COM 端子に接続します。リレーはスイッチとして働き、GPIO 26 が LOW になるとポンプが ON になります。
ステップ2:キャリブレーション
自動化する前に、土の「乾き」と「湿り」の値を調べる必要があります:
- センサーを乾いた土に挿す → アナログ読み取り値を記録(例:3200)
- 湿った土に挿す → 読み取り値を記録(例:1400)
- しきい値を計算 — この値未満=十分に湿っている、超える=水やりが必要
DRY_VALUE = 3200 (your reading in dry soil)
WET_VALUE = 1400 (your reading in wet soil)
THRESHOLD = 2500 (trigger watering above this)
ステップ3:コードをアップロード
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// --- Pins ---
#define SOIL_PIN 34
#define PUMP_PIN 26
// --- Calibration (change these!) ---
const int DRY_VALUE = 3200;
const int WET_VALUE = 1400;
const int THRESHOLD = 2500;
const unsigned long CHECK_INTERVAL = 3600000;
const unsigned long PUMP_DURATION = 5000;
unsigned long lastCheck = 0;
void displayReading(int raw, int percent) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Smart Garden");
display.drawLine(0, 10, 128, 10, SSD1306_WHITE);
display.setCursor(0, 20);
display.printf("Moisture: %d%%", percent);
display.setCursor(0, 35);
if (percent < 40) {
display.println("Status: DRY");
display.println("Pump: ACTIVE");
} else {
display.println("Status: OK");
display.println("Pump: OFF");
}
display.setCursor(0, 55);
display.printf("Raw: %d", raw);
display.display();
}
void setup() {
Serial.begin(115200);
pinMode(PUMP_PIN, OUTPUT);
digitalWrite(PUMP_PIN, HIGH);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED not found!");
}
display.clearDisplay();
display.display();
}
void loop() {
if (millis() - lastCheck >= CHECK_INTERVAL || lastCheck == 0) {
lastCheck = millis();
int raw = analogRead(SOIL_PIN);
int percent = map(raw, DRY_VALUE, WET_VALUE, 0, 100);
percent = constrain(percent, 0, 100);
Serial.printf("Soil: %d%% (raw: %d)n", percent, raw);
displayReading(raw, percent);
if (percent < 40) {
Serial.println("Soil is dry! Watering...");
digitalWrite(PUMP_PIN, LOW);
delay(PUMP_DURATION);
digitalWrite(PUMP_PIN, HIGH);
Serial.println("Watering complete.");
}
}
}
ステップ4:設置
- 容量式土壌水分センサーを植木鉢の土に挿す
- 水ポンプをチューブで植物まで繋ぎ、水容器に設置
- ESP32 に USB または18650 バッテリーシールドで給電
- OLED ディスプレイにリアルタイムの水分率とポンプ状態が表示される
- 1時間ごとにシステムが土壌水分をチェックし、自動で水やり
なぜ容量式センサーのほうがいいのか
このシステムは容量式(キャパシティブ)の土壌水分センサーを使います(抵抗式ではありません)。抵抗式は金属プローブが露出していて、湿った土の中で数週間で腐食します。容量式は電子部品を保護層の内側に密封するので、劣化せずに何年も使えます。
さらに進めるには
- WiFi + MQTT を追加 — 水分データをスマホに転送(MQTT チュートリアルと組み合わせる)
- センサーを複数追加 — マルチプレクサー(CD4051BE)で1つの ESP32 から複数の植物を監視
- 水位センサーを追加 — 水タンクが少なくなったらアラート
- Home Assistant 連携 — スマートホームダッシュボードからポンプを制御
- 太陽光発電 — 5V ソーラーパネル+18650 バッテリーシールドで屋外常設も可能