【コピペで簡単】EC計を自作してみたら水耕栽培に使えそうです
海外の方の自作ec計を参考にesp32でECメーターを作ってみたのですが、公開されているスケッチではesp32で動作させることは出来ません。
そこでesp32で使えるように変更し、水耕栽培にも使えるようにしてみました。
電気伝導率とは
電気伝導率κは,面積1m2 の2個の平面電極が距離1m で対向している容器に電解質水溶液を満たして測定した電気抵抗の逆数
この電極はちょっとデカいですよね。
旧単位では電極間距離を1cm、電極面積を1cm ×1cm として〔S/cm〕表していたようですのでどうして変更したのか判りませんが旧単位の方が実用的のような感じがします。
正確性では異なるのかも知れませんが、元々温度や測定する溶液でec値が異なりますし、ある程度のメドが判ればいいので旧単位を採用することにしました。
ec計を自作する
海外の方がコンセントのプラグを電極にしてec計を自作していました。
電極は何でもいいと思うのですが、電極間の距離と電極の面積でセル定数が変わるので電極を自作するとそのままのセル定数では実用にはなりません。
また、セル定数を自分で計算するとなるとちょっと大変な作業になります。
コンセントのプラグなら規格化されているのでセル定数をそのまま使えますね。
また、arduinoのプログラムも公開してくれているのでそのままパクらせてもらうことにします。
ただarduino unoより今はwifiを使えるesp32がそのまま測定データを外部のサーバーに記録出来るので都合がいいですよね。
そこでesp32を使ったec計を自作することにしましたが…
動作しません。
どうして?と思いいろいろ調べて何とか出来ましたので、注意点とか共有したいと思います。
直流電流で計測
EC計測は交流で行われる。直流では電極面と被検液との間に分極と呼ばれる現象が生じて被検液の真の抵抗が測定できなくなる。
従来このような見解が一般的でした。
では交流の周波数はどの程度なのか調べてみるとおよそ50Khz~300KHzあたりのようです。
メガヘルツではなくキロヘルツなんですね。
しかしarduinoやesp32では直流で計測します。
Arduino UNOのCPUは8ビットでクロック周波数は16MHz。一方ESPのCPUは32ビットでクロック周波数は80MHzです。
ですから瞬間的に直流電流を流し、瞬間的に計測し、瞬間的に電流を遮断し、計測間隔も5秒空けることで分極による弊害を防ごうということですね。
また後で記述するプログラムではEC値を計測するのにわざわざ遅延(delay)させています。arduinoでは丁度よくてもesp32ではプログラムの実行が速すぎました。 (^^;
導電率のはかり方
オームの法則では
抵抗( R )=電圧(E)/電流( I )
これはよく知られたことですよね。
EC計は溶液中にイオンが多ければ電気の流れが良いということを利用したものですから
導電率(k)=電圧(E)/電流( I )×セル定数
セル定数は導電率の判っている溶液から求めるのだそうです。
導電率のわかっている標準液の抵抗を測れば セル定数(K)=抵抗(R)×導電率(k)からセル定数が求まります。
標準液としてよく使用されるのは塩化カリウム(KCl)を水に溶かした溶液だそうで、これは導電率測定法の基礎を築いたコールラウシュ以来採用されている方法だそうです。
カズは外国の方が電源プラグの距離と面積からはじき出したセル定数をそのまま利用します。
温度補正
イオンも人間と同じで温度が低いと動きが悪いらしい…(^^;
そこでEC計では温度による補正をして25°Cに変換した数値をEC値としているそうです。
25°の伝導率 =測定した伝導率/[1 +α:温度係数(測定した温度- 25)]
ただこの温度係数が万能ではないようで計算が難しいらしい…。
一般には液の温度を測って、その温度で得られた導電率値を25℃での導電率値に換算しています。液の種類や濃度によって温度に対する導電率値の変化が違うので、本来は液によって換算する度合いは異なるはずですが簡易的には、1℃当り2%の導電率変化をするものとして換算します。(JISで決められています)
そこでJIS(日本工業規格)では便宜的に温度係数を0.02としているそうです。
25°の導電率=計測値÷{1+0.02×(測定温度-25) }
プログラムではこの部分です。
EC25 = EC/ (1+ TemperatureCoef*(Temperature-25.0));
プログラムでは 0.019 という数値を採用しています。
実際実験してみたら 0.019でも 0.02でも左程変わりありませんでした。
計測により数値が変化しますし、温度でも数値が変化します。
では使えないんじゃない?と思って調べたら、プロ農家の方が使う肥料ブランド、 大塚ハウスの標準液肥の分析値の中にEC値が記載されているのですが、実際の利用ではかなりの幅で液肥の濃度を調整して使うようです。
これが栽培農家のノウハウになるのでしょうね。
ということで多少の誤差は植物の方が調整してくれます。 (^^;
カズは水と肥料の標準混合比で水耕栽培をしようと思います。
一般家庭向けには肥料メーカーさんはEC値を2.4ms/cmで開発しているそうで、ハイポニカ肥料も同じです。
プロ農家さんは育苗、根の伸長、発育、開花、結実などの段階に合わせて溶液濃度や肥料成分の混合比を変えているようです。
ec計 自作
ec計の仕組みが判ったところで早速esp32でec計を自作してみます。
準備する材料です。
esp32
ESP32は Wi-FiとBluetoothを内蔵する低コスト、低消費電力のマイクロコントローラで上海が拠点のEspressif Systemsが開発しています。
arduinoの開発環境 arduinoIDEが使えてarduinoより小型でwifi内臓ということで人気が高まっています。
カズもarduinoからesp32に移行しています。
ESP32 DevKitC V4 ESP-WROOM-32 は WiFi BLE 技適取得済 ですのでいいですね。
技適とは電波法規制をクリアしているということで電波をだしてもいいよというお墨付きです。
個人はともかくちょっと規模の大きいハウス栽培農家さんなどはこのようなささいなことでもマスコミから叩かれることもあり得ます。法は法ですので注意したいところです。
ds18b20 温度センサー
DS18B20 防水型温度センサで温度補正を行います。
ds18b20はハウス温度や土中温度なども計測出来て、一つ一つシリアル番号が付与されていますので入力ピンが一つで複数の温度センサーの値を読み取ることが出来ます。
ds18b20 温度センサを動作させるにはOneWire ライブラリとDallasTemperature ライブラリを使用します。このライブラリのインストール方法はこちらに詳しく取り上げています。またarduino IDEのインストール方法やスマホで見たり指示を出したりする方法などもこちらです。
【iot農業・温度】スマホで温度センサーの値を表示させてみた
抵抗
抵抗は1kΩと4.7kΩの抵抗を用意します。
ds18b20のライブラリの作者によれば5kΩでもいいそうです。実際の計測実験では変わりませんでした。
この際、抵抗セットがあるといいですね。
電源プラグ
電源プラグは古い電気製品のプラグを流用しました。
新たに購入する場合にはプラグの部分が一体成型されているのがいいようです。
プラグを溶液に浸しますのでねじで止めるプラグでは電極の距離や面積が変わってしまう可能性があります。
配線
esp32とds18b20 温度センサーの配線はこのようにしました。
赤 ⇒ VCC 3.3V
黒 ⇒ GND
黄 ⇒ 32
4.7kΩ抵抗 ⇒ 32とVCC
電源プラグの配線
1kΩ抵抗 ⇒ 27と33
プラグ ⇒ 25
プラグ ⇒ 27
この画像では温度センサのVCCを直接3.3Vのピンに接続していますが、GPIO 26のピンに接続することでスケッチと同じ配線になります。(このままでも動作します)
const int TempProbePossitive =26; //ds18b20 VCC
参考:ESP32 ESP-WROOM-32 Pin 配置
計測
コップに水を入れて測定してみました。このネコチャン、見覚えありませんかぁ~? =^_^=
レンジで少し温め25°Cに近づけています。
15°Cでも同じ結果でした。水に投入直後は少し数値が変化しましたが、1分ほどで落ち着きました。
大手肥料メーカーのブランド、大塚ハウスの液肥のEC計測では水道水のEC値を0.11 (25℃) として液肥のec値を算出していますのでほぼ実用に耐えるec計かなと思います。
何よりセンサーに使う電極が不用品でOKと言うのはいいですよね。
ec計 自作のプログラム
スケッチは外国の方のを参考に一部修正しました。
esp32の内部抵抗ですがarduinoとは少し小さめにしています。 R1=(R1+Ra); の部分です。
raw= analogRead(ECPin);の後にdelay(2)を加えました。
delay(2);
計算速度が速く、キャパシタンスの影響を受けるようで計測値が高くなりました。
そこで、一旦計測して、2ミリ秒待機して再度計測しています。
Vdrop=(Vin*raw)/1024.0;をVdrop=(Vin*raw)/4096.0;に変更しました。
arduinoは8ビットですが、esp32は32ビットです。
esp32で使えるピンはGPIOpinであれば使えるらしい(いろいろ制約があります)のですが36,39,34,35のピンは入力のみとなっています。カズは最初このピンを使ってしまったので動作せずハマってしまいました。 (^^;
arduinoの電圧は5Vですがesp32は3.3Vの動作電圧ですので電圧を変更しています。
float Vin= 3.3;
ec計スケッチ
[php]#include <OneWire.h>
#include <DallasTemperature.h>
int R1= 1000;
int Ra=22; //arduino Ra=25; eso32 Ra=22
int ECPin= 27; //INPUT
int ECGround=25; //OUTPUT
int ECPower =33; //OUTPUT
float PPMconversion=0.7; //セル定数 [USA] PPMconverion: 0.5 [EU] PPMconversion: 0.64 [Australia] PPMconversion: 0.7
float TemperatureCoef = 0.019; //温度補正 0.02が多い。
float K=2.88;
#define ONE_WIRE_BUS 32
const int TempProbePossitive =26; //ds18b20 VCC
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
float Temperature;
float EC=0;
float EC25 =0;
int ppm =0;
float raw= 0;
float Vin= 3.3; //5;
float Vdrop= 0;
float Rc= 0;
float buffer=0;
void setup(){
Serial.begin(115200);
pinMode(TempProbePossitive , OUTPUT );
digitalWrite(TempProbePossitive , HIGH );
pinMode(ECPin,INPUT);
pinMode(ECPower,OUTPUT);
pinMode(ECGround,OUTPUT);
digitalWrite(ECGround,LOW);
delay(100);
sensors.begin();
delay(100);
R1=(R1+Ra);
}
void loop(){
GetEC();
PrintReadings();
delay(5000);
}
void GetEC(){
sensors.requestTemperatures();
Temperature=sensors.getTempCByIndex(0);
digitalWrite(ECPower,HIGH);
raw= analogRead(ECPin);
delay(2); //esp32の計算速度が速いので2ミリ秒待機
raw= analogRead(ECPin);//静電容量の影響を抑えて再度計測
digitalWrite(ECPower,LOW);
Vdrop=(Vin*raw)/4096.0; //arduinoでは4096→1024に変更する。
Rc=(Vdrop*R1)/(Vin-Vdrop);
Rc=Rc-Ra; //acounting for Digital Pin Resitance
EC = 1000/(Rc*K);
EC25 = EC/ (1+ TemperatureCoef*(Temperature-25.0));
ppm=(EC25)*(PPMconversion*1000);
}
void PrintReadings(){
Serial.print("Rc: ");
Serial.print(Rc);
Serial.print(" EC: ");
Serial.print(EC25);
Serial.print(" Simens ");
Serial.print(ppm);
Serial.print(" ppm ");
Serial.print(Temperature);
Serial.println(" *C ");
}[/php]
ec計 自作のまとめ
アマゾンでは割安でec計が売られていますが難点は単独計測ですよね。
連続したデータを取ることが出来ないので時系列で大きな変化を掴むことが出来ません。
といって、家庭菜園レベルでは高価な商品には手を出せませんがec計の自作なら手軽に作ることが出来、時系列でデータも取れます。
専業農家の方も試験的に手軽に使えて栽培する野菜や果物の成長段階とec値の因果関係を調べるということにも使えそうです。
ec計が出来たので、esp32で、ec計測、温度計測、湿度、気圧、日照計測と出来るようになりました。
そのデータをwifiからカイエンサーバに飛ばし、スマホでチエックしたり、ポンプのスイッチを入れたり出来るようになりました。
スマホで海外や外出先から水やりする方法はこちらに詳しくまとめました。
Pinを変更しました。
日照量、温度、湿度、気圧、水耕栽培溶液量、ECなどの基礎データをgoogle sheetで記録しようとしたところEC計測が出来ないことが判明しました。
どうして?ということでハマってしまいましたが、esp32でWiFiを使うと、いくつかのピンでdigital Writeが出来ないことが判りました。
数値は4095の値を示しますので電圧が3.3Vのままで変化しません。
ということでアナログ計測も不可ということが判りました。
IOピンの2,4,12,14,15,26,27のピンで analogReadが 出来ないようです。
そこで、
int ECPin = 32; //INPUT
int ECGround = 25; //OUTPUT
int ECPower = 33;
#define ONE_WIRE_BUS 14
1KΩ抵抗 ⇒ GPIO 32 ,GPIO 33
ECセンサー(電源プラグ) GPIO 25,GPIO 32
に変更しました。
勿論、WIFIを使わなければ今のままでOKです。
温度の計測はGPIO 14を使いましたが、このピンには複数のDS18B20 温度センサーを入力出来ます。 (^^;
詳しくはこちらの記事にまとめました。
【農業 iot】スマホで遠隔水やり&複数・温度センサー