土壌水分センサー:Arduinoで植物の自動水やり
土壌水分センサーのしくみは?抵抗式と静電容量式の違い、Arduinoとの配線、乾いた状態と濡れた状態の値によるキャリブレーション、腐食の防ぎ方、リレーとポンプでの自動水やり、ESP32とPicoでの使い方を解説します。
土壌水分センサーは、鉢や庭の土がどれだけ湿っているかを測るシンプルなセンサーです。植物が水を欲しがっていることを知らせる警告ランプから、旅行中に花に水をやるシステムまで、多くのプロジェクトの土台になっています。安価で、3本の線でArduinoにつながり、リレーと小さなポンプを加えれば、本当に役に立つ自動化が完成します。

土壌水分センサーのしくみ
土の中の水分は、土の電気の通しやすさや電荷のたくわえ方を変えます。抵抗式センサーは、土に挿した2本の金属の端子の間の抵抗を測ります。土が湿るほど抵抗は下がります。静電容量式センサーは、コーティングされた電極のまわりの静電容量を測り、金属が土に触れることはありません。ほとんどのモジュールでは、土が乾いていると読み取り値が高く、湿っていると低くなります。
| 項目 | 抵抗式(YL-69、FC-28) | 静電容量式(v1.2) |
|---|---|---|
| 測るもの | 2本の金属の端子の間の抵抗 | 電極のまわりの静電容量 |
| 露出した金属 | あり | なし(コーティング済み) |
| 腐食 | 常時通電すると数週間ですり減る | 非常に丈夫 |
| 出力 | アナログ(AO)とデジタル(DO) | アナログ |
| 価格 | とても安い | 少し高め |
| 向いている用途 | 短期間の実験 | 常設の鉢や庭のプロジェクト |
配線
| センサーのピン | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| VCC | D7(測定中だけ給電する場合)または5V | GPIO 25または3V3 | GP15または3V3 |
| GND | GND | GND | GND |
| AO(AOUT) | A0 | GPIO 34 | GP26 |
| DO | D2(任意) | 任意 | 任意 |
Arduinoで水分を読み、キャリブレーションする
センサーごと、土ごとに値は異なるため、まず自分のセンサーをキャリブレーションしましょう。センサーを空気中に置いたとき(完全に乾いた状態)と、コップの水に浸けたとき(完全に濡れた状態)の値を書き留めます。そのうえでmap()を使い、その範囲を0〜100のパーセントに変換します。コードのDRYとWETを、自分で読んだ値に置き換えてください。
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}自動水やり:リレーとポンプ

では、読み取り値を実際の動作に変えてみましょう。土壌水分が30%を下回ったら、ポンプを4秒間動かし、水が土に行き渡るまで1分待ってから再び測ります。この待ち時間がないと、センサーがまだ濡れていないためにポンプが動き続け、鉢が水びたしになってしまいます。ポンプはArduinoのピンから直接給電できないため、リレーかMOSFETを通して駆動してください。リレーの配線はリレーモジュールとは?を参照してください。
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}ESP32とRaspberry Pi Picoで土壌水分を測る
ESP32では、Wi-Fi使用中でも使えるADC1のピン(GPIO 32〜39)のどれかにセンサーをつなぎます。値は0〜4095なので、キャリブレーションをやり直してください。ESP32なら、水分量をスマートフォンに通知したり、ディープスリープで1時間に1回測定し、電池で何か月も動く鉢用センサーを作ったりできます。Picoの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モジュールを使ってください。
この記事を読んだ後に作れるプロジェクト
全プロジェクトを見る
スマート水やりステーション
旅行中も植物が枯れないよう、自動で水やりをするシステムです。土壌水分センサーで土の湿り具合を測定し、乾燥するとArduinoが給水ポンプを数秒間動かして、青いライトを点灯させます。水分が適切なときは緑のライトが点灯します。土がひどく乾燥すると、赤いライトが点滅し、ブザーが鳴って知らせます。

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

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

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

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

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

ESP32 HTTPClient+天気API(LCD付き)
このプロジェクトでは、ESP32でHTTPClient.hを使い、インターネット経由で天気API(wttr.in)をREST APIとして呼び出します。返されたJSONレスポンスをArduinoJson v7で解析し、都市名、気温、湿度、天気、風の情報をI2C LCDディスプレイにトルコ語と英語で表示します。wttr.inは無料で、APIキーも不要です。都市名を入力するだけで、その都市の現在の天気を取得できます。30分ごとに自動更新し、表示画面ごとに異なるLEDの光り方で状態を知らせます。
ほかの記事
BlueGraysアプリ
この回路をスマホでステップごとに作る
回路図、コード、部品リストを1つの画面で確認できます。Arduino、ESP32、Picoのプロジェクトを200件以上用意しています。

