【ESP32 DIY】静電容量式土壌水分センサーで自動水やりシステムを自作!電磁弁制御&しきい値調整の完全ガイド

「畑やベランダ菜園の水やり作業を自動化したい…」

「夏の猛暑期や数日間の旅行中、大切な野菜や観葉植物が枯れないか心配…」

そんな悩みを一発で解決するのが、ESP32と静電容量式土壌水分センサー(Capacitive Soil Moisture Sensor v2.0)を使った「自動水やりシステム」です!

本記事では、電子工作やマイコン制御が初めての方でも迷わないよう、回路設計からキャリブレーション(校正)、プログラミング、実際の電磁弁制御までをステップバイステップで徹底解説します。

さらに記事の最後には、「キッチンやリビングで育てるハーブ・観葉植物用の省スペース構成」や「ソーラーパネルによる完全電源コードレス(オフグリッド)化」の応用コラムも用意しました!

電気工事士の視点から、安全性やノイズ対策(整流用ダイオード等)にも配慮した実践的な設計になっていますので、ぜひ最後までお付き合いくださいね!

今回制作するのは、「土の乾燥具合をセンサーで常時監視し、設定した水分量を下回ったら自動でバルブ(電磁弁)を開いて水やりをする」スマート灌水システムです。

全体の制御フローは以下のようになります。

  1. 土壌水分センサーで土の中の水分量(電圧値)を計測
  2. ESP32(マイコン)がその値を読み取り、「水分量○%以下か?」を判定
  3. 乾燥していればリレーモジュールに信号を送り、24V電源をONにして電磁弁を開く
  4. 水が行き渡り、土が潤ったら自動で電磁弁を閉じて待機モードに戻る

🌱 システム制御フロー図

【1. 計測】
土壌水分センサー
Capacitive v2.0
アナログ信号 ➔
【2. 判定】
ESP32
しきい値判定
3.3V信号 ➔
【3. スイッチ】
リレーモジュール
1チャンネル
電源ON/OFF ➔
【4. 動作】
電磁弁 / ポンプ
24Vまたは5V
自動給水 ➔
【5. 給水】
植物・鉢植え 🪴
散水完了

土壌水分センサーには大きく分けて「抵抗式(金属露出型)」と「静電容量式」の2種類があります。

ネットショップでよく売られている数百円の抵抗式センサー(金属のクシのような形をしたもの)は、土の中に挿して微弱な電流を流し続けるとわずか数週間で金属部が電気分解を起こして錆びて壊れてしまいます。

そのため、今回のシステムでは土に接する部分がプリント基板で保護され、錆びずに長期間安定して使える「静電容量式(v2.0)」を採用します。

1. 必要なパーツと準備(パーツリスト)

設置場所や用途に合わせてパーツを選びましょう!マイコン(ESP32)や土壌水分センサー、リレーモジュールなどの制御部品はどちらの構成でも共通です。

🛒 用途別パーツ構成バリエーション表

項目(パーツ種別) ① 本格24V構成(畑・庭・水道直結) ② 室内・手軽5V構成(キッチンハーブ・鉢植え)
給水バルブ / ポンプ 24V 電磁弁(ソレノイドバルブ)
水道圧に対応する常時閉(NC)タイプ
5V 小型ソレノイドバルブ
または 5V ミニ水中ポンプ
ペットボトルやタンクから小型チューブで給水
駆動用電源 24V AC/DC電源アダプター
容量 1A〜2A 程度のコンセント電源
5V USB電源(スマホ充電器)
または 小型5Vソーラー+モバイルバッテリー
制御マイコン ESP32 開発ボード(Freenove FNK0061 B 等)
システム全体の頭脳(3.3V動作・12bit ADC内蔵)
土壌水分センサー 静電容量式土壌水分センサー (Capacitive v2.0)
電極が露出せず腐食(電気分解)に強い長寿命タイプ
スイッチモジュール 1チャンネル リレーモジュール(フォトカプラ絶縁型・5V駆動)
ESP32の制御信号で電磁弁・ポンプの電源を物理的に開閉
サージ保護用部品 整流用ダイオード 1本(1N4007 等)
電磁弁/ポンプOFF時の逆起電力(アークサージ)を吸収し、マイコンやリレーを保護
配線・実験用具 ブレッドボード & ジャンパーワイヤ(オス-メス、オス-オス)
⚡ 電気工事士の技術コラム:リレーの「DC定格」とアーク放電に関する注意点
メカニカルリレーのモジュールを購入する際、刻印に「125VAC / 250VAC」の記載しかなくDC(直流)の表記がない場合があります。
【注意】「ACで使えるからDCでも大丈夫」と考えるのは非常に危険です。
交流(AC)は周期的に電圧が0Vになる(ゼロクロス)ためアーク放電が自然に消えやすいのに対し、直流(DC)は電圧が一定であるためアーク放電が消えにくく、接点が溶着・焼損しやすい特性があります。
そのため、DC24VやDC5Vの電磁弁を制御する場合は、必ずモジュールのデータシート等で「DC定格(例:30V DC 10A 等)」が規定されている製品を選定してください。また、コイル遮断時のスパイク電圧を防ぐため、バルブ側に整流用ダイオード(フライバックダイオード)を並列接続することが回路保護の必須条件となります。

2. 回路設計と配線図(基本構成)

ESP32のGPIO出力(3.3V信号)で、24V駆動の電磁弁を安全に制御するための配線設計です。

ピン接続表(ピンアサイン)

  1. 土壌水分センサー ↔ ESP32
    • VCC ➔ ESP32 3.3V(または5V)
    • GND ➔ ESP32 GND
    • AOUT(アナログ出力) ➔ ESP32 GPIO 34(ADC1チャンネル)
  2. リレーモジュール ↔ ESP32 / 電源
    • VCC ➔ ESP32 5V(またはVIN)
    • GND ➔ ESP32 GND
    • IN(制御信号) ➔ ESP32 GPIO 26
  3. リレー接点 ↔ 24V電源 ↔ 24V電磁弁
    • 24V電源(+) ➔ リレー COM(共通端子)
    • リレー NO(常時開端子) ➔ 24V電磁弁の片側リード線
    • 24V電源(-) ➔ 24V電磁弁のもう片側のリード線
    • ※電磁弁の端子間に並列で整流用ダイオード(1N4007)を接続(カソード/帯側を24V(+)側に配置)

3. キャリブレーション(土壌水分センサーの校正手順)

静電容量式土壌水分センサー(Capacitive Soil Moisture Sensor v2.0)は、土壌の中にある水分の割合(比誘電率)を電圧の変化として読み取ります。

しかし、センサーの個体差や動作電圧(3.3V給電か5V給電か)、使用する土の種類によって出力される数値が変わります。
そのため、プログラムを書き込む前に必ず「乾いている時の値(空中)」と「濡れている時の値(水中)」を事前に計測する「キャリブレーション(校正作業)」を行います。

ステップ1:Arduino IDEを起動してボードとポートを設定する

  1. パソコンで 「Arduino IDE」 アプリを起動します。
  2. ESP32開発ボードをUSBケーブルでパソコンに接続します。
  3. 画面上部のメニューから、お使いのボードとシリアルポートを選択します。
    • ボード選択:ツール ➔ ボード ➔ ESP32 Arduino ➔ ESP32 Dev Module(またはご使用のボード名)
    • ポート選択:ツール ➔ シリアルポート ➔ 接続されているCOMポート(例: COM3 や /dev/cu.usbserial-xxx)を選択

ステップ2:生値計測用のテストプログラム(スケッチ)を書き込む

新しいスケッチウィンドウを開き、以下の「測定用プログラム」をコピー&ペーストして貼り付けます。


// センサーの接続ピン(GPIO 34)
const int SOIL_SENSOR_PIN = 34;

void setup() {
// パソコンとの通信速度を115200bpsに設定
Serial.begin(115200);

// ESP32のアナログ入力(ADC)解像度を12bit(0〜4095)に設定
analogReadResolution(12);

Serial.println("--- センサー校正モード起動 ---");
}

void loop() {
// アナログ値をそのまま読み取る
int rawValue = analogRead(SOIL_SENSOR_PIN);

Serial.print("Raw ADC Value (生値): ");
Serial.println(rawValue);

delay(1000); // 1秒ごとに測定してシリアル出力
}

画面左上の 「書き込みボタン(右矢印 ➔)」 をクリックし、プログラムをESP32に転送(Upload)します。画面下部に Done uploading. と表示されれば準備完了です!

ステップ3:シリアルモニタを開いて数値を測定する

  1. Arduino IDE画面の右上にある 「シリアルモニタアイコン(虫眼鏡マーク 🔍)」 をクリックします(またはメニューの ツール ➔ シリアルモニタ)。
  2. シリアルモニタ画面が開いたら、右下の通信速度(ボーレート)設定を 115200 baud に合わせます。
  3. 画面上に Raw ADC Value (生値): XXXX と1秒ごとに数値が流れ始めるのを確認します。

ステップ4:「空中(乾燥)」と「水中(湿潤)」の2つの値をメモする

シリアルモニタを見ながら、以下の2つの状態の数値をメモ帳などに書き留めておきます。

① 空中での測定(Air Value ➔ 水分量 0% の基準)

  • センサーを手で持ち、先端が何にも触れていない「完全乾燥状態(空中)」にします。
  • シリアルモニタに表示される数値を読み取ります。
    • 計測例:3200 前後(※この数値が「土がカラカラで水分量 0%」の基準値になります)

② 水中での測定(Water Value ➔ 水分量 100% の基準)

  • コップに水を入れ、センサーの先端(白枠の限界線まで)を水に浸します。
  • シリアルモニタに表示される数値を読み取ります。
    • 計測例:1500 前後(※この数値が「土が水で満たされて水分量 100%」の基準値になります)

📝 測定結果のまとめ(例)

状態状況説明測定された生値(例)割り当てる水分量
AIR_VALUE空中に浮かせた(完全乾燥)32000%
WATER_VALUE水に浸けた(完全湿潤)1500100%

ここでメモした2つの数値(例:3200 と 1500)を、次の本番用プログラムの「設定欄」に書き換えて使用します!

これでパソコンの立ち上げからシリアルモニタの操作手順、キャリブレーションのやり方まで誰でも迷わずに実践できるようになりました!

4. プログラムコード解説(自動水やり&電磁弁制御)

校正で得た2つの値(Air/Water)を使って、測定値を 0%〜100% の水分量パーセンテージ に変換し、指定したしきい値(例:30%未満)を下回ったら電磁弁(リレー)をONにするフルスケッチです。

// 📄 VEGIVOLT ESP32 自動水やりシステム制御スケッチ(Arduino IDE用)
/*
 * VEGIVOLT ESP32 自動水やりシステム制御スケッチ
 * センサー: Capacitive Soil Moisture Sensor v2.0 (GPIO 34)
 * リレー: 1チャンネルリレーモジュール (GPIO 26)
 */

const int SOIL_SENSOR_PIN = 34; // 土壌水分センサー(AOUT)
const int RELAY_PIN       = 26; // リレー制御ピン

// キャリブレーション値(ご自身の測定値に書き換えてください)
const int AIR_VALUE   = 3200; // 空中(乾燥)での測定値 (0%)
const int WATER_VALUE = 1500; // 水中(完全湿潤)での測定値 (100%)

// 自動水やりのしきい値と散水時間
const int WATERING_THRESHOLD_PERCENT = 30;    // 水分量が30%未満になったら散水開始
const unsigned long WATERING_TIME_MS  = 10000; // 1回の散水時間(10秒間)

void setup() {
  Serial.begin(115200);
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, LOW); // リレー初期状態:OFF
  analogReadResolution(12);
  Serial.println("--- VEGIVOLT 自動水やりシステム起動 ---");
}

void loop() {
  // ノイズ低減のために10回平均化
  int rawSum = 0;
  for (int i = 0; i < 10; i++) {
    rawSum += analogRead(SOIL_SENSOR_PIN);
    delay(10);
  }
  int rawValue = rawSum / 10;

  // 生値を 0% ~ 100% に変換
  int moisturePercent = map(rawValue, AIR_VALUE, WATER_VALUE, 0, 100);
  moisturePercent = constrain(moisturePercent, 0, 100);

  Serial.print("Raw: ");
  Serial.print(rawValue);
  Serial.print(" | 土壌水分量: ");
  Serial.print(moisturePercent);
  Serial.println("%");

  if (moisturePercent < WATERING_THRESHOLD_PERCENT) {
    Serial.println("【警告】乾燥検出!散水を開始します...");
    digitalWrite(RELAY_PIN, HIGH); // リレーON
    delay(WATERING_TIME_MS);       // 10秒間給水
    digitalWrite(RELAY_PIN, LOW);  // リレーOFF
    delay(60000);                  // 水分浸透待ち(1分待機)
  } else {
    Serial.println("【正常】水分量は十分です。");
  }

  delay(5000); // 5秒ごとにチェック
}

5. 実装テスト・動作確認

  1. 回路の再点検:24V電源の極性やダイオードの向き、リレーの配線が正しいか確認します。
  2. 植木鉢への設置:土壌水分センサーを植物の根元近くの土に垂直に挿し込みます。
  3. 動作テスト:
    • 土が乾いている状態でシリアルモニターを開き、「散水を開始します…」のメッセージとともにリレーが「カチッ」と鳴り、電磁弁が開くか確認します。
    • 水やりが行われ、土の水分量がしきい値(30%以上)に復帰すると、自動で「【正常】水分量は十分です。」の表示に戻り、散水が停止すれば成功です!

6. まとめ & 次回予告

今回は、ESP32と静電容量式土壌水分センサー(v2.0)を使った自動水やりシステムの構築手順を徹底解説しました!

今回達成できたこと

  • 錆びない静電容量式センサーの仕組みとキャリブレーション(校正)の習得
  • 24V電磁弁を安全に制御するリレー回路と整流ダイオードの接続
  • しきい値判定&ノイズ除去(平均化処理)を考慮した実用的プログラムの構築
  • 室内ミニハーブ栽培やソーラーオフグリッド化への応用ノウハウ

これで、毎日の水やり作業から解放され、旅行中も大切な植物を安心して育てることができるようになりますね!

次回予告(第9号記事)

次回はさらにシステムを発展させます! 「Wi-Fi連携!スマホやWebブラウザから土壌水分量をリアルタイムモニタリング&遠隔水やり(Blynk / Web Server化)」に挑戦します!

外出先からスマホで土の乾燥具合をグラフで確認したり、手動で「今すぐ水やり」ボタンを押せるスマート農業の決定版です。お楽しみに!

📝 【追記・応用】キッチンハーブ&ベランダ向け!5Vソレノイド・小型ソーラー置き換えガイド

本編では24V電磁弁を用いた本格構成を解説しましたが、「キッチンやリビングのハーブ・鉢植えで使いたい」「ベランダにコンセントがない」という場合も、パーツを少し置き換えるだけでまったく同じ回路&プログラムで動作します!

◆ ① キッチンハーブ・鉢植え用「5Vソレノイド / ミニポンプ構成」

  • 給水弁の変更: 24V電磁弁 ➔ 5V小型ソレノイドバルブ または 5Vミニ水中ポンプ
  • 電源の変更: 24V電源アダプター ➔ スマホ用5V USB充電器
  • 使い勝手: ペットボトルやガラスジャグに水を溜めて小型ポンプを沈めておけば、キッチン周りを汚さずにスマート給水が可能です。

◆ ② 完全コードレス!「ミニソーラーパネル自作オフグリッド構成(USBバッテリー不要)」

  • 電源の変更: 24V電源 ➔ 5V/6Vミニソーラーパネル + TP4056充電モジュール + 18650リチウムイオン電池 + 昇圧コンバータ
  • 自作の強み: 市販のUSBモバイルバッテリーのような「自動電源OFF機能(オートパワーオフ)」に悩まされず、太陽光だけで1年中完全コードレス自立駆動(オフグリッド化)が実現!
  • 省電力のキモ(Deep Sleep機能): ESP32のディープスリープを活用し、「1時間に1回だけ目を覚まして土壌水分を計測 ➔ 乾燥していれば給水 ➔ 再び数µAの超省電力スリープに入る」ロジックを組むことで、小さなミニソーラー1枚で完全メンテナンスフリー運用が可能です。

「👉 【関連記事】コンセント不要!ミニソーラーパネルと18650電池で作る完全自作オフグリッド水やり器の作り方(回路図&Deep Sleep完全解説)」(…執筆中…)

おすすめの記事