水耕栽培管理システムの測定計器として残っているのは、水温計とTDS計です。水温計は基本的な測定機器すぎて、ちょっと後回しになっていました。悩むところがあまりなかった、ということもあります。
DS18B20/水温計

“DS18B20″はこの温度計の型番ではなくて、内部に入っているサーミスタの型番です。購入元を確認しても、この温度計に相当する型番はなく、DS18B20を使っている温度計は全てDS18B20と表現されているので、識別は難しいですね。同じDS18B20でも上の写真のように防水プローブになっているものと、サーミスタむき出しのものは温度変化への応答性が全然違うので、違う型番を付けて欲しい気がしますが、どうなんでしょう。
写真の防水プローブになっているものは、プローブそのものが熱容量を持っているため、空気のような熱伝導率の低いものが相手の場合、温度変化に対して凄く鈍感です。一方、相手が水のような熱伝導率の比較的良いものの場合は、全く問題にならず、温度変化に対する感度も十分です。
使い方はプルアップという形に慣れていれば、あまり悩まないです。マイコンとの通信が1-Wireなので、1-Wierに対応したライブラリのインクルード等が出るくらいですね。参考にしたのは、geotechlab-workshopさんの記事です。
第21回 温度計測② 温度センサーDS18B20
https://ameblo.jp/geotechlab-workshop/entry-12611897179.html
これによると、プルアップ抵抗は1kΩでもいいみたいなので、1kΩで入れています。丁度手持ちに4.7kΩが無かったということもあったりします。温度は市販の温度計とほぼ一致するので、問題なさそうです。
スケッチはDallastemperature.hについているサンプルそのままです。
#include <OneWire.h> // For Water Temp.
#include <DallasTemperature.h>
#define ONE_WIRE_BUS D3
#define SENSER_BIT 9 //
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(115200);
pinMode(ONE_WIRE_BUS, INPUT); //D3 --ONE WIRE BUS, DS18B20
sensors.setResolution(SENSER_BIT);
}
void loop() {
float Water_Temp; //Water Temp
sensors.requestTemperatures();
Water_Temp = sensors.getTempCByIndex(0);
Serial.print("Water Temp = ");
Serial.print(Water_Temp);
Serial.println(" C");
delay(1000);
}
1-Wireなので複数の測定器を一本の線で繋ぐことができますが、水温計はたちまち1本しか要らないので、せっかくの機能が使えず残念です。アドレスを調べないといけないんですよね。いつかやってみます。
TDS計
TDSはTotal Dissolved Solid、総溶解固形物で、溶けているものの量の指標ですね。実際は電気伝導度を測定しているので、EC値と本質的に同じものです。現に、TDS値とEC値の相関係数が知られていたりします。
水耕栽培では肥料を水に溶かしています。溶かした肥料成分の絶対量が直接わからなくても、相対的にどう変化しているかが分かれば、肥料の濃度調整には十分と思います。水耕栽培ではEC計を使うことが多いようですが、あまりこだわらず、EC計より安価であったTDS計を導入しました。
試してみるTDS計は、Seeed StudioのGrove – TDS Sensor/Meter For Water Quality (Total Dissolved Solids)です。型番とかないのかな。

スケッチはSeeed Studioの製品wikiにあるサンプルコードほぼそのままです。サンプルコードはArduino向けに書かれているので、センサー値を電圧変換するのに1024で割って5Vをかけていますが、ESP32はアナログ値が4096段階なので、その部分は4096で割って5Vを掛けています。動作電圧を5Vで行くならこのままですが、3.3Vで行くなら、掛けるのも3.3Vに変える必要がありますね。
#define TDS_PIN A1 //TDS
int TDS_sensor = 0;
float TDS_Voltage = 0;
float TDS = 0;
void setup() {
Serial.begin(115200);
pinMode(TDS_PIN, INPUT); //A1
}
void loop() {
TDS_sensor = analogRead(TDS_PIN); //TDS
TDS_Voltage = TDS_sensor * 5 / 4096.0; //←4096で割って5を掛ける
TDS = (133.42 * TDS_Voltage * TDS_Voltage * TDS_Voltage - 255.86 * TDS_Voltage * TDS_Voltage + 857.39 * TDS_Voltage) * 0.5;
Serial.print("TDS = ");
Serial.print(TDS);
Serial.println(" ppm");
Serial.println(" ");
delay(1000);
}
ちょっと残念なのが、計算式の原典が記載されていない、ということですね。電圧の3次式になっていますが、これが理論式なのか経験式なのか、ぱっと見わからないです。なんとなく経験式っぽいですけど、どうでしょう。
まあ、絶対値が知りたいわけではなくて、初期の肥料投入量による肥料濃度が薄くなっているのか濃くなっているのか、それがどれくらいかが分かれば十分なので、このまま使うことにします。ただ、電気伝導度自身は温度依存性があるので、今の環境で温度とTDS値の相関を取って温度補正を入れたいですね。もうちょっと寒くなって、屋外での水耕栽培が難しくなってきたらデータを取ってみようかな。
DS18B20とTDS計のトレンド(ambient)は下のような感じ。

上が水温計で下がTDS計です。この期間、水温は22.4℃から22.6℃へ僅かに上がっていますが、TDS値は790ppmから753ppmまで減少しています。最盛期には5日で1000ppmほど減少しました。ここまではっきり数字と変化が出れば、濃度調整のための仕組みは簡単に作れそうです。
具体的には、ノイズがある程度あるので、何回かの測定の平均値が設定値を下回ったら、規定量の肥料水溶液を投入、です。水槽内の拡散はエアレーションによる水の動きだけなので、TDS設定値まで肥料を投入、をやってしまうと、必ずオーバーシュートします。今シーズンの実績から、水入れ替え後は計量スプーン9杯でTDS値2000ppmくらいなので、そこから投入量を計算できます。なお、スプーン9杯投入後、TDS値が2000ppmくらいで落ち着くのに一晩かかりました。
長くなりそうなので、とりあえずここまで。次は基板作成とスケッチ全体像かな。









コメントを残す