Arduino CloudでガーデニングIoT -土壌水分センサーの比較-

## 目的

自動灌水には土壌の水分量をセンシングすることが必要で、土壌水分センサーにはTDRや静電容量式、抵抗式などがある。最適なセンサーの選択のために、ネットで簡単に手に入る4種類のセンサーを比較してみた。


## 土壌水分センサーの仕様

### DiyStudio 土壌湿度計

Amazonで購入できて調べた中では最安。

- ¥200/個
- 静電容量式
- 端子：PH型（2mmピッチ）×3（ケーブル付属）
- DC 3.3-5.5 V（ArduinoでもESP-WROOM-02でも使える）
- アナログ出力0-3.0 V（土壌水分量で電圧値が変化する）

https://www.amazon.co.jp/dp/B07MC9ZGXL?ref=nb_sb_ss_w_as-reorder_k0_1_8&amp=&crid=1SV62KZ715IJF&amp=&sprefix=土壌水分センサー

実物で空気中に置いた状態（乾燥）と水に浸けた状態（湿潤）で電圧を測定した。仕様では出力電圧3Vのレンジがあるが、実際には0.9-2.1Vの範囲で1.2Vのレンジを使って土壌の水分を測ることになる。

|出力電圧[V]|乾燥|湿潤|
|:-:|:-:|:-:|
|1|2.10|0.94|
|2|2.11|0.92|
|3|2.05|0.91|
|4|2.06|0.90|
|5|2.12|0.91|
|平均|2.086|0.916|

### SEN0193

DiyStudioとほぼ同じ仕様のセンサーだが、単価は高い。

- ¥960/個
- 静電容量式
- 端子：PH型（2mmピッチ）×3（ケーブル付属）
- DC 3.3-5.5 V
- アナログ出力0-3.0 V（DFRduino UNOというこのセンサーのメーカーのボードに繋ぐと以下のディジタル出力を示す）

Dry: (520 430]
Wet: (430 350]
Water: (350 260]

https://akizukidenshi.com/catalog/g/g113550/
https://wiki.dfrobot.com/Capacitive_Soil_Moisture_Sensor_SKU_SEN0193

単価が高い分、DiyStudioよりも出力の個体差が小さそう。

|出力電圧[V]|乾燥|湿潤|
|:-:|:-:|:-:|
|1|2.45|1.21|
|2|2.45|1.22|
|平均|2.45|1.215|


### SEN0114

抵抗式のシンプルな作りで、端子は金メッキで錆びづらく加工されている。

- ¥500/個
- 抵抗式
- 端子：PH型（2mmピッチ）×3（ケーブル付属）
- DC 3.3-5 V
- アナログ出力0-4.2 V (VCC 5.0V)


https://akizukidenshi.com/catalog/g/g107047/

乾燥/湿潤の出力の大小が静電容量式とは逆になっている。

|出力電圧[V]|乾燥|湿潤|
|:-:|:-:|:-:|
|1|0|3.7|
|2|0|3.4|
|平均|0|3.55|


### Adafruit STEMMA Soil Sensor - I2C CapacitiveMoisture Sensor

今回の4種類では唯一のディジタル出力で、I2Cで繋がる。温度センサーも内蔵しているが、精度は±2℃と精度は高くない。

- ¥1,150/個
- 静電容量式
- 端子：PH型（2mmピッチ）×4（ケーブル別売り）
- DC 3-5 V
- ディジタル出力：200 (乾燥) - 2000 (湿潤) (ATSAMD10に繋いだ場合)

https://akizukidenshi.com/catalog/g/g116357/

水分値に関しては、およそ300のレンジがある。

|出力ディジタル値|乾燥|湿潤|温度|
|:-:|:-:|:-:|:-:|
|1|315|607|26|
|2|318|621|23|
|平均|316.5|614|24.5|



## センサーの使い方

アナログ出力の前者3種類は同じような接続で使えるが、ディジタル出力のAdafruit STEMMA Soil Sensorでは使い方が異なる。

### アナログ出力センサー

センサーが動作するための電源を繋ぐVCC、センサー値を電圧として出力する端子、グラウンドの3ピンをArduinoなどのマイコンに繋ぐ。出力はプログラムで指定したピンに繋げば良い。ただし、ESPr Developerのアナログ入力は0-1Vしか入れることができないので、上記のセンサーはそのまま使用することができない。対処法の一つとしては、抵抗分圧で0-1Vの範囲に収めることができる。例えば、22kΩと10kΩの抵抗を使って10/32に抵抗分圧。Arduino UNO R4 Wifiなどはレンジが広いのでそのまま繋いで使用することができる。

![analog_soil_sensor_ブレッドボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756622/3a64dfa6-a173-20ed-edf4-9105b64e64a0.png)


 
```
#include "thingProperties.h"

void setup() {
  Serial.begin(115200);
  delay(1500); 
  initProperties();
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
}

void loop() {
  ArduinoCloud.update();
  
  moisture = analogRead(TOUT);
}
```
 


### ディジタル出力センサー (Adafruit STEMMA Soil Sensor)

VCC, GND, SCL, SDAの4ピンを繋ぐ。

![adafruit_soil_sensor_ブレッドボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756622/14b0aa49-2209-dcae-a9bb-d854b0eaa053.png)



加えて、以下のライブラリが必要。

- Adafruit_seesaw.h
- Adafruit_seesaw.cpp

https://github.com/adafruit/Adafruit_Seesaw

```
#include "thingProperties.h"
#include "Adafruit_seesaw.h"

Adafruit_seesaw ss;

void setup() {
  Serial.begin(115200);
  delay(1500); 
  initProperties();
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
}

void loop() {
  ArduinoCloud.update();
  
  tempC = ss.getTemp();
  capread = ss.touchRead(0);
}
```


## センサーの値の安定性

ノイズがなければセンサーは一定の値を出力する状態で丸一日間放置して、センサーごとの値の安定性を確認した。具体的には、アナログセンサーの3つについて、静電容量型は発泡スチロールの上のなるべく空気と接するように置き、抵抗型は水中に置いた。各種2つずつ検証し、同時にデータを得るためにArduino UNO R4 Wifiを用いた。

![S__15458350.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756622/298883f4-6258-4036-bdd9-665b4d514e17.jpeg)


DHT22を用いて、気温と湿度へのセンサー値の依存性も検証したが、今回のような±1℃の条件下では依存性は見られなかった。

![スクリーンショット 2024-05-06 10.51.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756622/2ef1f881-7553-648a-eb1c-d51058e58b64.png)
![スクリーンショット 2024-05-06 10.52.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756622/7528e008-43b1-1031-abac-ec6788ce8f3b.png)
![スクリーンショット 2024-05-06 10.52.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3756622/6c923f70-0b0d-d4bd-cfa4-eb7968324561.png)

Arduino Cloudからデータを吐き出して統計処理すると、ばらつきが見えてきた。抵抗型のSEN0114は±100も値が変化してしまっている。それに対し静電容量型は±40に収まっており、標準偏差も小さい。

|  | DiyStudio＿1 | DiyStudio＿2 | SEN0114_1 | SEN0114_2 | SEN0194_1 | sen0194_2 |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|   平均| 503.91	|509.86	|653.25	|659.17|	578.95	|578.09|
|   最大値|26.09	|41.14	|109.75	|90.83	|21.05	|20.91|
|   最小値|-14.91	|-31.86	|-103.25	|-88.17	|-9.95	|-10.09|
|   標準偏差|7.00	|19.06	|63.52|	54.59|	3.98|	3.58|



## まとめ

値の安定性の観点では静電容量型が良く、単価¥200のDiyStudioはコスパが良い。SEN0194は個体差も少なそうで、何十個と使うのでなければ選択肢としてはありだろう。