はじめに
以前の記事では、BLE(Bluetooth)対応の中華製温湿度センサーからPythonでデータを取得し、環境温度を記録できるようにした。
今度は、家庭菜園で重要な土壌温度と土壌水分量を計測したいと思い、市販のBluetooth対応土壌センサーを購入し、Pythonからデータ取得できないか試してみたが、実際に使ってみると次のような問題があった。
- 複数個所を測定したいが、1台3,000〜4,000円程度と価格が高い
- Bluetooth通信プロトコルが温湿度センサーほど単純ではなく、解析に時間が掛かる
- 電池寿命やデータ取得間隔などを自由に変更できない
そこで、
「必要な機能だけを備えた土壌センサーを自分で作ってしまおう」
ということで、BLE対応のオリジナル土壌センサーを製作した。
今回は、ハードウェア構成について紹介する。
概要
今回製作した土壌センサーの特徴は次のとおりである。
- BLEでPCへデータ送信
- 土壌温度2か所を測定
- 土壌水分量2か所を測定
- 単3乾電池3本で動作
- Deep Sleepによる低消費電力
- Arduino IDEで開発可能
取得したデータはBLEを介してPythonプログラムへ送信し、データベースへ保存する。
主要部品の紹介
Seeed Studio XIAO ESP32C3
今回のセンサーの頭脳となるマイコンである。
Qiitaでもよく紹介されている超小型のESP32マイコンで、
- Wi-Fi
- Bluetooth Low Energy(BLE)
- USB Type-C
- Deep Sleep
などを搭載している。
Arduino IDEが利用できるため開発しやすく、多数のライブラリが公開されていることから初心者でも扱いやすい。
今回はWi-Fiは使用せず、BLE通信のみを利用している。
採用理由
- 超小型でケースに収めやすい
- BLEが標準搭載されている
- Arduino IDEが利用できる
- Deep Sleepによる省電力化が容易
- ライブラリが豊富
秋月など技適マーク付きのものが1000円程度で売られている。
土壌水分センサーモジュール(LM393付属)
土壌の水分量を測定するために使用するモジュールである。
このモジュールにはLM393コンパレータICが搭載されており、
- AO(アナログ出力)
- DO(しきい値を超えたかどうかのデジタル出力)
を利用できる。
今回は土壌水分量を数値として取得したかったため、**AO(アナログ出力)**を使用した。
また、土壌水分センサーは常時通電すると電極が腐食しやすいことが知られている。
測定時のみ通電するため、次のような手順で測定している。
GPIO ON
↓
50ms待機
↓
A/D変換
↓
GPIO OFF
採用理由
- 数百円と非常に安価
- 入手しやすい
- アナログ値を取得できる
- 家庭菜園用途には十分な精度
DS18B20 防水温度センサー(アダプターボード付き)
土壌温度の測定にはDS18B20を使用した。
DS18B20は1-Wire通信を採用したデジタル温度センサーであり、
- 防水仕様
- ±0.5℃程度の精度
- ノイズに強い
- 配線は3本だけ
という特徴がある。
家庭菜園では地温が作物の生育に大きく影響するため、気温だけではなく土壌温度も計測できるようにした。
採用理由
- 精度が高い
- 防水仕様
- Arduinoライブラリが充実
- 長いケーブルでも安定して動作する
ADS1115(16bit A/Dコンバータ)
ESP32にもA/Dコンバータ(ADC)は搭載されている。
しかし、ESP32の内蔵ADCは電圧値をそのまま測定する用途では精度に課題があり、
チップごとのばらつきや非線形性も知られている。
今回は土壌水分量の変化をできるだけ安定して取得したかったため、16bit A/DコンバータであるADS1115を採用した。
ADS1115はI2C接続で使用でき、4チャネルのアナログ入力を備えている。
今回は
- CH0:土壌水分センサー①
- CH1:土壌水分センサー②
として利用している。
採用理由
- 16bit高分解能
- I2C接続で配線が簡単
- 最大4チャネル入力
- Arduinoライブラリが充実
回路構成
動作確認
とりあえず、XIAO ESP32C3とセンサー類をブレッドボードで結線し、基本動作を確認した。

水分センサーの挙動を確認するため
- 空気中
- 蒸留水
- 湿った土
- 乾いた土
でそれぞれ計測し、期待どおり値が大きく変化することを確認できた。
| 状態 | ADC値 |
|---|---|
| 空気中 | 28000 |
| 乾いた土 | 22000 |
| 湿った土 | 13000 |
| 蒸留水 | 6000 |
組み立て前
電池BOX(単3X3本)、ユニバーサル基板、コネクタなどをAmazonと秋月で購入。

本体ケース
ケースは100均のプラスチック製タッパを使用。

写真は防水対策前の状態。本来であれば、
- ケースの穴をパテで埋める
- シリカゲルを入れる
- 蓋を防水テープでシールする
などの防水対策を行いたい。
今回はまずデータ収集を優先したかったため、防水対策は最低限にとどめて運用を開始した。
完全防水ではないため、当面はベランダや軒下での使用を想定している。
次回予告
次回はArduino IDEによるプログラム作成について紹介する。
- BLE通信
- Deep Sleep
- DS18B20の温度取得
- ADS1115によるA/D変換
など、実際のソースコードを交えながら解説する予定である。
リンク
こちらは生成AIのちーちゃん(GPT5)にアドバイスをもらいながらAI/IoTを活用して家庭菜園にいそしんでいるブログです。よかったらこちらも見てやってください。

