部品 · 読了まで5分

土壌水分センサー:Arduinoで植物の自動水やり

土壌水分センサーのしくみは?抵抗式と静電容量式の違い、Arduinoとの配線、乾いた状態と濡れた状態の値によるキャリブレーション、腐食の防ぎ方、リレーとポンプでの自動水やり、ESP32とPicoでの使い方を解説します。

土壌水分センサーは、鉢や庭の土がどれだけ湿っているかを測るシンプルなセンサーです。植物が水を欲しがっていることを知らせる警告ランプから、旅行中に花に水をやるシステムまで、多くのプロジェクトの土台になっています。安価で、3本の線でArduinoにつながり、リレーと小さなポンプを加えれば、本当に役に立つ自動化が完成します。

土壌水分センサーモジュール
土壌水分センサー:フォーク形のプローブを土に挿し、コンパレーター基板からアナログ(AO)とデジタル(DO)の出力が得られます。

土壌水分センサーのしくみ

土の中の水分は、土の電気の通しやすさや電荷のたくわえ方を変えます。抵抗式センサーは、土に挿した2本の金属の端子の間の抵抗を測ります。土が湿るほど抵抗は下がります。静電容量式センサーは、コーティングされた電極のまわりの静電容量を測り、金属が土に触れることはありません。ほとんどのモジュールでは、土が乾いていると読み取り値が高く、湿っていると低くなります。

項目抵抗式(YL-69、FC-28)静電容量式(v1.2)
測るもの2本の金属の端子の間の抵抗電極のまわりの静電容量
露出した金属ありなし(コーティング済み)
腐食常時通電すると数週間ですり減る非常に丈夫
出力アナログ(AO)とデジタル(DO)アナログ
価格とても安い少し高め
向いている用途短期間の実験常設の鉢や庭のプロジェクト

配線

センサーのピンArduino UnoESP32Raspberry Pi Pico
VCCD7(測定中だけ給電する場合)または5VGPIO 25または3V3GP15または3V3
GNDGNDGNDGND
AO(AOUT)A0GPIO 34GP26
DOD2(任意)任意任意
抵抗式センサーに常に電源を入れておくと、端子を流れる電流で電気分解が起こり、数週間で金属がすり減ります。これを防ぐいちばん簡単な方法は、センサーのVCCを5Vではなくデジタルピンにつなぎ、測定するときだけ数ミリ秒オンにすることです。センサーの消費電流は数mAなので、ピンから楽に給電できます。

Arduinoで水分を読み、キャリブレーションする

センサーごと、土ごとに値は異なるため、まず自分のセンサーをキャリブレーションしましょう。センサーを空気中に置いたとき(完全に乾いた状態)と、コップの水に浸けたとき(完全に濡れた状態)の値を書き留めます。そのうえでmap()を使い、その範囲を0〜100のパーセントに変換します。コードのDRYとWETを、自分で読んだ値に置き換えてください。

C++ (Arduino IDE)
1const int SENSOR_PIN = A0;
2const int POWER_PIN = 7;       // sensörü yalnızca ölçerken besle / power only while measuring
3const int DRY = 850;           // havadayken okunan / reading in air (kendin ölç / measure yours)
4const int WET = 380;           // sudayken okunan / reading in water (kendin ölç / measure yours)
5
6void setup() {
7  pinMode(POWER_PIN, OUTPUT);
8  Serial.begin(9600);
9}
10
11int readMoisture() {
12  digitalWrite(POWER_PIN, HIGH);
13  delay(10);                                              // değerin oturmasını bekle / let it settle
14  int raw = analogRead(SENSOR_PIN);
15  digitalWrite(POWER_PIN, LOW);
16  return constrain(map(raw, DRY, WET, 0, 100), 0, 100);   // % nem / % moisture
17}
18
19void loop() {
20  int moisture = readMoisture();
21  Serial.print("Toprak nemi / Soil moisture: %");
22  Serial.println(moisture);
23  delay(2000);
24}
センサーは鉢の縁から離れた根のあたりに、毎回同じ深さで挿してください。静電容量式センサーの上部の電子回路は防水ではありません。センサーに印刷された線より深く挿さず、基板の上部はホットボンドやチューブで保護しましょう。

自動水やり:リレーとポンプ

6Vミニ水中ポンプ
ミニ水中ポンプ:3〜6 Vで動き、水の容器の中に沈めて、チューブで鉢まで水を運びます。

では、読み取り値を実際の動作に変えてみましょう。土壌水分が30%を下回ったら、ポンプを4秒間動かし、水が土に行き渡るまで1分待ってから再び測ります。この待ち時間がないと、センサーがまだ濡れていないためにポンプが動き続け、鉢が水びたしになってしまいます。ポンプはArduinoのピンから直接給電できないため、リレーかMOSFETを通して駆動してください。リレーの配線はリレーモジュールとは?を参照してください。

C++ (Arduino IDE)
1const int SENSOR_PIN = A0, POWER_PIN = 7, PUMP_PIN = 8;   // PUMP_PIN → röle IN / relay IN
2const int DRY = 850, WET = 380;
3const int START_BELOW = 30;          // %30'un altında sula / water below 30%
4const unsigned long PUMP_MS = 4000;  // her seferde 4 sn / 4 s per run
5const unsigned long SOAK_MS = 60000; // suyun yayılması için bekle / wait for the water to soak in
6
7int readMoisture() {
8  digitalWrite(POWER_PIN, HIGH);
9  delay(10);
10  int raw = analogRead(SENSOR_PIN);
11  digitalWrite(POWER_PIN, LOW);
12  return constrain(map(raw, DRY, WET, 0, 100), 0, 100);
13}
14
15void setup() {
16  pinMode(POWER_PIN, OUTPUT);
17  pinMode(PUMP_PIN, OUTPUT);
18  digitalWrite(PUMP_PIN, HIGH);      // aktif LOW röle: kapalı başla / active-LOW relay: start off
19}
20
21void loop() {
22  if (readMoisture() < START_BELOW) {
23    digitalWrite(PUMP_PIN, LOW);     // pompayı çalıştır / pump on
24    delay(PUMP_MS);
25    digitalWrite(PUMP_PIN, HIGH);    // pompayı durdur / pump off
26    delay(SOAK_MS);                  // tekrar ölçmeden önce bekle / wait before measuring again
27  }
28  delay(5000);
29}
水と電子回路がすぐそばで動いています。Arduinoとリレーは水の容器から離して高い位置に置き、配線の接続部は絶縁してください。空運転したポンプは数分で壊れます。タンクに水位センサーを付け、1日の水やりの合計時間に上限を設ければ、ポンプも家も守れます。

ESP32とRaspberry Pi Picoで土壌水分を測る

ESP32では、Wi-Fi使用中でも使えるADC1のピン(GPIO 32〜39)のどれかにセンサーをつなぎます。値は0〜4095なので、キャリブレーションをやり直してください。ESP32なら、水分量をスマートフォンに通知したり、ディープスリープで1時間に1回測定し、電池で何か月も動く鉢用センサーを作ったりできます。PicoのMicroPythonでの読み取りは次のとおりです。

MicroPython
1from machine import ADC, Pin
2import time
3
4sensor = ADC(26)               # GP26 → AOUT
5power = Pin(15, Pin.OUT)       # sensörü yalnızca ölçerken besle / power only while measuring
6DRY, WET = 52000, 24000        # kendi değerlerinle değiştir / replace with your readings
7
8def moisture():
9    power.value(1)
10    time.sleep_ms(10)
11    raw = sensor.read_u16()
12    power.value(0)
13    pct = (DRY - raw) * 100 // (DRY - WET)
14    return max(0, min(100, pct))
15
16while True:
17    print("Toprak nemi / Soil moisture: %", moisture())
18    time.sleep(2)

土壌水分はどれくらいがよい?

植物の種類目標水分の目安
サボテンと多肉植物10〜30%
ほとんどの観葉植物40〜60%
トマト、ピーマン、野菜60〜80%
シダ類と湿り気を好む植物70〜90%

これらのパーセントは、自分のセンサーの乾燥〜湿潤の範囲に対する相対値で、科学的な土の含水率ではありません。いちばんよいしきい値は、植物が本当に水を必要としているときにセンサーが何を示すかを数日かけて観察して見つけましょう。

土壌水分センサーのプロジェクトアイデア

  • 鉢の自動水やり:旅行中でも花に自動で水をやるシステムです。
  • 「のどが渇いた」アラート:土が乾くとLEDが点いたり、ブザーが鳴ったりします。
  • スマートフォンへの通知:水分が下がったら、ESP32からTelegramのメッセージを送ります。
  • 複数の鉢の水やり:鉢ごとにセンサーと小さなバルブを付けて、植物を個別に水やりします。
  • ミニ温室ステーション:DHT11で空気の湿度を、LDRで明るさも測り、すべてを1つのディスプレイに表示します。
  • スマートガーデン:雨センサーが降雨を検知したら、自動で水やりを休みます。

よくある間違いと対処法

  • 値がいつも1023またはいつも0:AOではなくDOピンを読んでいる、電源が来ていない、またはセンサー基板への線が切れています。
  • 端子が腐食して値がでたらめ:抵抗式センサーに常時給電していました。ピンから給電するか、静電容量式のモデルに替えてください。
  • 読み取り値が時間とともにずれる:土が締まったり肥料を与えたりすると導電率が変わります。ときどきキャリブレーションし直しましょう。
  • ポンプが止まらない:リレーがアクティブLOWなのにコードでHIGH/LOWが逆になっているか、水がしみ込む前に再び測っています。測定の間に待ち時間を入れてください。
  • 静電容量式センサーの値がおかしい:上部の電子回路が濡れています。基板を防水にしてください。
  • ESP32でWi-Fiを起動すると値がおかしくなる:センサーがADC2のピンにつながっています。GPIO 32〜39のピンに移してください。

土壌水分センサーは、測るだけでなく現実の世界で実際に何かを変える、はじめてのプロジェクトになるかもしれません。BlueGraysアプリには、スマート水やりステーションのプロジェクトが、回路図とコード付きでステップごとにそろっています。

よくある質問

土壌水分センサーは静電容量式と抵抗式、どちらを買うべきですか?

数日間の実験なら抵抗式で十分です。何か月も鉢に置いておくプロジェクトなら、静電容量式を選びましょう。露出した金属がないため腐食せず、読み取り値も時間とともにずれにくくなります。

土壌水分センサーはどれくらい持ちますか?

常時通電した抵抗式センサーの端子は、数週間で目に見えてすり減ります。測定中だけ給電すれば、何か月も持ちます。静電容量式センサーは、電子回路を水から遠ざけておけば何年も使えます。

なぜ土が乾いていると値が高く、湿っていると低いのですか?

ほとんどのモジュールはセンサーを分圧回路の一部としてつないでいます。土が湿るほど抵抗や静電容量が変わり、アナログピンの電圧が下がります。そのため、コードではmap(raw, DRY, WET, 0, 100)で範囲を反転させてパーセントを求めます。

土壌水分センサーはどれくらいの深さに挿せばよいですか?

センサーは鉢の縁から離れた、植物の根のあたりに挿してください。静電容量式センサーは、印刷された線まで挿せば十分です。電子回路が土や水に触れてはいけません。

ウォーターポンプはArduinoに直接つなげますか?

つなげません。小さなポンプでも100〜300 mAを消費し、Arduinoのピンでは供給できません。ポンプはリレーモジュールか、フライバックダイオード付きのMOSFETを通して駆動してください。電源は別に用意し、グランドを共通にします。

1台のArduinoでいくつの鉢を監視できますか?

Arduino Unoにはアナログ入力が6つあるので、6個のセンサーを直接読めます。それ以上なら、CD74HC4067のような16チャンネルのアナログマルチプレクサか、ADS1115のような追加のADCモジュールを使ってください。

全プロジェクトを見る
スマート水やりステーション
#83上級
プレミアム

スマート水やりステーション

旅行中も植物が枯れないよう、自動で水やりをするシステムです。土壌水分センサーで土の湿り具合を測定し、乾燥するとArduinoが給水ポンプを数秒間動かして、青いライトを点灯させます。水分が適切なときは緑のライトが点灯します。土がひどく乾燥すると、赤いライトが点滅し、ブザーが鳴って知らせます。

5.0(42)
57
DHT11で温度と湿度を測定
#55中級

DHT11で温度と湿度を測定

部屋の温度は何度で、空気は湿っているでしょうか、それとも乾燥しているでしょうか?DHT11センサーが温度と湿度を測定し、Arduinoが2行のLCDディスプレイに値を表示して、数秒ごとに更新します。センサーに異常があればエラーメッセージが表示されます。自分だけの小さな気象観測装置を作る第一歩です。

4.7(47)
73
ESP32 DHT22温湿度計(LCDディスプレイ付き)
#117中級

ESP32 DHT22温湿度計(LCDディスプレイ付き)

DHT22センサーで周囲の温度と湿度を測定し、16x2 I2C LCDにリアルタイムで表示するプロジェクトです。Adafruit DHTライブラリを使い、1本の信号線を使うプロトコルでセンサーからデータを読み取ります。IoT気象観測装置やスマートホームの自動化、温室の環境監視システムの基礎となります。ESP32のGPIO 4ピンを介してDHT22と通信します。

4.8(38)
56
ボタンを押している間だけ220V電球を点灯
#19上級
プレミアム

ボタンを押している間だけ220V電球を点灯

ボタンを押している間は実際の220ボルトの電球が点灯し、離すとすぐに消灯します。Arduinoの小さな信号では電球を直接点灯できないため、電気で動くスイッチであるリレーを間に入れ、電球の回路を開閉します。ボードで家庭の照明を操作するための第一歩です。家庭用電源を扱う際は十分に注意し、不安がある場合は詳しい人に手伝ってもらってください。

4.4(30)
38
ESP32スマート照明(PIR + LDR + リレー + OLED)
#141上級
プレミアム

ESP32スマート照明(PIR + LDR + リレー + OLED)

ESP32で廊下やトイレ、食品庫の照明をスマート化します!PIRモーションセンサー、LDR光センサー、リレーモジュールを使い、「暗い場所で動きを検知すると点灯する」定番の仕組みを作ります。周囲が明るければ動きを検知しても点灯しないため、日中の無駄な電力消費を抑えられます。照明は30秒間点灯し、動きが続くとタイマーがリセットされて点灯時間が延びます。SSD1306 OLEDには大きな文字で状態(ON / DAYTIME / WAITING)とカウントダウンを表示します。

4.3(6)
11
ESP32温度データロガー(DHT22 + DS1307 RTC + microSD + OLED)
#144上級
プレミアム

ESP32温度データロガー(DHT22 + DS1307 RTC + microSD + OLED)

ESP32で日時付きの温度・湿度記録システムを作ります!DHT22で1分ごとに温度と湿度を読み取り、DS1307 RTCから取得した日時とともにmicroSDカードへCSV形式で記録します。OLEDには最新の温度を大きな文字で表示し、湿度のパーセント値、日時、総記録数も表示します。SDカードの/temp_log.csvファイルはExcel、Google Sheets、Pythonのpandasで開いて分析できます。温室の監視、家や部屋の温度管理、実験室のデータ収集、食品の保管環境や養蜂箱の監視に適しています。

4.7(7)
12
ESP32 HTTPClient+天気API(LCD付き)
#133上級
プレミアム

ESP32 HTTPClient+天気API(LCD付き)

このプロジェクトでは、ESP32でHTTPClient.hを使い、インターネット経由で天気API(wttr.in)をREST APIとして呼び出します。返されたJSONレスポンスをArduinoJson v7で解析し、都市名、気温、湿度、天気、風の情報をI2C LCDディスプレイにトルコ語と英語で表示します。wttr.inは無料で、APIキーも不要です。都市名を入力するだけで、その都市の現在の天気を取得できます。30分ごとに自動更新し、表示画面ごとに異なるLEDの光り方で状態を知らせます。

4.7(13)
20