土壌水分センサーを ESP32 で読む — 静電容量式センサーの校正と防水の限界

室内に鉢を入れると、水やりの間隔が屋外のときと変わる。指で土を触って判断するのは確実だが、鉢が増えると毎日の見回りが負担になる。そこで土壌水分センサーを ESP32 につなぎ、ESPHome で Home Assistant に値を送る構成の製作記事が数多く公開されている。国内の販売店の価格ならセンサーとボードの合計が税込2,442円(秋月電子通商の SEN0193 が1,320円、スイッチサイエンスの XIAO ESP32C3 が1,122円)、設定は YAML を十数行書くだけで済む。ところが、組み上げて最初に表示されるのは単位が V の電圧か、何を基準にしたのか分からない%の数字だ。この数字が乾いているのか湿っているのかは、センサーを1本ずつ校正しない限り分からない。
※本記事にはアフィリエイト広告(PR)が含まれます。
本記事は、土壌水分センサーと ESP32 を ESPHome で使うときに、どこで判断を誤りやすいかを順に整理する。抵抗式と静電容量式の違い、ADC のピンと減衰(attenuation)の設定、calibrate_linear による2点校正、フィルター、電池駆動のための deep sleep、3Dプリントのケースと防水の限界、そして「v1.2」と印字された汎用品に見られる不良個体までを扱う。AI アシスタントに YAML を書かせる場合の使い方と、その出力を ESPHome の公式ドキュメントで確かめるべき箇所も書く。
最初に前提を明記しておく。当サイトはこの構成を実機で組んでいない。手順と設定は ESPHome・Espressif・センサーメーカーの公式ドキュメントと、外部の製作記事に基づいている。各節に参照先のリンクを張るので、数値や挙動は必ずそちらでも確かめてほしい。ESPHome の版は、2026-09-28 時点の最新安定版である 2026.9.0(2026-09-16 公開)を前提にしている。
- 土壌水分センサーを ESP32 で使う前に — 抵抗式と静電容量式の違い
- 表示された値をそのまま信じられない理由
- AI に ESPHome の YAML を書かせるときの分担
- ESP32 のボードと ADC1 のピンを選ぶ
- ESPHome の adc センサーを設定する — 12db と auto の違い
- calibrate_linear で2点校正する — 乾いた土と湿った土の値を取る
- フィルターで値を落ち着かせる — median と clamp の順番
- 電池で動かすなら deep sleep を組み合わせる
- 3Dプリントのケースと防水の限界
- 「v1.2」と印字された汎用品に見られる不良個体
- 部品の選び方と価格
- まとめ — 校正した値に意味を持たせる
- 参照
土壌水分センサーを ESP32 で使う前に — 抵抗式と静電容量式の違い

安価な土壌水分センサーには、大きく分けて抵抗式と静電容量式の二つがある。見た目はどちらも土に挿す細長い基板だが、測り方と寿命が違う。
抵抗式は、二本の金属電極を土に挿し、その間に電流を流して抵抗を測る。水分が多いほど電流が流れやすくなるという単純な原理で、部品も安い。問題は電極が土に露出していることだ。Adafruit の解説は、この型のセンサーは最初こそ動くが、露出した金属が酸化していくと書いている。金めっきでも避けられないという。酸化が進むと読み値がずれ続け、校正をやり直す必要が出てくる。SparkFun も、電極の腐食を防ぐためにセンサーに常時給電しないよう勧めている。
静電容量式は、電極を基板の中に封じ、土を含む周囲の誘電率の変化を静電容量の変化として読む。Adafruit の説明では、電極が露出せず、植物に直流を流さない。スイッチサイエンスの販売ページも、抵抗式と違って電極が腐食しないため長時間の屋外使用で耐久性が上がると書いている。DFRobot は自社の SEN0193 について、抵抗式の2〜3倍の寿命があると製品ページでうたっている。これはメーカー自身の主張で、第三者の試験値ではない点は割り引いて読むべきだ。
室内の鉢で何か月も挿しっぱなしにするなら、選ぶのは静電容量式になる。以下はすべて静電容量式を前提に話を進める。
表示された値をそのまま信じられない理由

本記事で扱う SEN0193 や汎用の v1.2 基板は、出力がアナログ電圧で、ESP32 の ADC(アナログ・デジタル変換器)で読む。静電容量式でも、Adafruit の STEMMA Soil Sensor のように I²C で値を返す製品もあり、その場合はここで述べる ADC の設定は関係しない。ここに三つの落とし穴がある。
一つ目は、電圧と水分の向きが直感と逆なことだ。多くの静電容量式センサーは水分が増えると出力電圧が下がる。乾いた状態で電圧が高く、湿った状態で低い。esp32.co.uk の解説も、電圧は水分が増えると下がるので対応づけを逆向きにするよう書いている。ただし同じ記事は、この向きは一般的だがすべてのセンサーに当てはまるわけではないので、手元のセンサーで確かめてから設定するよう勧めている。これを知らずに「電圧が高い=湿っている」と設定すると、水をやるたびに表示が下がる。
二つ目は、出力の範囲が決まっていないことだ。DFRobot SEN0193 の出力電圧は、同じメーカーの資料の中でも Wiki と製品ページで異なる範囲が書かれている。汎用品になれば、なおさら当てにならない。出力の上下限は、個体と電源電圧で変わるものとして扱い、手元の1本を実際に測って決めるしかない。
三つ目は、ESP32 の ADC が既定の設定ではセンサーの出力を読み切れないことだ。ESPHome のドキュメントによれば、ESP32 の ADC は既定の減衰が 0db で、約1.1V で頭打ちになる。静電容量式センサーの出力はそれより高い電圧を取りうるので、減衰を変えなければ乾いた状態の値が1.1V 付近に張り付く。
加えて、校正して表示した「%」が何を意味するかも決めておく必要がある。この%は、乾燥時と湿潤時の2点の間のどこにいるかを示す相対値であって、土壌の体積含水率ではない。同じ電圧でも、土の種類や塩分、詰まり具合で実際の水分量は変わる。esp32.co.uk もこの点に触れている。本記事で「%」と書くときは、すべてこの相対値の意味で使う。
AI に ESPHome の YAML を書かせるときの分担

ESPHome の設定は YAML なので、対話型の AI アシスタントに「ESP32 の GPIO32 に静電容量式の土壌水分センサーをつないだ。ESPHome の設定を書いて」と頼めば、それらしい設定がすぐ返ってくる。雛形づくりとしては十分に役に立つ。フィルターの並べ方を説明させたり、自分で書いた設定を貼って「誤りを指摘して」と頼んだりする使い方もできる。
ただし、返ってきた YAML は、少なくとも次の四点を ESPHome の公式ドキュメントで確認してから書き込むべきだ。
- 減衰の表記: ESPHome のソースでは
attenuation: 11dbは非推奨とされ、12dbを使うよう警告が出る。外部の製作記事には旧表記の11dbがまだ残っており、たとえば Home Hacker Lab の ESP32-C3 の手順も11dbのままだ。公開された記事に古い表記が残っている以上、AI の出力にも出てくる可能性がある - ピンの選び方: Wi-Fi を使う構成で ADC2 のピンを指定していないか。ボードの種類ごとに ADC1 のピン番号は違う(次の節で扱う)
- オプションの組み合わせ:
attenuation: autoとsamples(複数回の読み取り)は併用しない。ESPHome の公式ドキュメントは、auto のとき samples は無視されると書いている。一方でソース(adc/sensor.py)は、samples を複数にすると設定検証でエラーにする - 校正の向き:
calibrate_linearの対応づけが、乾燥時の電圧を 0%、湿潤時の電圧を 100% に割り当てているか
AI の出力を確かめる手順は単純で、生成された YAML の各キーを ESPHome の該当ページで検索し、同じ名前と同じ値の書き方があるかを見る。ページに無いキーは書き込まない。校正の数値については、AI は読者のセンサーの値を知らないので、出してきた数字はどれも仮の値だと考える。AI が示した電圧をそのまま使うと、校正していないのと同じになる。
レビュー役として使う場合も同じで、「この設定は正しい」という AI の答えは、上の四点を自分で公式ドキュメントと照らし合わせるまで確定させない。AI は雛形と見落としの指摘に使い、正否の判断はドキュメントで行う、という分担にしておくと事故が少ない。
ESPHome の外側で ESP32 を自分でプログラムしてみたくなったら、Arduino IDE で ESP32 を動かしながら処理の分け方とタイミングの考え方を学べる入門書がある。
ESP32 のボードと ADC1 のピンを選ぶ

センサー1〜2本を読んで Wi-Fi で送るだけなら、ESP32 の種類はどれでもよい。問題はピンの選び方で、ここを誤ると値がときどき取れない、あるいはまったく取れないという症状になる。
ESP32 系の ADC には ADC1 と ADC2 がある。ESP-IDF のドキュメントによれば、ESP32(無印)と ESP32-S3 では ADC2 を Wi-Fi も使う。ドライバーは両者の間で保護をかけているが、ADC が他のドライバーに使われているときは読み取りが失敗しうる、と書かれている。ESP32-C3 では事情がさらにはっきりしていて、ADC2 の oneshot 読み取りはハードウェアの制約で結果が安定しないため既定ではサポートされない。ESPHome はノードを Wi-Fi でつなぐのが基本なので、センサーは ADC1 のピンにつなぐ。
ESPHome のドキュメントに載っている ADC1 のピンは次のとおりだ。
| チップ | ADC1 のピン | ADC2 のピン(避ける) |
|---|---|---|
| ESP32(無印) | GPIO32〜GPIO39 | GPIO0, 2, 4, 12〜15, 25〜27 |
| ESP32-C3 | GPIO0〜GPIO4 | GPIO5 |
| ESP32-S3 | GPIO1〜GPIO10 | GPIO11〜GPIO20 |
開発ボードの基板に印字されたピン名(D0、A1 など)は GPIO 番号と一致しないことが多い。ボードのピン配置図で GPIO 番号を確かめてから YAML に書く。外部の製作記事では、SmartHomeScene が ESP32-WROOM の GPIO32 を、Home Hacker Lab が ESP32-C3 の GPIO3 を、esp32.co.uk が GPIO34 を使っており、いずれも ADC1 の範囲に入っている。
ボードの候補としては、Seeed Studio の XIAO ESP32C3 と XIAO ESP32S3 が小さく、ケースに収めやすい。製品名はハイフンなしの「ESP32C3」、チップ名はハイフン付きの「ESP32-C3」と書き分けられている点に注意する。ESP32-C3 は RISC-V のチップで、ESP32-S3 は 240MHz で動くデュアルコアの Xtensa LX7 だ。土壌水分を読むだけなら処理能力の差は効かないので、ADC1 に使えるピンの数と、ケースに入る大きさで選べばよい。
電源の面では、DFRobot SEN0193 は動作電圧が 3.3〜5.5V で、基板にレギュレータを載せているため 3.3V 系のマイコンにそのままつなげる。動作電流は 5mA だ。
ケースに収めやすい小型のボードとして本文で挙げた XIAO ESP32C3 は Amazon でも入手できる。端子に出ている ADC1 は A0〜A2 の3本だ。
ESPHome の adc センサーを設定する — 12db と auto の違い

ESPHome の雛形(Wi-Fi、Home Assistant との接続、OTA 更新などの基本部分)は ESPHome の導入手順どおりに作り、その下にセンサーの設定を追記する。最初は校正を入れず、生の電圧を見るための設定から始める。
sensor:
- platform: adc
pin: GPIO32
name: "Soil Moisture Voltage"
id: soil_voltage
attenuation: 12db
update_interval: 5s
unit_of_measurement: "V"
accuracy_decimals: 3
attenuation は ESP32 だけで使える設定で(ESPHome の ADC のドキュメント)、0db・2.5db・6db・12db のほかに auto を指定できる。既定は 0db で、前の節で書いたとおり約1.1V で頭打ちになる。静電容量式センサーの出力を測るなら 12db を指定するのが素直な選び方だ。
auto は全部のレンジを組み合わせて測る設定で、ESPHome の試験では約0.075V〜約3.12V の範囲が使えたとドキュメントに書かれている。ただしこれは ESPHome の試験での値で、チップの個体によって変わる。auto にすると samples(1回の更新で何回読むか)が使えなくなるので、読み取りのばらつきを複数回の平均で抑えたい場合は 12db を指定して samples を併用する、という選び方になる。
update_interval の既定は 60s だが、校正の作業中は値の変化をすぐ見たいので短くしておく。上の例では 5s にしている。校正が済んだら戻す。ESPHome は 2021.11 以降、チップのメーカー校正値を使って電圧を読むようになっており、ここで表示されるのは校正済みの電圧だ。ADC の生の値を見たいときは raw: true を使う。
この設定を書き込んで Home Assistant か ESPHome のログで電圧が表示されれば、配線とピンの選択は合っている。値が1.1V 付近から動かなければ減衰の設定が効いていない。値が取れたり取れなかったりするなら ADC2 のピンを疑う。
calibrate_linear で2点校正する — 乾いた土と湿った土の値を取る

生の電圧が読めたら、2点の値を取る。DFRobot の Wiki は、空気中に出したときの値と水に浸したときの値を取り、その2点で校正する手順を示している。基準点を二つ取って、その間を直線でつなぐ考え方だ。
鉢で使うなら、実際に使う土で測る方法もある。次の手順は、上で挙げた公式資料と製作記事の手順を組み合わせたものだ。
- センサーの防水処理(後述)を先に済ませる。コーティングや封止は静電容量を変えるので、esp32.co.uk は最終的な防水処理の後に校正するよう勧めている
- 乾燥側の点を取る。空気中に出すか、乾かした土に上限線まで挿し、電圧が落ち着いたところで数回読んで記録する
- 湿潤側の点を取る。水に浸すか、水を十分に含ませた同じ土に挿し、同じように記録する
- センサーが複数本あるなら、1本ずつ別々に2点を取る。値を使い回さない
乾燥側を空気中にするか乾いた土にするかで、「0%」が意味するものが変わる。空気中を基準にすると、どれだけ乾いた土でも 0% までは下がりにくくなる。どちらを選んでもよいが、記録しておかないと後で表示の意味が分からなくなる。
値が取れたら calibrate_linear に書く。ESPHome のフィルターのドキュメントでは、各点を「測定値 -> 真の値」の形で並べ、最低2点が必要とされている。静電容量式では乾燥時の電圧が高いので、高い電圧を 0%、低い電圧を 100% に割り当てる。
sensor:
- platform: adc
pin: GPIO32
name: "Soil Moisture"
attenuation: 12db
update_interval: 60s
unit_of_measurement: "%"
device_class: ""
accuracy_decimals: 0
filters:
- median:
window_size: 5
send_every: 5
send_first_at: 1
- calibrate_linear:
method: least_squares
datapoints:
- 2.62 -> 0.0
- 1.38 -> 100.0
- clamp:
min_value: 0
max_value: 100
device_class: "" の行は省かない。ESPHome の adc センサーは、既定で device_class が voltage(単位 V)になっている(ESPHome のソース)。Home Assistant の電圧クラスが認める単位は V・mV などで、% は含まれない(Home Assistant の開発者向けドキュメント)。単位だけを % に変えると、電圧クラスのまま % を名乗るセンサーになる。ESPHome のドキュメントは、device_class を "" にすると既定のクラスを外せると書いている。ここで外すのは、この%が2点の間の相対値だからだ。Home Assistant には単位が % の水分クラス(moisture)もあり、画面上の表示をそろえたい場合は device_class: moisture を指定してもよい。その場合も、中身は体積含水率ではなく相対値であることに変わりはない。
この例の 2.62V と 1.38V は、esp32.co.uk の記事が校正の例として挙げている値をそのまま置いたものだ。同記事では、2.62V は水やりを始めたい乾き具合、1.38V は十分に水をやって余分な水が抜けた後の土の値として示されている。空気中と水中の値ではない。読者のセンサーの値ではないので、必ず自分で取った2点に置き換える。別の例として、Home Hacker Lab の手順では乾燥時 2.2V、湿潤時 1.8V を使っている。記事によってこれだけ値が違うこと自体が、個体と電源と基準の取り方で値が変わることを示している。
method には least_squares と exact があり、既定は least_squares だ。least_squares は全点に最小二乗で1本の直線を当てはめ、exact は点と点を折れ線で正確につなぐ。2点だけなら結果は同じになる。3点以上取った場合、たとえば乾燥・中間・湿潤の3点を取った場合に違いが出る。中間の点で表示を合わせたいなら exact を使う。
フィルターで値を落ち着かせる — median と clamp の順番

ADC の読み値は、同じ状態でも少しずつ揺れる。ESPHome ではフィルターを並べて整える。ドキュメントに書かれているとおり、フィルターは設定に書いた順に適用される。上の例では median、calibrate_linear、clamp の順に並べた。SmartHomeScene の製作記事も同じ順番を採っている。
median は直近のいくつかの値の中央値を取る。既定は window_size 5、send_every 5、send_first_at 1 で、5回分の値から中央値を出し、5回に1回送る。平均と違って、一度だけ大きく外れた値に引きずられない。update_interval が 60s なら、Home Assistant に値が届くのは5分に1回になる。水やりの判断に使うなら、数分おきの値で足りることが多い。短くしたい場合は update_interval か send_every を小さくする。
calibrate_linear の後に置く clamp は、値を min_value から max_value の範囲に収める。2点校正の外側、たとえば校正時より乾いた状態では計算上マイナスの%が出るが、clamp を置けば 0% に張り付く。範囲外の値を捨てたい場合は ignore_out_of_range: true を使う。
順番には意味がある。median を先に置けば、電圧の段階で外れ値を落としてから換算する。clamp を最後に置けば、換算した後の値だけを 0〜100 に収められる。clamp を calibrate_linear の前に置くと、電圧を 0〜100 の範囲に制限するという意味のない処理になる。AI が出した YAML でフィルターの順番が入れ替わっていないかは、見落としやすい確認点だ。
電池で動かすなら deep sleep を組み合わせる

鉢の近くに USB 電源が無い場合は電池で動かすことになる。ESPHome の deep sleep は、電池で動くノードが電力を節約するための機能だ。起きている時間を run_duration、眠っている時間を sleep_duration で指定する。
deep_sleep:
id: deep_sleep_1
run_duration: 20s
sleep_duration: 30min
20秒と30分は説明のための例で、ドキュメントの推奨値ではない。起きている20秒の間に Wi-Fi につながり、値を測って送り終える必要がある。
ここで前の節のフィルターと食い違いが起きる。update_interval を 60s、median の send_every を 5 にしたままだと、5回分の値が集まる前にノードが眠ってしまう。send_first_at を 1 にしておけば最初の1回分は送られるが、それは中央値ではなく単独の読み値だ。deep sleep と組み合わせるときは、update_interval を短く(たとえば 2s)して、window_size × update_interval が run_duration に収まるようにする。上の例なら 5回 × 2秒 = 10秒で、20秒の中に収まる。
もう一つの注意は更新の書き込みだ。ノードが眠っている間は OTA 更新を受け取れない。ドキュメントは、データ転送や OTA 更新の間に ESP を起こしておくために deep_sleep.prevent アクションを用意している。このアクションは deep sleep の id を指定して呼ぶ。
then:
- deep_sleep.prevent: deep_sleep_1
どのきっかけでこのアクションを呼ぶか(Home Assistant 側のスイッチなど)は構成しだいだ。電池がどのくらいもつかは、ボード、電池、Wi-Fi の接続にかかる時間で大きく変わる。当サイトは実測値を持っていないので、ここでは数字を書かない。
電池駆動の完成品という選択肢もある。Seeed Studio の XIAO Soil Moisture Sensor は、XIAO ESP32C6(チップは ESP32-C6)を載せ、単三電池1本で動き、ESPHome を書き込んだ状態で出荷される。自作の手間と比べる材料になる。
3Dプリントのケースと防水の限界

静電容量式センサーでも、基板全体を土に埋めてよいとは限らない。Seeed の Grove 版の Wiki は、土に挿す部分が基板の上限線を超えてはならないと書いている。esp32.co.uk も、安価な基板の上部の電子部品は露出していることが多く、基板全体を埋めてはいけないとしている。上限線の指定は挿す深さの指示であって、防水試験の結果ではない。手元の製品がどこまで水に耐えるかは、メーカーの資料で確かめる。
上部の回路を守るためにケースを3Dプリントする例は多い。公開されているモデルと、そのライセンスは次のとおりだ。
| モデル | 作者 | ライセンス | 特徴 |
|---|---|---|---|
| Case for Capacitive Soil Moisture Sensor v1.2 v2(MakerWorld) | BallyMcBallface | CC BY-NC-SA | SmartHomeScene の製作記事で使われたケース |
| Capacitive Soil Moisture Sensor V1.2 case waterproof(Printables) | danielkrah | CC BY-SA | 黄色の部品を TPU/TPE で印刷し、ねじ不要と作者が説明 |
| Capacitive Soil Moisture Sensor v1.2 – Waterproof Encasing(Printables) | TinkerVision | CC BY-NC-ND | 2分割のケース。改変したものは配布できないライセンス |
| Capacitive soil moisture sensor case(Printables) | coxx | CC BY-SA | v1.2 と v2.0 用 |
ライセンスは使い方を縛る。Creative Commons の条件の要約(4.0 版の BY-NC-ND・BY-NC-SA・BY-SA)によれば、NC が付くモデルは営利目的で利用できず、ケースを印刷して売ることはできない。ND が付くモデルは、改変したものを配布できない。SA が付くモデルは、改変して配布するなら元と同じライセンスで公開する必要がある。モデルページにはライセンスの版が表示されていないので、ここでは 4.0 版の要約を参照した。自分の鉢に使うだけなら大きな制約にはならないが、寸法を変えて再配布する場合は各モデルページで条件を確かめる。これはライセンス条件の一般的な説明であり、法的助言ではない。
「waterproof」という名前は作者が名乗っているもので、今回参照したモデルページと製作記事では、IP 等級や防水試験の結果を確認できなかった。SmartHomeScene は、自分が使ったケースは防水ではないと明記している。当サイトは筐体の設計を扱った蓋の開け閉めをどう設計するか — ネジ留め・スナップ・リビングヒンジの判断軸(2026-08-06 公開)でも、試験をしていない箱に IP 等級を名乗らない方針を書いた。センサーケースも同じ扱いにして、「防水をうたうケース」として使う。
ケースで足りない部分は封止で補う。The Cave Pearl Project は、熱収縮チューブとエポキシで電子部品を覆う手順を紹介している。封止の材料は静電容量を変えるので、前の節で書いたとおり校正は封止の後に行う。ケースを自分で設計したい場合は、基板の採寸から始める手順を電子工作の筐体を3Dプリントで作る — 基板を箱に収めるまでの設計手順(2026-08-03 公開)にまとめてある。センサーの寸法は、SEN0193 なら公式の 98×23mm(細長いプローブなので、長さ98mm・幅23mm と読める)が採寸の出発点になる。
ケースを自分で印刷するなら、水と湿気に強い PETG が扱いやすい。ただし素材を変えても防水の等級が付くわけではない点は本文のとおりだ。
「v1.2」と印字された汎用品に見られる不良個体

通販で「Capacitive Soil Moisture Sensor v1.2」として売られている基板は、特定のメーカーの型番ではなく汎用品の通称だ。同じ見た目でも、載っている部品が個体によって違う。
The Cave Pearl Project は2020年の記事で、この汎用品に次のような違いがあると報告している。
- 発振用のタイマー IC に、CMOS 版の TLC555 ではなく NE555 を載せた個体がある
- 電圧レギュレータ(662K と印字された部品)を載せた個体と載せていない個体がある
- 出力側の 1MΩ 抵抗(R4)がグラウンドにつながっていない個体がある。この場合、出力が本来の挙動を示さない
NE555 の問題は、電源電圧の仕様にある。Texas Instruments の製品ページでは、NE555 の動作保証は 5〜15V で、TLC555 は 2〜15V で動く。ESP32 の 3.3V から給電すると、NE555 を載せた個体は仕様の範囲外で動かすことになる。The Cave Pearl Project も、レギュレータ付きで TLC555 を載せた基板を選ぶよう勧めている。
このような個体がどのくらいの割合で混ざっているかは分からない。確かめられるのは、基板の上の IC の印字を読むことと、前の節の手順で乾燥・湿潤の2点を取ったときに値がはっきり動くかを見ることだ。2点の電圧がほとんど変わらない、あるいは挿していないのに値が漂う個体は、校正で救えない。DFRobot の SEN0193 のように、メーカーがレギュレータの搭載を明記している製品を選べば、この問題の一部は避けられる。
部品の選び方と価格

2026-09-28 に国内の販売店で確認した価格(税込)を挙げる。
| 部品 | 販売店 | 価格(税込) |
|---|---|---|
| DFRobot SEN0193 静電容量式土壌水分センサー | 秋月電子通商 | ¥1,320 |
| Seeed Studio XIAO ESP32C3 | スイッチサイエンス | ¥1,122 |
| Seeed Studio XIAO ESP32S3 | スイッチサイエンス | ¥1,456 |
1鉢を測って Home Assistant に送るなら、XIAO ESP32C3 と SEN0193 の組み合わせで、2点校正と ESPHome の設定まで一通り組める。チップとしての ESP32-C3 の ADC1 は GPIO0〜4 だが、XIAO ESP32C3 の端子に出ているのはそのうち3本だけだ。Seeed の公式ピン表では、アナログ端子 A0〜A3 のうち A0(D0=GPIO2)・A1(D1=GPIO3)・A2(D2=GPIO4)が ADC1 で、A3(D3=GPIO5)は ADC2 だ。Seeed も、安定して読むには ADC1 の A0〜A2 を使うよう書いている。センサーを増やすときは、この3本が上限になる。
XIAO ESP32C3 で組む場合の配線は、センサーの信号線を A0〜A2 のどれか(たとえば A1=GPIO3)に、電源を 3V3 端子に、GND を GND 端子につなぐ。SEN0193 は 3.3V で動くので、3V3 端子から給電できる。YAML は、上の例の pin: GPIO32 を pin: GPIO3 に書き換える。カメラの追加など、後で重い処理を足す予定があるなら XIAO ESP32S3 を選ぶ。
Seeed の Grove – 静電容量式土壌水分センサ(耐腐食性)は、Grove コネクタで配線を減らせる。確認時点では売り切れだった。汎用の v1.2 品は安く複数本そろえやすいが、前の節の不良個体を含みうる前提で、1本ずつ2点校正して動きを確かめる。
受け側の Home Assistant には公式の ESPHome 統合があり、ESPHome のネイティブ API でデバイスが直接つながる。ESPHome と Home Assistant はどちらも無償のオープンソースだ。測った値を使って水やりを知らせる、ポンプを動かすといった自動化は、Home Assistant 側の設定になる。
ボードとセンサー以外の細かい部品(ケーブル、コネクタ、電源まわり)を選ぶときは、電子工作の部品を種類ごとに引けるカタログ本があると迷いが減る。
まとめ — 校正した値に意味を持たせる

土壌水分センサーを ESP32 と ESPHome で読むこと自体は、YAML を十数行書けば済む。難しいのは、出てきた数字に意味を持たせることだ。本記事で扱った判断を並べ直すと次のようになる。
- 室内の鉢に挿しっぱなしにするなら、電極が露出しない静電容量式を選ぶ
- Wi-Fi を使うので ADC1 のピンにつなぐ。ESP32 は GPIO32〜39、ESP32-C3 は GPIO0〜4(XIAO ESP32C3 の端子では A0〜A2 の3本)、ESP32-S3 は GPIO1〜10
- 減衰は
12dbかauto。11dbは非推奨で、autoとsamplesは併用できない - 防水処理を済ませてから、乾燥と湿潤の2点を1本ずつ取り、
calibrate_linearで逆向きに対応づける - フィルターは
median、calibrate_linear、clampの順に置き、単位を % にするならdevice_classも指定し直す - 表示される%は2点の間の位置であって、体積含水率ではない
- deep sleep と組み合わせるなら、フィルターの窓が起きている時間に収まるようにする
- 「防水」をうたうケースでも、IP 等級や試験結果が示されているとは限らない。ライセンスの NC・ND・SA も確かめる
- 汎用の v1.2 品は、IC の印字と2点の値の動きで不良個体を見分ける
AI アシスタントは YAML の雛形づくりと見落としの指摘には役に立つが、減衰の表記、ピンの選び方、オプションの組み合わせ、校正の向きは ESPHome の公式ドキュメントで確かめる。校正の数値は、AI も製作記事も読者のセンサーの値を知らない。手元の1本で2点を取った値だけが、その鉢の「0%」と「100%」になる。まずは生の電圧を表示する設定を書き込み、乾いた状態と湿った状態で値がどれだけ動くかを見るところから始めてほしい。
参照
- ESPHome: Analog To Digital Sensor
- ESPHome: Sensor Component(フィルター)
- ESPHome: Deep Sleep Component
- ESPHome: Changelog
- ESPHome GitHub Releases
- ESPHome ソース: adc/sensor.py
- ESP-IDF: ADC Oneshot Mode Driver(ESP32)
- ESP-IDF: ADC Oneshot Mode Driver(ESP32-C3)
- ESP-IDF: ADC Oneshot Mode Driver(ESP32-S3)
- Espressif: ESP32-C3
- Espressif: ESP32-S3
- DFRobot Wiki: SEN0193
- DFRobot: SEN0193 製品ページ
- Seeed Wiki: Grove – Capacitive Moisture Sensor (Corrosion Resistant)
- Seeed Wiki: Getting Started with Seeed Studio XIAO ESP32C3
- Seeed Wiki: Getting Started with XIAO Soil Moisture Sensor
- Texas Instruments: NE555
- Texas Instruments: TLC555
- The Cave Pearl Project: Hacking a Capacitive Soil Moisture Sensor (v1.2) for Frequency Output
- Adafruit Learn: STEMMA Soil Sensor
- SparkFun: Soil Moisture Sensor Hookup Guide
- Home Assistant Developer Docs: Sensor entity(device class と単位)
- Home Assistant: ESPHome 統合
- Creative Commons: BY-NC-ND 4.0
- SmartHomeScene: DIY Capacitive Soil Moisture Sensor with ESPHome
- Home Hacker Lab: How to Build a Smart Soil Moisture Monitor with ESPHome and ESP32
- esp32.co.uk: Capacitive Soil Moisture Sensor with ESP32, ESPHome and Home Assistant
- MakerWorld: Case for Capacitive Soil Moisture Sensor v1.2 v2
- Printables: Capacitive Soil Moisture Sensor V1.2 case waterproof
- Printables: Capacitive Soil Moisture Sensor v1.2 – Waterproof Encasing
- Printables: Capacitive soil moisture sensor case
- 秋月電子通商: 静電容量式土壌水分センサー
- スイッチサイエンス: Seeed Studio XIAO ESP32C3
- スイッチサイエンス: Seeed Studio XIAO ESP32S3
- スイッチサイエンス: Grove – 静電容量式土壌水分センサ(耐腐食性)
- スイッチサイエンス: 静電容量式土壌水分センサ基板

