ラズパイで温湿度・気圧を測定してPlotly Dashで可視化

![sensor_monitor_02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283041/e134f674-18dd-b3cf-ec25-c1e2eb05eb3a.gif)

# はじめに
前回、[ラズパイでCO2濃度を測定してPlotly Dashで可視化](https://qiita.com/take314/items/a5ab8ef6e8773699cb25)しましたが、今回はその続きになります。前回はCO2濃度しか測定できませんでしたが、追加でBME280という温湿度・気圧センサーを購入し、[こちら](https://dev.classmethod.jp/articles/raspberrypi-and-bme280/)を参考にそれぞれ測定・可視化できるようにしました。

# やりたいこと
- 温湿度・気圧も可視化できるようにする

# 買ったもの
- [BME280使用　温湿度・気圧センサモジュールキット](https://akizukidenshi.com/catalog/g/gK-09421/)
    - 1000円台だったのと、このセンサーも情報が多そうだったので購入。
![IMG_0573.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283041/3f282dd7-228b-783b-cb54-c7c0404ad7f9.jpeg)


# やったこと

## 電子工作
今回使うセンサーはラズパイと接続するためのピンをセンサーの基盤にはんだ付けする必要がありました。相当久々だったため、最初ははんだをつけすぎてしまい、あやうくブリッジさせるところでしたが、落ち着いてはんだ吸取線をホームセンターまで買いに行き、付きすぎたはんだを溶かしてやり直したところなんとかうまくいきました（一番左の端子周辺が少し焦げた感じになりましたが…）。
![IMG_0576.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283041/68549357-5e08-2eb3-51ed-ac2791b3c6b8.jpeg)

はんだ付けできたらジャンパケーブルでラズパイに接続します。最終的にこうなりました（左が今回接続したBME280センサー。真ん中がラズパイ本体、右がCO2センサー）。
![IMG_0579.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283041/0e38d568-60e9-6706-89c7-c6355a7c808e.jpeg)

## セットアップ
OSインストールなどのラズパイ自体のセットアップは前回で済んでいるため、今回はBME280センサーをラズパイで使えるようにするためのセットアップのみとなります。

### I2C通信の設定
[こちら](https://dev.classmethod.jp/articles/raspberrypi-and-bme280/#toc-5)を参考に、I2C通信によってセンサー値を取得できるようにするための設定を行います。前回同様、ラズパイにSSH接続したあと`sudo raspi-config`コマンドから設定します。

## プログラミング
前回作ったものを拡張していきます。引き続き作業ディレクトリは`/home/pi/raspberrypi_sensor`とします。

### 温湿度・気圧をcsvファイルに出力

BME280センサーから測定値を読み取るため、今回は[こちら](https://github.com/SWITCHSCIENCE/samplecodes/blob/master/BME280/Python27/bme280_sample.py)の`bme280_sample.py`というMITライセンスのスクリプトを利用させていただきました（python2で書かれているため、python3環境で利用する場合はprint文を修正する必要があります）。

測定値のcsvデータ化については、前回時点でセンサーから測定値を取得するスクリプトと測定結果をcsvとして保存するスクリプトを作っているので、今回は`bme280_sample.py`を使って測定値を読み取る処理を追加するだけです（リファクタリングも少しやりました）。

```sampling.sh
#!/bin/sh

# センサーから測定値を取得するスクリプト
result_mh_z19=$(sudo python -m mh_z19 | jq .co2)  # MH_Z19センサーでCO2濃度を測定
result_bme280=$(sudo python bme280_sample.py)  # BME280センサーで温湿度・気圧を測定
echo "$result_mh_z19 $result_bme280"
```

```write_csv.sh
#!/bin/sh

cronでwrite_csvを叩くことで自動で測定データが溜まっていくので、それをダッシュボードに表示していきます。

# 測定結果をcsvファイルに保存するスクリプト

COLUMNS="timestamp co2_ppm temperature_celsius pressure_hpa humidity_percent"
mkdir -p data

current_date=$(date +"%Y-%m-%d")
if [ ! -f data/"$current_date".csv ] ; then
  touch data/"$current_date".csv
  echo "$COLUMNS" >> data/"$current_date".csv
fi

timestamp=$(date +%s)
results=$(bash sampling.sh)
echo "$timestamp $results" >> data/"$current_date".csv
```

csvの形式はこんな感じになりました。
左からタイムスタンプ、CO2濃度[ppm]、温度[℃]、気圧[hPa]、湿度[%]です。
```sample.csv
timestamp co2_ppm temperature_celsius pressure_hpa humidity_percent
1670252401 408 18.88 1008.87 52.10
1670252461 408 18.85 1008.85 52.11
1670252522 408 18.81 1008.85 52.23
...
```

### Plotly Dashを使って測定値を可視化

ダッシュボードの実装に関しては、現在の測定値の表示方法やグラフのレイアウト変更、ドロップダウンの削除・移動などがあったものの、基本的な部分は前回から大きく変わっていないため、コードの記載は省略します。コード全体は引き続き[こちら](https://github.com/take314/raspberrypi_sensor/tree/qiita2)に公開していますので、よければご参照ください。


# できたもの
![sensor_monitor_02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283041/e134f674-18dd-b3cf-ec25-c1e2eb05eb3a.gif)
ページ上部に最新の測定値をそれぞれ色分けして大きく表示しています。前回は10秒に1回更新していましたが、実用上そこまで高頻度でなくてもいい気がするのと、センサーが増えたことによるラズパイへの負荷を考えて、1分間に1回の更新にしました（csvがcronによって1分間に1回更新されるので、その最新値を表示するようにしました）。

グラフ部分については、測定項目が4つになったのでそれぞれの測定値をどう表現するか少し悩みましたが、思い切って一つのグラフに詰め込みました。ぱっと見情報量が多いのですが、項目によって色分けしたのと、凡例をクリックすること項目ごとにでプロット表示をON/OFFできるPlotlyの機能があるので、慣れると意外といいかも？と感じています。温度と湿度の関係など、項目同士の関連も読み取りやすい気がします。


## 測定したデータを眺めてみる
せっかくなのでどんな感じのデータが取れているかを見てみます。

![スクリーンショット 2022-12-07 20.12.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283041/e5b5a54e-2b46-1838-1836-325091390268.png)
こちらは窓や扉を締め切った部屋（6畳）で運動をしたときのグラフです。20:30から21:00にかけてエアロバイクを漕いだのですが、この時間帯にCO2濃度と湿度がはっきりと上昇していることがわかります。実際、このとき窓ガラスに結露が発生し始めているのを確認できました。一方で温度が若干下がっているのですが、これは運動開始直前にそれまでつけていたエアコンの暖房を切ったためと思われます。

運動終了後、21:00の時点で部屋に2つある窓を両方半開きにしたところ、ものの数分で温度が5度程度、湿度が15%程度下がり、窓ガラスの結露も一気に解消しました。またCO2濃度も2000ppm程度だったのが一気に400ppm（センサーの測定下限値）まで下がっています。気圧に関しては明確な変動がないことから、窓の開け締めや室内での過ごし方に関わらず、基本的に屋外と同じ値を常時保っていることが読み取れます（気密性がめちゃくちゃ高い家とかだとまた違ったりするのでしょうか？）。


# おわりに
上でも書いたように冬場の部屋の結露がひどいのですが、温度と湿度が測定できるようになったので露点を計算して表示したら結露の目安にできるかも、と思いました。同様に不快指数とかも追加できそう。
あと実は照度センサーも追加で買っていたものの、ラズパイ側のピンが足りなくなったため接続は断念しました…。ただ現状のシステムでも満足できているので一旦よしとします。


# 参考
https://dev.classmethod.jp/articles/raspberrypi-and-bme280/