北海道で買ってきたまりもをこぢんまりと育てるつもりが、どんどんアクアリウムにハマって後戻りできない状態のgoldear@goldear820です。
アクアリウムで非常に重要になってくるのが「水温管理」ですが、我が家はNASが24時間稼働しているせいか異常に暑いです。
まずスマートアクアリウムの第一歩として、水槽の「水温測定」をできるようにしてみます。
目次
全体図
簡易的な全体図になります。
スマートアクアリウムはRaspberry Piをベースに実装していきます。
Raspberry Piの持つGPIO経由で各種センサと接続してセンサ情報を収集、Raspberry Pi自身にセンサ情報を処理させます。
今回は温度&湿度センサDHT22を使って、機能を追加していきます。
今後、機能拡張を行うごとに全体図は更新していきます。現時点で実装予定の機能は以下のとおりです。
・室温/湿度測定
・CO2測定
・TDS(Total Dissolved Solids)測定
・センサ情報のOLED表示
・映像ストリーミング
・Webサーバにセンサ情報公開
準備物
Raspberry Pi
以前GPSロガーを作るために買ったが、GPSを全く補足できず余っていたRaspberry Pi ZERO WHを使用します。
Raspberry Piシリーズであればどの機種でも問題なく動きますが、機能拡張による処理増大・カメラモジュールによるリアルタイム映像配信を実施するにはZEROシリーズはあまりにも非力です。
今はZERO WHで実装しつつ、本番環境では2023年9月28日に発表された Raspberry Pi 5 に乗り換えようと考えています。(以下、ラズパイとして記載)
水温センサ DS18B20
水温センサ DS18B20 は中華製のよく分からないブランドのものを適当に選択しました。DS18B20であれば使い方は同じでしょう。
購入の際の注意点として2点あります。
・防水仕様であること
DS18B20には非防水タイプのモジュールも販売されているため、水槽に使用するために防水タイプであることを確認しておきます。
・アダプタの有無
プルアップ・プルダウン抵抗のアダプタ付きのものとセンサのみのものが販売されています。センサのみの場合、別途4.7k抵抗を用意する必要があります。
ブレッドボード & ジャンパワイヤ
今回はDS18B20センサとラズパイをジャンパワイヤで直接接続するため使用しませんが、今後拡張するセンサを挿していくブレッドボードは必須です。またDS18B20センサのみのタイプはコネクタのオスメス変換が必須なので注意が必要です。
設定
ラズパイの初期セットアップは以前、記事にまとめましたので、そちらを参考にどうぞ。
全体図と同様にセンサとラズパイを接続してから、ラズパイの設定を行います。まず「1-Wire」を有効化します。
pi@raspberry:~ $ sudo raspi-config
上記コマンドを実行することで、設定画面が表示されます。
「3 Interface Options」を選択します。
※ Debian 12ベースのRaspberry Pi OS「Bookworm」の設定画面です。バージョン違いで設定項目が異なる可能性があります。
「I6 1-Wire」を選択します。
「Yes」を選択して1-Wireが有効化されます。
1-Wireについて上記のページが分かりやすいです。
次にちゃんとデバイスとして認識しているか確認します。
pi@raspberry:/sys/bus/w1/devices/28-0000001548b9 $ cat w1_slave
b6 01 7f 80 7f ff 0a 10 2d : crc=2d YES
b6 01 7f 80 7f ff 0a 10 2d t=27375
ラズパイがデバイスを正常に認識している場合「/sys/bus/w1/device/28-XXXXXXXXXXXX 」というファイルができています。※XXX は固有番号
「t=27375」と読み出した値が水温になります。値は1000倍されているので、水温は27.375℃と分かります。
毎回この値を読み出すのは面倒なので、pythonプログラムを組んで水温を取得します。
実装
「w1thermsensor」モジュールを使用して、サクッと水温を取得します。
pi@raspberry:~ $ pip install w1thermsensor
開発環境によってインストールコマンドが apt-get install を使うのか pip install を使うのか異なります。私はpython仮想環境にインストールしていくので、上記コマンドでインストールしています。
#!/usr/bin/env python3 from w1thermsensor import W1ThermSensor def main(): # Create instance temp_sensor = W1ThermSensor() # Get water temperature temp = temp_sensor.get_temperature() print("水温:{0:.2f}℃".format(temp)) return if __name__ == "__main__": main()
GPIOピンアサインとか必要ないです。サクッとコーティングしてみました。
動作確認
DS18B20センサを水の入った器に付け始めたら取得したが下がることを確認できました。氷を入れると一気に下がるので分かりやすいです。
pi@raspberry:~/work/smart_aquarium/script $ python ds18b20.py
水温:24.00℃
pi@raspberry:~/work/smart_aquarium/script $ python ds18b20.py
水温:19.88℃
作成したpythonプログラムを実行して水温取得してコンソールに出力することができました。
まとめ
スマートアクアリウムの第一歩として水槽の「水温測定」を行いました。水温だけ分かっても何ができるのか状態なので、これから機能拡張を行い使い勝手の良いシステムに仕上げていきます。
・温度&湿度測定の実装
・TDS測定の実装
コメント