Nefry BTとCO2センサー(MH-Z19)で職場環境を見える化してみた。

最近、巷では働き方改革が声高に叫ばれているが、

* とにかく残業をしないように！とオフィスから追い出される。
* 深夜残業は禁止！早朝出勤は黙認。
* 号令だけで現場に丸投げ。
* ありがた迷惑なプレミアムフライデー。

と、楽しくない働き方改革が行われており、少しでも職場環境だけは良くしたいと思い立ち上がった。

温度・湿度計や空調の操作パネルは設置されていることが多いが、密室での打ち合わせや大勢で会議を続けていると集中力が落ちる、あくびが出る、眠くなることがある。
また、会議室の入れ替えで入室直後に「うっ！空気が悪い！」と感じることがあり、定量的に見える化し精神的に納得できるようにしたい。

インターネットで調べてみると同じような活動をしている事例が見つかった。
* チームラボオフィスの空気環境(CO2)を測定して改善している話
http://ch.nicovideo.jp/tks/blomaga/ar932992

建築物環境衛生管理基準(厚生労働省)にはCO2濃度を `1,000ppm` 以下で管理することと規定されている。
http://www.mhlw.go.jp/seisakunitsuite/bunya/kenkou_iryou/kenkou/seikatsu-eisei/gijutukensyuukai/dl/h23_2.pdf

(CO2濃度のおおまかな目安)
`350 〜 450ppm`　　　過剰な換気 (外気: 330〜400ppm)
`450 〜 700ppm`　　　理想的な換気レベル
`700 〜 1,000ppm`　　換気が不十分 (室内では1,000ppm以下に抑えることとされている)
`1,000 〜 1,500ppm`　悪い室内空気環境 (学校環境では1,500ppm以下が望ましいとされている)
`1,500 〜 5,000ppm`　これ以上の環境で労働をしてはいけない (労働安全基準法では5,000ppmが限度とされている)

(人体への影響)
`1,000ppm`　　　思考力に影響し始める
`2,000ppm`　　　眠気を感じる人が出てくる
`3,000ppm`　　　肩こりや頭痛を感じる人が出てくる
`3,000ppm以上`　集中力や意思決定に支障をきたす

ESP32とCO2センサー(MH-Z14A)を使用して実装している事例が見つかった。
* MH-Z14使ってCO2濃度はかった(UART, ESP32)
http://takashiski.hatenablog.com/entry/2017/06/04/131737

今回はNefry BTへCO2センサー(MH-Z19)を接続してCO2濃度を測定してみた。

(Nefry BTは千石電商で入手)
![NefryBT.png](https://qiita-image-store.s3.amazonaws.com/0/72479/238aaaf8-c724-3a0b-0dfe-32f69859cd2a.png)

(MH-Z19はAliExpressで$21くらい)
![18839045_1337925692943060_5485914226394506305_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/72479/4245cd07-80b7-cf9b-f90a-4d02e0822912.jpeg)

* Nefry BTのマニュアル
https://drive.google.com/file/d/0B_mvDQF8yaQRLVprUHl4WTFLWVE/view
https://dotstud.io/docs/nefrybt/

* MH-Z19のマニュアル
http://www.winsen-sensor.com/d/files/PDF/Infrared%20Gas%20Sensor/NDIR%20CO2%20SENSOR/MH-Z19%20CO2%20Ver1.0.pdf

接続方法は Nefry BT と MH-Z19 の 5V, GND, TX ,RX をジャンパー線で接続する。
![スクリーンショット 2017-09-19 15.19.01.png](https://qiita-image-store.s3.amazonaws.com/0/72479/4c9e358b-cc94-3479-1950-5450ee20aae0.png)

CO2濃度を 5 秒毎に取得して Nefry Console へ値を出力し、値が `1,000ppm` 以下であればLEDを青色に表示し、`1,000ppm`を超えていたらLEDを赤色に表示する仕様にした。

ソースコードはこちら。

```cpp
#include <Nefry.h>
HardwareSerial Serial1(0);

byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
unsigned char res[9];
uint8_t idx = 0;
bool flag = false;
unsigned long co2 = 0;

void setup() {
  Nefry.setLed(0,0,0);
  Serial.begin(9600);
  Serial1.begin(9600);
  delay(10*1000);
}

void loop() {
  Serial1.write(cmd,9);
  while(Serial1.available()>0)
  {
    Serial1.readBytes(res, 9);
    flag=true;
  }
  if(flag)
  {
    flag=false;
    co2 = 0;
    unsigned int resHigh = (unsigned int) res[2];
    unsigned int resLow = (unsigned int) res[3];
    co2 = (256*resHigh)+resLow;
  }
  Nefry.print("co2: ");
  Nefry.print(co2);
  Nefry.println(" ppm");
  if(co2 > 1000){
     Nefry.setLed(200,0,0,50);
  }else{
     Nefry.setLed(0,0,200,50);
  } 
  delay(5*1000);
}
```

`※ プログラムを書き込む際の注意点として Nefry BT と MH-Z19 の TX,RX に接続したままだとプログラムの書き込みに失敗するので、プログラムを書き込みする時は抜いておき、書き込みが完了した後に接続する必要がある。`

Nefry BT と MH-Z19 の 5V, GND, TX ,RX を接続し、正常にCO2濃度値を取得できると Nefry Console へ値が出力されます。息を吹きかけてCO2濃度が `1,000ppm` を超えるとLEDが青色から赤色に変わります。(`1,000ppm`以下になると青色に戻ります。)

![21740569_1431151153620513_3703880724746221467_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/72479/45f7617c-8c9f-6682-a447-c53e67231d9a.jpeg)

職場の"CO2濃度"の見える化で、みなさんの周りでも働く環境を良くしよう！というモチベーションが少しでも向上してくれれば幸いです。

(測定する際の注意点として参考まで)
* 3分間 のプリヒートが必要。(電源ONから正しい測定値が得られるまで 3分間必要と理解。)
* CO2濃度値が `400ppm` (※ 外気のCO2濃度とほぼ同値) の環境でゼロキャリブレーションが必要。
※ 気象庁(二酸化炭素濃度の経年変化)
http://ds.data.jma.go.jp/ghg/kanshi/ghgp/co2_trend.html

※2017/11/4更新
2017/10/19 IoT縛りの勉強会! IoTLT vol.32 @ サポーターズにて発表。
https://www.slideshare.net/kitazaki/nefry-btco2mhz19