【コロナ対策】ラズパイとCO2センサーで二酸化炭素濃度測定ポータブルIoTシステムを作ってみた

#本記事の内容
- ラズパイで測定した二酸化炭素濃度データをGoogleスプレッドシートに記録し、任意のデバイスからデータを閲覧できるようにする。

5年前に買うだけで満足してしまい、一度も利用していなかったRaspberry pi2を引っ張り出してきたのは、こんな感じのIoTシステムを作ってみたかったから。
![構成図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/da88c69d-d264-bab1-6fa0-ca5c3e765c4f.png)

![IMG20210923141704_BURST001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/a2267b90-017b-fab0-3c34-0cfb890838a0.jpeg)


CO2センサーをラズパイに搭載し、スマホ等からのデザリングでインターネットに接続する。(スマホのデザリングでなくとも有線LAN接続やなんらかのWi-Fiでも良い)
測定したデータをネット経由でGoogleスプレッドシートにアップロードするので、ネットに繋がっているスマホ等のブラウザからデータを確認できる。
さらにラズパイの電源をモバイルバッテリー化することで、どこへでも持ち運んでCO2濃度の測定とデータの確認ができる。

感染症対策を謳っていても、、あまり換気されてないところある気がしていまして、、
これを活用し、今いる場所の"密"具合いを間接的に測って知り、少しでもコロナの自衛に繋がればいいなあと思っています。

#実施環境
- Windows 10
- TeraTarm Version 4.9.4
- Raspberry Pi 2 Model B
- PLANEX 無線LAN子機 GW-USNANO2A ※Raspberry Pi 2はWi-Fi通信モジュールがないため、無線LAN子機をUSBに接続しWi-Fi通信を行う。
- MH-Z19B ※二酸化炭素濃度測定用センサー
- GPIOピンケーブル メス-メス ※MH-Z19BとGPIOピンを接続するのに使用
- Androidスマホ (OPPO A73)
- モバイルバッテリー (Anker PowerCore II 10000)

#手順の流れ 
1. ラズパイでのGoogleスプレッドシート連携の準備
2. Pythonプログラムの作成とラズパイへの転送
3. Pythonプログラムの自動起動設定
4. プログラムの動作確認

## 1. ラズパイでのGoogleスプレッドシート連携の準備

Googleスプレッドシートとの連携に必要な物の準備を行う。

## 1.1 Googleスプレッドシート連携用のライブラリーのインストール

gspreadをインストールする。

	sudo pip install gspread

インストールできたことを確認する。

	pi@raspberrypi:~ $ sudo python -m pip list | grep gspread
	gspread                  4.0.1
	pi@raspberrypi:~ $

インストールを確認できた。

## 1.2 Python用のGoogle API Clientライブラリーのインストール

google-api-python-clientをインストールする。

	sudo pip install google-api-python-client

インストールできたことを確認する。

	pi@raspberrypi:~ $ sudo python -m pip list | grep google-api-python-client
	google-api-python-client 2.21.0
	pi@raspberrypi:~ $

インストールを確認できた。

## 1.3 Google API用認証ファイルをラズパイに転送

TeratarmにてラズパイにSSH接続し、`ファイル > SSH SCP`とメニューを辿る。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/c49072ce-1aba-33a3-558a-2570dd8a97aa.png)

Fromにアップロードする対象のファイルを指定し、Toにアップロード後格納するディレクトリを指定する。ここでは、/home/piとする。"Send"をクリックする。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/7fcb823d-cd15-e6a9-c56d-d8acdcb6d4d2.png)

ラズパイに転送できたことを確認する。

	pi@raspberrypi:~ $ ls -l /home/pi/*.json
	-rw-r--r-- 1 pi pi 2358 Sep 15 06:50 /home/pi/XXXXXXXXXXXXXXXXXX.json
	pi@raspberrypi:~ $

転送したことを確認できた。

## 2. Pythonプログラムの作成とラズパイへの転送

開発ツールは何でも良いです。私はVScodeを利用しています。
以下が私が動かしたサンプルプログラムを載せます。

```php:co2sensor-google.py
# Googleスプレッドシート用のライブラリー
import gspread  as gs

# Google認証用のライブラリー
from google.oauth2 import service_account

# 二酸化炭素濃度測定用のライブラリー
import mh_z19 

from datetime import datetime as dt

# Google認証用のキー
GOOGLE_KEY_NAME = '/home/pi/XXXXXXXXXXXXXXXXXXXXXXXXXXXXX.json' 

# 操作するGoogleスプレッドSheetのID
GOOGLE_SPREAD_SHEET_ID = 'YYYYYYYYYYYYYYYYYYYYYYYYYYY' 

try:
    if __name__ == '__main__':
        scope = ['https://www.googleapis.com/auth/spreadsheets'] #フルアクセス権限
        credentials = service_account.Credentials.from_service_account_file(filename=GOOGLE_KEY_NAME, scopes=scope)
    
        # Googleスプレッドにおける
        gc = gs.authorize(credentials) 

        # dataシートをオープン
        workSheet = gc.open_by_key(GOOGLE_SPREAD_SHEET_ID).worksheet('data')

        # dataシートのデータを取得する
        records = workSheet.get_all_values() 

        # 現在時刻を取得
        tdatetime = dt.now()
        tstr = tdatetime.strftime('%Y-%m-%d %H:%M:%S')

        # 二酸化炭素濃度測定
        out = mh_z19.read()

        # 二酸化炭素濃度測定時刻の書き込み
        workSheet.update_cell(len(records) + 1,1,tstr)

        # 二酸化炭素濃度の書き込み
        workSheet.update_cell(len(records) + 1,2,out['co2'])

except KeyboardInterrupt:
    pass

```

尚、Googleスプレッドシートと連携するための設定や認証キーの作成は、以前の記事
[ラズパイ連携に向けたGoogleSheetsAPIにおけるサービスアカウントの作成](
https://qiita.com/kanamekun/items/abddb5c65d7a63d9935a)でまとめています。

「1.3 Google API用認証ファイルをラズパイに転送」の手順と同様に「co2sensor-google.py」を/home/piにアップロードする。


## 3. Pythonプログラムの自動起動設定

自動起動の設定を行うためにcrontabに設定を行う。

その前にcrontabのエディターの設定を変更する。
viライクなエディタが好きなので以下のコマンドで"2"を入力しvimに変更する。

sudo select-editor

	pi@raspberrypi:~ $ sudo select-editor
	
	Select an editor.  To change later, run 'select-editor'.
	  1. /bin/nano        <---- easiest
	  2. /usr/bin/vim.tiny
	  3. /bin/ed
	
	Choose 1-3 [1]: 2
	pi@raspberrypi:~ $

次にcrontabで設定を行う。

	sudo crontab -e

1分ごとに起動する設定にしたかったので、以下の設定を末尾に加える。

	*/1 * * * * sudo python /home/pi/co2sensor-google.py > /home/pi/co2_error.log 2>&1

※エラー時の解析をできるようにするため、念のためログも出力するように設定しておいた。


crontabが設定できたことを確認する。

	pi@raspberrypi:~ $ sudo crontab -l
	～途中省略～
	# m h  dom mon dow   command
	*/1 * * * * sudo python /home/pi/co2sensor-google.py > /home/pi/co2_error.log 2>&1
	pi@raspberrypi:~ $

ちゃんと設定できていた。

## 4. プログラムの動作確認

Pythonプログラムとは別に、あらかじめGoogleスプレッドシートにグラフを設定しておいたので、データが書き込まれると自動でグラフに反映されるようにできた。これで都度手を加えずに自動でグラフが作成される。
ラズベリーパイを再起動し、スマホのデザリングに接続し、しばらくの間試運転してみた。（試運転は、モバイルバッテリーではなく、通常通りコンセントから電源を取った。）

試運転の結果のグラフはこちら。
![E_aS1laUYAQIcm-.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/4209571a-f349-92bf-f6c0-e9ba1e0ebbfa.png)
ある程度上手く取れてそう。数値は若干低い気もするが目的の用途に使えそうな感触を得た。

ラズパイが測定したデータを書き込むシートはこちら。
![結果3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017667/5f27a860-1394-6364-d4fc-733865c25292.png)
※グラフの時のデータを残しておけば良かったのですが、残し忘れたので、こちらは全然違うときに測定したデータのキャプチャーです。

こちらのデータを別の「graph」シートのグラフが参照しているので、「data」シートにデータが追加されると自動でグラフに値が反映されます。

CO2センサーを活用したシステム化がうまくいっている気がする。
今週末は、実際にモバイルバッテリーで稼働させてみよう！！！

手順は以上。

# 参考文献
本記事の作成に当たり、以下の情報を参考にさせて頂きました。
- [ラズパイで気圧データをGoogleスプレッドシートに上げる方法](http://workpiles.com/2017/04/raspi-spreadsheet-api/)
- [ラズパイからPyhtonでGoogleスプレッドシートやドライブにアクセスする方法](https://www.souichi.club/raspberrypi/google-oauth2/)