M5 ATOM Matrix と MH-Z19 で CO2 濃度を見える化してみた。

# はじめに
M5 ATOM (Matrix / Lite) がようやく日本で発売されました！🎉
2020年4月10日に注文して14日に到着しました。
いやぁーーー、本当に小さいですね。
M5 ATOM Matrix x 2個 ＝ M5StickC です。
M5 ATOM Lite の方は Matrix よりも厚みが薄いです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/f31112ba-a75b-fb60-079e-dc8bdec54515.jpeg" width="50%">

# 本題
この記事は <A HREF="https://qiita.com/kitazaki/items/1b3859a1d29e60af6489">Nefry BTとCO2センサー(MH-Z19)で職場環境を見える化してみた。</A>の M5 ATOM Matrix 実装版です。

当時は働き方改革 ＝ 少しでも職場環境を良くしたいというモチベーションでしたが、最近は在宅ワークが主流になり、ほとんど一日中部屋の中で過ごすようになったので、少しでも仕事部屋を良くしたいというモチベーションに変わりました。

# M5 ATOM Matrix / Lite 開封の儀
まずは動作確認から。

### 環境
- MacBook Pro Mojave
- MacBookAir High Sierra

### UIFlow
先人の情報を参考に UIFlow (ウェブ版) での動作確認は手順どおりで問題ありませんでした。
https://qiita.com/youtoy/items/17739b7f4197a8d3fa4d

最初につまずいたのは UIFlow (デスクトップ版) で接続に失敗して使用できませんでした。
これについても先人の情報を参考に、起動時にモードを切り替える方法を試すことで無事に動作確認できました。
https://qiita.com/wakasamasao/items/eea919cc525abbf90eab
青: UIFlow desktop IDE Program
→USB接続してIDEから書き込みができるモードにしてから UIFlow (デスクトップ版) から接続する。

# M5 ATOM Matrix で CO2 濃度を見える化する
以前のソースコードを参考に M5 ATOM Matrix へ移植することもできますが、今回は MH-Z19 を使用するためのライブラリを利用させていただきました。

### Arduino IDE
Arduino IDE で M5 ATOM を使用するため、以下 2 つのライブラリをインストールします。
M5Atom
https://github.com/m5stack/M5Atom
FastLED
https://github.com/FastLED/FastLED

MH-Z19 を使用するため、以下のライブラリをインストールします。
mhz19_uart
https://github.com/nara256/mhz19_uart

最初、Arduino IDE からの書き込みに失敗するので調べたら、これも先人の情報に辿り着き、Upload Speed を 115200 にして無事に書き込みができるようになりました。
最終的な書き込み設定は以下のとおりとなりました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/ece0ab5f-9f45-ba98-db76-4f7377b69071.png" width="50%">

### 接続図
裏面にジャンパーピンを挿して使用しましたが、Groveコネクタケーブルを接続しても使用できました。
下記のソースコードを以下のように書き換えてください。

ジャンパーピンを使用する場合（G / 5V / G25 → RX / G21 → TX）
mhz19.begin(25, 21);

Grove コネクタ: G / 5V / G26 → RX / G32 → TX
mhz19.begin(26, 32);

<img width="75%" alt="スクリーンショット 2020-04-17 0.31.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/ec3c5c04-78c9-e6ee-00c2-a9a7f21aabf6.png">



### 動作概要
LED Matrix の表示は以下のようにしました。
CO2濃度 (ppm) と温度 (temp) ・・・CO2濃度補正のための参考温度をシリアルログに出力します。

青: 350 〜 450ppm　　　過剰な換気 (外気: 330〜400ppm)
緑: 450 〜 700ppm　　　理想的な換気レベル
黄: 700 〜 1,000ppm　　換気が不十分 (室内では1,000ppm以下に抑えることとされている)
赤: 1,000 〜　　　　　　悪い室内空気環境 (学校環境では1,500ppm以下が望ましいとされている)

ソースコードの LED 表示の色指定順が RGB ではなく、GRB でしたので、ご注意を。。
M5.dis.drawpix(i, 0xffffff);  // #GGRRBB の順

さっそく動かすと、既に黄色表示・・。
(一生懸命働いているから、ということにしておきます。)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/6f6d2bbe-2245-2f80-97ef-df210b93d04c.jpeg" width=50%">

### ソースコード
サンプルコードは<A HREF="https://github.com/kitazaki/M5ATOM_Matrix_MH-Z19">こちら</A>です。

```c:M5ATOM_Matrix_MH-Z19.ino
#include <M5Atom.h>
#include <MHZ19_uart.h>

bool IMU6886Flag = false;

MHZ19_uart mhz19;

void setup() {
  M5.begin(true, false, true);
  delay(50);
  for (int i = 0; i < 25; i++) {
    M5.dis.drawpix(i, 0xffffff);  // #GGRRBB の順
  }
  
  Serial.begin(115200);  // for debug log
  mhz19.begin(25, 21);  // Grove RX:26, TX:32 | GPIO RX:25, TX:21
  mhz19.setAutoCalibration(false);
  delay(3000);
}

void loop() {
  int co2 = mhz19.getPPM();
  int temp = mhz19.getTemperature();
 
  Serial.print(co2);
  Serial.print(" ppm, ");
  Serial.print(temp);
  Serial.println(" temp");

  if (co2 < 450) {
      for (int i = 0; i < 25; i++) {
        M5.dis.drawpix(i, 0x0000ff);  // blue
      }
  }
  else if (co2 < 700) {
      for (int i = 0; i < 25; i++) {
        M5.dis.drawpix(i, 0xff0000);  // green
      }
  }
  else if (co2 < 1000) {
      for (int i = 0; i < 25; i++) {
        M5.dis.drawpix(i, 0xffff00);  // yellow
      }
  }
  else {
    for (int i = 0; i < 25; i++) {
      M5.dis.drawpix(i, 0x00ff00);  // red
    }
  }
  delay(5000);
}
```