Uncategorized

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:キャリブレーション

自動化する前に、土の「乾き」と「湿り」の値を調べる必要があります:

  1. センサーを乾いた土に挿す → アナログ読み取り値を記録(例:3200)
  2. 湿った土に挿す → 読み取り値を記録(例:1400)
  3. しきい値を計算 — この値未満=十分に湿っている、超える=水やりが必要
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:設置

  1. 容量式土壌水分センサーを植木鉢の土に挿す
  2. 水ポンプをチューブで植物まで繋ぎ、水容器に設置
  3. ESP32 に USB または18650 バッテリーシールドで給電
  4. OLED ディスプレイにリアルタイムの水分率とポンプ状態が表示される
  5. 1時間ごとにシステムが土壌水分をチェックし、自動で水やり

なぜ容量式センサーのほうがいいのか

このシステムは容量式(キャパシティブ)の土壌水分センサーを使います(抵抗式ではありません)。抵抗式は金属プローブが露出していて、湿った土の中で数週間で腐食します。容量式は電子部品を保護層の内側に密封するので、劣化せずに何年も使えます。

さらに進めるには

  • WiFi + MQTT を追加 — 水分データをスマホに転送(MQTT チュートリアルと組み合わせる)
  • センサーを複数追加 — マルチプレクサー(CD4051BE)で1つの ESP32 から複数の植物を監視
  • 水位センサーを追加 — 水タンクが少なくなったらアラート
  • Home Assistant 連携 — スマートホームダッシュボードからポンプを制御
  • 太陽光発電 — 5V ソーラーパネル+18650 バッテリーシールドで屋外常設も可能

Leave a Reply

Your email address will not be published. Required fields are marked *