Grove TDS 水質センサを温度補正するようにしたので紹介します.
はじめに
Grove の TDS 水質センサーは,A/D 変換器と組み合わせることで,Raspberry Pi から水槽の水質チェックができるようになる便利なアイテムです.
ただ,メーカのドキュメントにある下記のコードをそのまま使うと,水温によって値が変化してしまうと言う課題があります.
1 2 3 4 5 |
sensorValue = analogRead(sensorPin); Voltage = sensorValue*5/1024.0; //Convert analog reading to Voltage tdsValue=(133.42/Voltage*Voltage*Voltage - 255.86*Voltage*Voltage + 857.39*Voltage)*0.5; //Convert voltage value to TDS value SERIAL.print("TDS Value = "); SERIAL.print(tdsValue); |
実際に温度によって値が変わってしまう様子を以下に示します.水槽用のクーラによって水温が変わるタイミングで影響を受けていることが確認できます.
水槽で実際に発生する温度変化による影響は数ppm レベルなので,実用上は特に気にするほどではないのですが,ちょっと気持ち悪いので温度補正することにしました.
温度補正式
DFRobot のリポジトリにある GravityTDS.cpp は温度補正がされており,次のようなコードになっています.
1 2 3 |
this->ecValue=(133.42*this->voltage*this->voltage*this->voltage - 255.86*this->voltage*this->voltage + 857.39*this->voltage)*this->kValue; this->ecValue25 = this->ecValue / (1.0+0.02*(this->temperature-25.0)); //temperature compensation this->tdsValue = ecValue25 * TdsFactor; |
/ (1.0+0.02*(this->temperature-25.0)
の部分が補正をしている部分になります.
これをそのまま使っても良いのですが,せっかくなので温度係数である 0.02 をいじりながら調整したところ,私の環境では 0.018 がぴったりでした.
補正後はこんな感じになります.
温度が急変している箇所でも TDS の値は綺麗に連続しています.
おまけ
上のグラフをみると,ざっくり 30 時間で,TDS は 20ppm 上昇していることがわかります.水の量はざっくり 50L なので,30時間でざっくり 程度不純物が増えている計算になりそうです.
コメント
はじめまして。ラズパイでTDSを計測したいと思ってGroveのTDSセンサを購入し、試行錯誤している中でこちらのサイトにたどり着きました。
もしよければ教えて下さい。
「A/D 変換器」として「Grove Base Hat for RasPi Zero」を使用するのは間違っていますでしょうか?
「Grove Base Hat for RasPi Zero」経由でラズパイZeroと接続して、Groveのドキュメントにあるコード(TDS.py)を実行してみたところ、センサが認識されず途方に暮れています。
エラーメッセージとして「Check whether I2C enabled and Grove Base Hat RPi or Grove Base Hat RPi Zero inserte」が出るのですが、I2Cは有効化しましたし、Grove Base経由でブザーを鳴らすことはできているので、接続も問題ないと思っています。
周りに相談できる人もいないので、なにかアドバイスを頂ければとても助かります。