スマート温度計が欲しいので、いろいろ調べてみました。
結果的に作ることにしました。コロナウィルスの外出自粛とゴールデンウィークで時間もあったので。
調べた内容や作り方について、まとめておきます。
スマート温度計が欲しい理由
以下の理由からスマート温度計が欲しいです。
主に体調管理の理由からです。
最終的には、二酸化炭素濃度が高くなったら自動で換気するところまでやりたいです。
市販されているスマート温度計
スマート温度計は「NETATMO」がメジャーだと思います。
温度・湿度・気圧・二酸化炭素濃度あたりが測定できるようです。
だがしかし、値段が高い! このくらい作ってやるわい!
スマート温度計を作った結果
Webサイト(Ambient)で部屋の「温度・湿度・気圧」の推移をいつでも確認できるようになりました。
まだ寒暖差は実装できませんが、簡単に開発できそうです。
二酸化炭素濃度については、手元にセンサーが無かったので、 将来対応予定です。
スマート温度計の開発手順
開発手順を残しておきます。
私も今後の機器メンテナンスで参照すると思うので。
全般的に以下のサイトが参考になりました。
必要なデバイス
- RaspberryPi
- 温度湿度気圧センサー(BME280)
Ambientを使う準備
Ambientにユーザー登録する
下記リンクにアクセスして、Ambientにユーザー登録します。
Ambientにチャンネルを作成する
Ambientにログインして、チャンネルを作成後に以下を取得します。
- チャンネルID
- ライトキー
- リードキー
RaspberryPiにAmbientをインストールする。
下記のリンクを参考にして、Ambientをインストールします。
https://ambidata.io/refs/python/
$ pip install git+https://github.com/TakehikoShimojima/ambient-python-lib.git
センサーからデータを取得する
センサー(BME280)から温度・湿度・気圧のデータを取得する方法は、下記の記事のbme280_custom.pyを参考に作成しました。
私の場合はdict型で戻り値を返すように少し修正しています。
Ambientへデータを送信する
Ambientへデータを送信します。
import ambient
import bme280_custom
# Ambientのインスタンス作成
am = ambient.Ambient(【チャンネルID】, '【ライトキー】')
# BME280からデータを取得
dct = bme280_custom.readData()
# Ambientへ送信するデータを作成
data = [
{'d1': dct['temperature'] },
{'d2': dct['humidity'] },
{'d3': dct['pressure'] },
]
# Ambientへデータを送信
r = am.send(data)
定期的にセンサーからのデータの取得と、Ambientへの送信を繰り返す
cronを使います。
5分おきに繰り返すために、/etc/crontabに以下を追記します。
*/5 * * * * pi python /home/pi/netatmo_ambient/netatmo.py
将来の機能拡張:二酸化炭素濃度を取得する
二酸化炭素濃度の取得は以下のリンクを参考に作れそうです。
IFTTTと連携して、二酸化炭素濃度が上昇したら自動で換気するようにしたいです。
CO2センサー(CCS811) が欲しいのですが、国内で買うと少し高いです。
Aliexpressから買ってみようかな。
まとめ
スマート温度計の価格が高かったので、自分で作りました。
部屋の「温度・湿度・気圧」の推移については、Webでいつでも確認できるようになりました。
2019年5月にプロトタイプを作っていたため、今回は半日程度の作業でした。
Ambientは初めて使ったのですが、簡単なコードを書くだけで、クラウドでセンサーのデータ推移等を見れるようになるのはすごいです。いろいろ遊べそうです。
寒暖差の推移と、二酸化炭素濃度の推移についても開発していきます。
[2020/07/12追記] 二酸化炭素濃度を取得してみた。
備忘録としてメモします。
二酸化炭素濃度センサは、測定方法が2種類あるっぽい。
- TVOC型:CCS811
- NDIR型:MH-Z19B
CCS811の方が安いので最初はそちらを購入したが、精度が良くなかった。
なので、MH-Z19Bを買いなおしたところ納得できる値が得られた。
どちらのセンサもAmazonで購入できる。
soft_uartのインストール
インストール方法は下記リンク参照。
モジュールをロードすると、/dev/ttySOFT0が作成される。
デフォルトでGPIO17がTXD、GPIO27がRXDのようだ。
soft_uartの自動ロード
起動時にsoft_uartのカーネルモジュールを自動ロードするよう設定する。
下記リンクが分かりやすい。
soft_uartのアクセス許可
piをdialoutグループに追加して、アクセスできるようにする。
$ sudo usermod -a -G dialout pi
MH-Z19Bを使う。
ライブラリがあるのですぐ使える。
/dev/ttyAMA0は使わず、/dev/ttySOFT0を使うので、
mh-z19ライブラリの__init__.pyは少し修正する必要あり。
下記リンクが分かりやすい。
キャリブレーション
外に出して400ppmを大きく超える値が出たら、キャリブレーションをやったほうが良いっぽい。