raspberryPi2とCO2センサー(MH-Z19B)とambientを使ってco2を計測してグラフにする

# 概要

以下のものを使ってCO2濃度の計測とwebでの可視化をやってみる。

- raspberriPi2 modelB v1.1
- [MH-Z19B](https://www.amazon.co.jp/gp/product/B08HD8XTZP)  
CO2センサー。amazonで3500円くらい。
- [Ambient](https://ambidata.io/)  
無料で使えるセンサーデータを可視化してくれるサービス

# 前提
上記以外の以下のものは揃っていることが前提です。

- RaspberryPiとMH-Z19Bを接続するジャンパワイヤー
- RaspberryPiのセットアップ  
  - python3が入っていて、ネットワークに繋がっている状態
  - シリアル通信が有効になっている  
  raspi-config コマンドとかで有効にしておいてください。
- MH-Z19 のデータシートは[公式HPの製品ページ](https://www.winsen-sensor.com/sensors/co2-sensor/mh-z19b.html) から取得している。

# きっかけ

飲食店にco2センサーが導入されているのを見て、
在宅勤務が主流になってから気になっていた部屋のCO2濃度を
調べてみたいモチベーションが再燃した。
以前は、センサーが高額で諦めてたんだけど、3500円くらいで
amazonで売っているのを見つけたのも大きい。

# 準備
ambientのアカウントは作っておこう。

# raspberryPiとセンサーをつなげる

データシートの「6. Pins」の項(画像上)と、RaspberryPi2の
Pinアサイン(画像下)を見比べてジャンパワイヤをつなぐ。

![スクリーンショット 2020-11-23 11.18.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/1174b5b9-fc73-069d-1090-f10bac532ae9.png)
![スクリーンショット 2020-11-23 8.54.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/cefed398-cb40-2756-80b1-946eb774b83a.png)

- RxとTxの接続  
画像下からRaspberryPi2側のGPIOピンの8がTxで10がRxな事がわかるので、
MH-Z19BのRxをRaspberryPi2のTxに、
MH-Z19BのTxをRaspberryPi2のRxに、接続する。

- GRANDの接続  
画像下からRaspberryPi2側のGPIOピンの6,9,14,20,25,30,34,39が
0VでGRANDであることが分かるので、
MH-Z19BのGNDとRaspberryPi2側のいずれかのGRANDに接続する。
(今回は６にします)

- Vinの接続  
Vinは入力電圧の事。
画像下からRaspberryPi2側のGPIOピンの2,4 が5Vの出力であることが分かるので、
MH-Z19BのVinとRaspberryPi2側のいずれかの5Vの出力pinに接続します。
(今回は4にします。)

## 接続した画像

![PXL_20201123_001656415.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/3021c42c-ba8a-2a97-f799-6de09a69d1bc.jpeg)
![PXL_20201123_001726660.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/fac2be5b-9a64-3ff5-5e68-531c8c44f5ff.jpeg)


# センサーで値を取得する

## pythonのモジュールのインストール

[pypiのmh-z19のページ](https://pypi.org/project/mh-z19/
) をみて、pipでインストールする。

例

```python
pip install mh-z19
```

## 値を取得する

以下の感じで実行してみる。
今の値が1410ppmであることが分かる。

```bash
pi@raspberrypi:~/co2_check $ sudo python3 -m mh_z19
{"co2": 1410}
pi@raspberrypi:~/co2_check $ 
```

辞書型なのでキーを指定すると値が取得できる。
例

```python
pi@raspberrypi:~/co2_check $ sudo python3
Python 3.7.3 (default, Jul 25 2020, 13:03:44) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import mh_z19
>>> mh_z19.read()
{'co2': 1170}
>>> type(mh_z19.read())
<class 'dict'>
>>> mh_z19.read()["co2"]
1072
>>> 
```

# ambientにデータを送って描画してもらう

## ambientのモジュールをインストールする

[ambientの公式のドキュメント](https://ambidata.io/samples/dataprocess/pythonpandas/) に沿ってインストールする  
例

```bash
pip install git+https://github.com/TakehikoShimojima/ambient-python-lib.git
```

## ambientのwebページからチャンネルを作る

[チャンネル一覧](https://ambidata.io/ch/channels.html) のページに以下のようなボタンが有るはず。
![スクリーンショット 2020-11-23 11.48.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/e10b396e-3bea-0c06-585b-218cc5938183.png)

作ったら以下の値を確認する。
- チャンネルID
- ライトキー

## ambientに値を送る

以下のようなコードを書いて見る。

```python

import ambient

ambi = ambient.Ambient(チャンネルID, "ライトキー") 
ambi.send({"d1": 値, "d2": 値})

---
例
import mh_z19
import ambient


amb = ambient.Ambient(12345, "write000200key") 
amb.send({"d1": mh_z19.read()["co2"]})
```

これで該当のチャンネルのところにグラフが書かれているはず。

# おわり

これでco2センサーを使って値を取得して、取得した値をambientに送って描画するってことができたはず。
このあとは継続的に値を取得して、ambientに送信していけば以下のような感じでグラフが描かれます。
![スクリーンショット 2020-11-23 8.49.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86853/8c06d349-cce4-4431-0c24-068b6a6ca168.png)

5~6畳くらいの締め切った部屋だと2時間位で2500ppmを超えるみたいなので、
昔学校で言われた「1時間に15minの換気をしましょう」というのはよく言ったものだなーって思います。
ちなみに外気が400ppmくらいらしいっす。