Raspberry Pi でCO2センサを使う

## 概要
Raspberry Pi でSIM経由で通信する顔認証システムを作成し、認証結果を kintone で管理するシステムを構築します。
今回は、顔認証した時のオフィス環境データを取得するため Raspberry Pi でCO2センサの値を読み込むまでを行います。!
![IMG_2016.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75892/37ff48ab-4d7d-e897-17d3-065308025a43.jpeg)

### 顔認証システム構築シリーズ
Raspberry Pi で顔を認識しファイルに保存する
https://qiita.com/yukataoka/items/7510217f4b6efdefff06

Amazon Rekognition で顔が同じか比較判定し、感情などの情報を取得する
https://qiita.com/yukataoka/items/3fde5d6b22255ff1aed9

Raspberry Pi でCO2センサを使う
https://qiita.com/yukataoka/items/a3b4065e8210b8f372ff

Raspberry Pi で温湿度気圧センサを使う
https://qiita.com/yukataoka/items/8f9046587c978e91f689

## 利用するCO2センサについて
CO2センサは、以下の過去の記事で SENSEAIR の [K30](https://senseair.com/products/flexibility-counts/senseair-k30/) を使ってきましたが、1個購入するにも送料込みで1万円をオーバーします。

4.センサの設定とプログラミング
https://yukataoka.wordpress.com/2015/06/20/raspi04/

今回は安価にAliExpess等で20ドル弱で購入できるCO2センサ MH-Z19 を用います。

1PCS module MH-Z19 infrared co2 sensor for co2 monitor
https://www.aliexpress.com/item/1PCS-module-MH-Z19-infrared-co2-sensor-for-co2-monitor-Free-shipping/32371956420.html

## 配線について
MH-Z19 は UART シリアル通信で測定値を取得します。
Raspberry Pi の配線は、以下の配線図を参考に行います。
![MH-Z19](https://camo.qiitausercontent.com/112ad5fe41c82a16671d2882070384109c8860cc/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f34363534342f30383238333031342d363864322d633364652d313634342d3763386439623762363266642e6a706567)
( https://pypi.org/project/mh-z19/ より引用 )

## 環境の設定
先の作業で、Pyton3 と pip3 の設定までは完了しています。

- UART シリアル通信の設定

sudo raspi-config で UART のシリアル通信を設定します。
手順は以下です。
__"5 Interfacing Option"__ を選択。
__"P6 Serial"__ を選択。
~~__"Yes"__ を選択し、raspi-config 完了後に再起動します。~~
Would you like a login shell to be accessible over serial? で __"No"__ を選択。
Would you like the serial port hardware to be enabled? で __"Yes"__ を選択。
raspi-config 完了後に再起動します。

__<注記1>__
上記で Would you like a login shell to be accessible over serial? で"Yes"を選択した場合や、手動で /boot/config.txt を編集し bluetooth を無効化している場合は注意が必要です。（詳細は後述します。）

- Python3 の設定

すでに pip3 の MH-Z19 用のライブラリィが公開されています。

mh-z19 0.3.8.5
https://pypi.org/project/mh-z19/

pip3で mh-z19 をインストールします。

```
$ sudo pip3 install mh-z19
```

~~_インストール後にそのままライブラリィを何回実行しても null しか返してきません。~~_
~~_配線等や本体を交換しても状況が変わらないため、ライブラリィの中身をチェックすることにしました。~~
__<注記1>__で説明した設定を行った場合、インストール後にそのままライブラリィを何回実行しても null しか返してきません。

```
$ sudo python3 -m mh_z19
null

$ pip3 show mh-z19
Name: mh-z19
Version: 0.3.8.5
Summary: mh-z19 CO2 concentration sensor library for All models of Raspberry Pi
Home-page: https://github.com/UedaTakeyuki/mh-z19
Author: Takeyuki UEDA
Author-email: gde00107@nifty.com
License: MIT
Location: /usr/local/lib/python3.5/dist-packages
Requires: pyserial, requests, getrpimodel, argparse
```

~~ライブラリィでは Raspberry Pi 3 Model B の シリアルデバイスは /dev/ttyS0 を参照するようになっていますが、実際は /dev/ttyAMA0 か /dev/serial0 でしか通信できませんので、以下のように修正しました。~~
__<注記1>__の設定では Raspberry Pi 3 Model B シリアルのデバイスのエリアスが変わってしまうため、以下のようにライブラリィの保管場所を pip3 の show オプションで確認し \__init\__.py の中身を変更して利用します。

``` /usr/local/lib/python3.5/dist-packages/mh_z19/__init__.py
 -*- coding: utf-8 -*-
# original: https://raw.githubusercontent.com/UedaTakeyuki/slider/master/mh_z19.py
#
# c Takeyuki UEDA 2015 -

import serial
import time
import subprocess
import traceback
import getrpimodel
import struct
import platform

# setting
version = "0.3.8"
pimodel = getrpimodel.model()

# Raspberry Pi3 Model B の serial デバイスは、記載時には ttyS0 でなくttyAMA0 に修正
#if pimodel == "3 Model B":
#  partial_serial_dev = 'ttyS0'
#elif pimodel == 'Zero':
#  partial_serial_dev = 'serial0'
#else:
#  partial_serial_dev = 'ttyAMA0'

partial_serial_dev = 'ttyAMA0'

serial_dev = '/dev/%s' % partial_serial_dev
stop_getty = 'sudo systemctl stop serial-getty@%s.service' % partial_serial_dev
start_getty = 'sudo systemctl start serial-getty@%s.service' % partial_serial_dev
（後略）
```

## 結果
~~シリアルデバイスの指定を修正後に~~ライブラリィを実行すると、以下のようにCO2値を取得できるようになりました。

```
$ sudo python3 -m mh_z19
{"co2": 712}
$ sudo python3 -m mh_z19  --all
{"TT": 67, "temperature": 27, "co2": 770, "SS": 0, "UhUl": 3842}
```

--all オプションで CO2 以外のセンサから取得した値を表示します。
TTは華氏温度のようですが、データシートに情報がなく内部温度センサーの値かもしれないようです。

詳細は以下のサイトを参照ください。
https://revspace.nl/MHZ19
https://www.winsen-sensor.com/d/files/PDF/Infrared%20Gas%20Sensor/NDIR%20CO2%20SENSOR/MH-Z19%20CO2%20Ver1.0.pdf

## 参考サイト
UedaTakeyuki/mh-z19
https://github.com/UedaTakeyuki/mh-z19
https://pypi.org/project/mh-z19/

窓を開けて新鮮な空気をいれよう！Raspberry Pi でCO2 濃度を測ろう
https://qiita.com/UedaTakeyuki/items/c5226960a7328155635f

1PCS module MH-Z19 infrared co2 sensor for co2 monitor
https://www.aliexpress.com/item/1PCS-module-MH-Z19-infrared-co2-sensor-for-co2-monitor-Free-shipping/32371956420.html

PC​/RaspberryPi​/Pi3のシリアル通信
http://yueno.net/xoops/modules/xpwiki/?PC%2FRaspberryPi%2FPi3%E3%81%AE%E3%82%B7%E3%83%AA%E3%82%A2%E3%83%AB%E9%80%9A%E4%BF%A1