02.M5Stak Basicで自動水やり(1)
02.M5Stak Basicで自動水やり(1)
自動水やり装置DIYキットをAmazonで購入しました。
WayinTop 自動水やり装置 DIYキット 静電容量式土壌水分センサー4個+ポンプ4個+5mホース+リレーモジュール4チャンネル1個 2,280円
https://www.amazon.co.jp/gp/product/B07VNDZDCR/ref=ppx_yo_dt_b_asin_title_o01_s00?ie=UTF8&psc=1
この土壌水分センサーでは、正確な水分量は測定できません。土が乾いているかいないかを判定する程度です。今回は準備までです。
内容物
- 静電容量式土壌水分センサーx4個
 - センサー用ハーネス20cmx4本
 - 小型ポンプx4個
 - リレーモジュールx1個
 - ホースx5m (1台当たり125cm)
 
静電容量式土壌水分センサー
- Capacitive Soil Moisture Sensor v1.2
 - Vcc DC3.3-5.5V
 - Icc 5.5mA
 - Vo DC0-3.3V
HPでは3Vとなっていて内蔵の電圧レギュレーターで3Vにしているのかと思ったが、測定では3.3Vでした。
実際の静電容量のアナログ範囲は1.2-2.5Vとあります。 - コネクタ PH2.54-3P (PH2.0-3Pではなかった)
pin:1-GND, 2-Vcc, 3-Aout - 使用IC TLC555CD (TI)
表示はTL555C
TLC555Cのデータシートより
VDD=2-15V
Ta=0-70℃
出力抵抗Roは、Ta=0℃時Ro=180Ω,Ta=50℃時Ro=230Ω(VDD=3V, Io=0.3mA, 出力H時) - 推奨深度は、Sensor v1.2のシルク表示のn~1の間です。また、シルクの線は警告線です。
 - 土中に入る部分はレジストがかかっていて金属むき出しではないため耐食性があります。
 - 回路部は防水ではありません。
 - 添付ハーネス長は、20cmで短いです。
 
水分量と静電容量
コンデンサの静電容量Cは、S:極板の面積
d:極板間の距離
とすると、Sに比例し、dに反比例します。その時の係数をεとすると
C = ε x S / d
となりεを誘電率と言います。
εo:真空の誘電率
とすると、誘電率εは、
ε = εr x εo
となり、比誘電率εrの概略値は、https://www.key-t.co.jp/resources/rader-tecinfo/rader02/ より
| 材質 | 比誘電率 | 
|---|---|
| 空気 | 1 | 
| 関東ローム(乾燥) | 2-5 | 
| 土(乾燥) | 2-6 | 
| 砂(乾燥) | 3-6 | 
| 清水・海水 | 81 | 
測定
| No. | Vcc | VDD | f | 
|---|---|---|---|
| 1 | 3.361 | 3.318 | 292 | 
| 2 | 3.361 | 3.299 | 284 | 
| 3 | 3.361 | 3.392 | 269 | 
| 4 | 3.361 | 3.298 | 261 | 
fは、600kHz±0.1%+2dgts = ±0.6kHz+2dgts = ±0.8kHz
DCVは、6V±0.7%+2dgts = ±42mV+2dgts = ±44mV
です。
回路図(検出部)
555を使用した発振回路で、ICのpin3がopenの時はほぼ0-Vccの矩形波が出力されます。土の中に埋めるセンサー部をCと見て、矩形波の電圧でR1を通しC(センサー)を充放電し、その上下しているCの電圧をD1によりピーク電圧の時C4に充電しその電圧がセンサー出力されます。また、C4には放電抵抗R4(1MΩ)が接続されています。校正
参考にした 他社DFROBT製のSKU:SEN0193https://wiki.dfrobot.com/Capacitive_Soil_Moisture_Sensor_SKU_SEN0193
より
* 出力AD値は、プローブの挿入深さと土壌の固さの影響を受けます。
1.プローブが空気中の値をADdryとします。(湿度0%RHの乾燥土壌と見なします)
2.プローブが水中の値をADwaterとします。(湿度100%RHの浸漬土壌と見なします)
水につける場合プローブの挿入深さにより値が大きく変わります。測定では、プローブをシルクのv1.2のvあたりまで水に挿入しました。
上記の2値がセンサーの検出範囲です。
5000回の平均AD測定値
| ch | ADdry | ADwater | 
|---|---|---|
| 1 | 3383 | 1535 | 
| 2 | 3361 | 1489 | 
| 3 | 3351 | 1534 | 
| 4 | 3379 | 1572 | 
小型ポンプ
- 型名 JT-C3W-4.5
 - 入力 DC4.5V (3-5V) 0.18A 0.91W
 - 動作開始電圧 1V
 - 排水口外径 7.5mm
 - 排水口内径 4.5mm
 - 入水口の径 5mm
 - 流量 100L/H (= 1.67L/M = 27.8cc/S = 3.03cm^3/S)
 - 揚程 55cm
 - 連続動作寿命 300H (= 1週と5日半 短い)
 - 電線長 20cm (短い)
 
Bringsmart(福州尚睿智能科技有限公司)
http://www.bringsmart.com/pd.jsp?id=26#_pp=0_392_-1%7E-1%7E0%7E-1%7E-1
リレーモジュール
- チャンネル:4
 - リレー:SRD-05VDC-SL-C (Songle Relay)
コイル:5V 71.4mA
接点:DC28V 10A, AC125V 10A, C接点 - 入力pin:1-GND, 2-IN1, 3-IN2, 4-IN3, 5-IN4, 6-Vcc
 - 使用出力端子:各COMとNO端子
 
回路図(1ch)
入力がL(GND)の場合LEDが点灯し、リレーがonします。入力がH(Vcc or open)の場合LEDは消灯し、リレーがoffします。ホース
- 内径:5.54mm
 - 外径:8.2mm
 - 材質:PVC (柔らかい)
 
M5Stack Basicの使用可能pin
| 場所 | pin | AD | DA | Di | Do | |
|---|---|---|---|---|---|---|
| 上 | 21 | だぶり | ||||
| 22 | だぶり | |||||
| 23 | ✕ | ✕ | ✕ | ✕ | ||
| 19 | ✕ | ✕ | ✕ | ✕ | ||
| 18 | ✕ | ✕ | ✕ | ✕ | ||
| 横 | 3 | ✕ | ✕ | 〇 | 〇 | |
| 1 | ✕ | ✕ | 〇 | 〇 | ||
| 16 | ✕ | ✕ | 〇 | 〇 | ||
| 17 | ✕ | ✕ | 〇 | 〇 | ||
| 2 | 2 | ✕ | 〇 | 〇 | ||
| 5 | ✕ | ✕ | 〇 | 〇 | ||
| 25 | 2 | 1 | ✕ | ✕ | ||
| 26 | 2 | 2 | 〇 | 〇 | ||
| 35 | 1 | ✕ | 〇 | ✕ | ||
| 36 | 1 | ✕ | 〇 | ✕ | ||
| GRO VE  | 21 | ✕ | ✕ | 〇 | 〇 | |
| 22 | ✕ | ✕ | 〇 | 〇 | ||
* pin25はスピーカ入力でも使用しています。
水分センサー出力のADCpinは、36, 35, 26, 25 とし、リレー駆動用のデジタル出力pinは、17, 16, 5, 3 とします。
電気配線
| sensor(No.1) | -- | Basic | 
|---|---|---|
| Aout(No.1) | -- | G36 | 
| Vcc | -- | 3.3V | 
| GND | -- | GND | 
| sensor(No.2) | -- | Basic | 
|---|---|---|
| Aout(No.2) | -- | G35 | 
| Vcc | -- | 3.3V | 
| GND | -- | GND | 
| sensor(No.3) | -- | Basic | 
|---|---|---|
| Aout(No.3) | -- | G26 | 
| Vcc | -- | 3.3V | 
| GND | -- | GND | 
| sensor(No.4) | -- | Basic | 
|---|---|---|
| Aout(No.4) | -- | G25 | 
| Vcc | -- | 3.3V | 
| GND | -- | GND | 
| リレーpin | -- | Basic | 
|---|---|---|
| GND | -- | GND | 
| IN1 | -- | G17 | 
| IN2 | -- | G16 | 
| IN3 | -- | G5 | 
| IN4 | -- | G3 | 
| Vcc | -- | 3.3V | 
| リレー接点 | -- | 電源 | 
|---|---|---|
| NO(No.1) | -- | 5V | 
| NO(No.2) | -- | 5V | 
| NO(No.3) | -- | 5V | 
| NO(No.4) | -- | 5V | 
| ポンプ | -- | 電源 | 
|---|---|---|
| 黒線(No.1) | -- | 0V | 
| 黒線(No.2) | -- | 0V | 
| 黒線(No.3) | -- | 0V | 
| 黒線(No.4) | -- | 0V | 
| ポンプ | -- | リレー接点 | 
|---|---|---|
| 赤線(No.1) | -- | COM(No.1) | 
| 赤線(No.2) | -- | COM(No.2) | 
| 赤線(No.3) | -- | COM(No.3) | 
| 赤線(No.4) | -- | COM(No.4) | 
動作
センサーからリレーのコイルまで動作させています。センサーが空気中の場合は乾燥で、LEDが点灯しポンプはonします。センサーを手で握ると静電容量が上がり湿潤状態となりポンプはoffとなります。
参考
SKU:SEN0193のテスト
https://www.ne.jp/asahi/shared/o-family/ElecRoom/AVRMCOM/SEN0193/SEN0193Test.html防水の静電容量式土壌水分センサー
SKU:SEN0308 (DFROBOT)https://wiki.dfrobot.com/Waterproof_Capacitive_Soil_Moisture_Sensor_SKU_SEN0308
回路部にケースが被せてあります。ケーブルは1.5mあり、反対側はコネクタ端子がついています。GNDが2端子あるので1つは出力線のシールドかもしれません。
非防水の抵抗式土壌水分センサー
SKU:SEN0114 (DFROBOT)https://wiki.dfrobot.com/Moisture_Sensor__SKU_SEN0114_
回路はTr1個と抵抗2個で構成されています。TrのVBEは温度により変化するので、出力も温度により変化すると思われます。一般に、30℃高くなると、VBEが約10%下がってonします。また、電極は金属が露出されているので錆びやすいです。
https://image.dfrobot.com/image/data/SEN0114/Moisture%20Sensor%20Schematic.pdf
インターフェース2021年7月号62頁の図1に土壌の水分含有量(%)と抵抗値(kΩ)の実測値グラフがあります。
https://interface.cqpub.co.jp/wp-content/uploads/if2107_062.pdf
2-4mmの粗い土の場合、概略40%で58kΩ, 90%で1kΩ。1mm以下の細かな土の場合、40%で12kΩ, 90%で800Ωとなっています。
土壌水分計の仕組みと活用方法
https://fieldpro.jp/mamelog/soil/3828/土壌水分関係調査
https://www.maff.go.jp/j/nousin/noukan/tyotei/kizyun/pdf/03_yousui_hata_gijutsusho5-7.pdf誘電率水分計法の静電容量法は、TDR法、ADR法と比べて地温や電気伝導度の影響を受けやすいそうです。
土壌水分を測定するセンサー
http://www.naro.affrc.go.jp/org/nkk/m/93/06-01.pdfスケッチ
// 4ch水やり M5Stack Basicにて
#include <M5Stack.h>             // M5Stack Basic
int ADpin[4] = {36, 35, 26, 25}; // 水分センサー analog入力pin
int AD;                          // AD値
float ADC;                       // ADの平均
int ADhantei = 2758;             // 水やり判定値
int RLpin[5] = {17, 16, 5, 3};   // リレー digital出力pin
int i, j;                        // 4ch,平均ループ用
int n = 5000;                    // n個の平均
void setup() {
  M5.begin();//シリアルクリア,115200bps,LCD初期化,電源管理初期化
  delay(500);                     // 0.5秒待つ
  for (i = 0; i < 4; i++) {       // ループ4ch
    pinMode(ADpin[i], ANALOG);    // アナログpinとする
    pinMode(RLpin[i], OUTPUT);    // デジタル出力pinとする
    digitalWrite(RLpin[i], HIGH); // ポンプoff(Hでoff)
  }
}
void loop() {
  for (i = 0; i < 4; i++) {       // ループ4ch
    ADC = 0;                      // ADの和の初期値
    for (j = 0; j < n; j++) {     // n回ループ
      AD = analogRead(ADpin[i]);  // アナログ入力
      ADC = ADC + AD;             // 平均値を出すための和
    }
    AD = int(ADC / n + 0.5);      // 平均値算出
    Serial.printf("%d(%04d)", i + 1, AD);//シリアルモニタに表示
    if (AD > ADhantei) {         // 乾燥時
      digitalWrite(RLpin[i], LOW);  // ポンプon
      Serial.print("on  ");         // シリアルモニタに表示
    } else {                        // 湿潤時
      digitalWrite(RLpin[i], HIGH); // ポンプoff
      Serial.print("off ");         // シリアルモニタに表示
    }
  }
  Serial.println();                 // シリアルモニタで改行
  delay(5000);                      // 5秒待つ
}



