はじめに
M5 ATOM (Matrix / Lite) がようやく日本で発売されました!🎉
2020年4月10日に注文して14日に到着しました。
いやぁーーー、本当に小さいですね。
M5 ATOM Matrix x 2個 = M5StickC です。
M5 ATOM Lite の方は Matrix よりも厚みが薄いです。
本題
この記事は Nefry BTとCO2センサー(MH-Z19)で職場環境を見える化してみた。の 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 にして無事に書き込みができるようになりました。
最終的な書き込み設定は以下のとおりとなりました。
接続図
裏面にジャンパーピンを挿して使用しましたが、Groveコネクタケーブルを接続しても使用できました。
下記のソースコードを以下のように書き換えてください。
ジャンパーピンを使用する場合(G / 5V / G25 → RX / G21 → TX)
mhz19.begin(25, 21);
Grove コネクタ: G / 5V / G26 → RX / G32 → TX
mhz19.begin(26, 32);
動作概要
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 の順
さっそく動かすと、既に黄色表示・・。
(一生懸命働いているから、ということにしておきます。)
ソースコード
サンプルコードはこちらです。
#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);
}