#1.やったこと
- 水槽の溶存酸素(DO:Dissolved Oxygen)をラズパイとセンサーを使って計測。
- おそらくpH計、ORP計もコード内のセンサーのアドレスを書き換えて同様にしてできると思われます。
- センサーメーカーのサンプルコードをベースにして、計測データをIoTデータ可視化サービス (ThingSpeak)で可視化する機能を追加。
→コード編
https://qiita.com/fftcy-sttkm/items/e4ed7560241c72dda298
#2.用意するセンサー
- Atlas Scientific社製、Dissolved Oxygen Kit(センサー、EZO circuit、BNC connector、校正液)
- kitは個人輸入しました。
https://www.atlas-scientific.com/product_pages/kits/do_kit.html - 注意点1:説明書によれば、このDO計はガルバニ式溶存酸素計という方式をとり、膜を溶存酸素が透過し、中の電解液中の電流が変化することを利用して酸素濃度を計測しています。なので、流れがない場所にずっと置いておくと、膜周りの酸素がどんどん膜の中に透過して、計測する酸素濃度はどんどん低くなってしまいます。そのため、ろ過の流水部などに置く必要があります。自分は止水状態にして計測していたら8mg/Lから5mg/Lくらいに下がっていきました。
- 注意点2:ちゃんとした値を得るには、中の電解液と膜を2年ごとに交換する必要があります(交換用部品も売っています)。
- 注意点3:内部に鉛かなにかを使っているようで、廃棄する場合適切に処理する必要があると思われます。
- 注意点4:2点校正(オプション)のための校正液はガイコツのマークがついていました。調べたら亜硫酸ナトリウムだと思われ、水道に流していいものなのか分かりません。これも適切に処理する必要があるかもしれません。→ここでは1点校正(空気中の酸素で校正)を使うので、校正液は使用しない。2点校正は、空気中の酸素と、酸素濃度ゼロの校正液で校正する。
#3.参考にさせていただいたサイト
センサーメーカーのサンプルコードがgithubにありました。
myhydropiは、メーカーのセンサーの使用例を色々公開しているサイト。水温、pH、ORP(酸化還元電位:水質が還元状態か酸化状態か)、EC(電気伝導率)の例が載っている。DOはなかった。英語。
https://github.com/AtlasScientific/Raspberry-Pi-sample-code/blob/master/i2c.py
https://myhydropi.com/connecting-a-ph-sensor-to-a-raspberry-pi
#4.EZO circuitをI2Cモードにする
kitに入っている小さくて黄色い基盤がEZO circuitです(以下、EZO)。これはラズパイとセンサー間の信号のやり取りをうまいことやってくれる何かなのでしょう。詳しくはよく分かりません笑。
EZOはデフォルトではUARTモードで通信する設定になっています。これを次のようにI2Cモードにする必要があります。
- ラズパイの電源を切る。
- 回路を下記のように組む。VCC(EZO)ー3.3V(ラズパイ)、PGND(EZO)ーGND(ラズパイ)をそれぞれ接続し、EZOのTXとPGNDをショートさせる。
- 電源を入れる。
- EZOのLEDが緑から青に変わるのを確認。
これでEZOがI2Cモードになります。もう一度これを繰り返すと再度UARTモードになります。その際は、LEDは青から緑になります。なお、UARTとI2Cが何なのかはよくわかってません笑。
#5.ラズパイをI2C通信可能にする
まず、I2C用モジュールを有効化します。
左上のボタン→「設定」→「Raspberry Piの設定」→「インターフェイス」→I2Cを有効
終わったら再起動します。
次に、ターミナルで、I2Cに必要なパッケージをインストールします。
sudo apt-get update
sudo apt-get install i2c-tools
#6.センサーを接続し、ラズパイに認識させる
ラズパイをマスター、センサーはスレーブ(主人と奴隷?)と呼び、マスターがある特定のスレーブと通信できるよう、スレーブにはアドレスが割り振られます。このアドレスにより、複数のセンサーを使う際、通信の衝突を防ぐみたいです。工場出荷時にデフォルトで割り振られ、特別な事情がない限り変える必要はないそうです。
AS社のDOセンサーは0x61(97)です。
他のpHセンサーなどを使う場合は、データシートの各センサーのアドレスを参照します。
まず、センサーを繋いでいない状態で下記のスレーブの接続アドレスを確認するコマンドを実行すると、何も認識されていないことがわかります。
i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
次に、下記のように回路を組み、再度i2cdetectコマンドを実行します。すると下記のように61と表示され、0x61というアドレスにDOセンサーが接続されたことがマスター側(ラズパイ)に認識されました。
i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- 61 -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
あとはコードを動かすだけです。