先日はじめてギターアンプを自作しましたが、今回はM5StickC Plusを使った電子工作です。在宅勤務が今後も続きそうなので、自宅の快適さを測りたいと思い、集中力に影響があると言われているCO2の濃度を測ることにしました。
デバイスと部品
MH-Z19Bという下位バージョンのものもありますが、フェイク品が出回っているそうで、秋月で確実に買えるMH-Z19Cにしました。その他にPC、PCとM5StickC Plusを繋ぐためのUSB Type−Cケーブルが必要です。
環境構築
Arduino IDEをインストールしてセットアップ
Arduino IDEのインストールやセットアップは、Interfaceの以下の記事を参考にしました。実施するのはステップ1、2だけです。M5StickC Plusの開発環境(Arduino IDE)構築の手順 – Interface
記事ではWindows10で、僕はMacで実施しましたが問題ありませんでした。Macの場合は、zipファイルがダウンロードされ、解凍するとappファイルができます。また、記事中にある「ESP32パッケージのJSONファイルURL」は以下になります。コピペ用にどうぞ。https://dl.espressif.com/dl/package_esp32_index.json
バージョンは以下の通り。
Arduino IDE:1.8.15
ESP32パッケージ:1.0.6
PlatformIOという開発環境もあるようですが、初心者なのでまずは基本的な環境であるArduino IDEを使ってみます。
サンプルプログラムの実行
試しにサンプルプログラムを動かしてみます。メニューバーの「ファイル → スケッチ例 → M5StickCPlus → Basics → IMU」を選ぶと、サンプルプログラムのソースコードが表示されます。画面左上の「マイコンボードに書き込む」ボタンを押して、プログラムをマイコンに書き込みます。IMUというのは加速度センサーのサンプルです。
初めて書き込みを実行したときは、「シリアルポートが選択されていません。」というエラーが表示されました。「cu.usbserial-…」というポートを選んで再度実行したところ、正常に書き込め、プログラム実行できました。
CO2濃度の計測
M5StickC PlusとMH-Z19Cを接続します。以下のピン同士をジャンプワイヤー オス-メスで繋げます。
M5StickC Plusのピン MH-Z19Cのピン GND GND 5V→ VIN G26 Rx G36(G36/G25と記載されているピン) Tx
プログラムにはmhz19_uart というライブラリを使わせてもらいます。zipファイルをダウンロードし、メニューバーの「スケッチ → ライブラリのインクルード → .ZIP形式のライブラリをインストール…」からインストールします。
このライブラリには実行サンプルコードも付属しているので、使わせてもらいましょう。メニューバーの「ファイル → スケッチ例 → MHZ19_uart → MHZ19_getco2」を選ぶと、サンプルコードが表示されます。ただし、まだマイコンに書き込みません。下記のコメント記載部分を追記、変更してからマイコンに書き込みます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 追記:M5StickC Plusで必要なヘッダをインクルードする。
#include <M5StickCPlus.h>
#include <MHZ19_uart.h>
// 変更:接続するピンの番号を変更する。
const int rx_pin = 36;
const int tx_pin = 26;
MHZ19_uart mhz19;
void setup()
{
// 追記:M5StickC Plusの初期化と、G36ピンを使うためにG25ピンをフローティングにする。
M5.begin();
pinMode(36, INPUT);
gpio_pulldown_dis(GPIO_NUM_25);
gpio_pullup_dis(GPIO_NUM_25);
Serial.begin(9600);
mhz19.begin(rx_pin, tx_pin);
mhz19.setAutoCalibration(false);
// 追記:デフォルトだと画面が見づらいので、横向き表示でフォントを大きくする。
M5.Lcd.setRotation(3);
M5.Lcd.setTextSize(4);
// 変更:文字を画面に表示する。
M5.Lcd.println("MH-Z19 is warming up now.");
delay(10 * 1000);
}
void loop()
{
int co2ppm = mhz19.getCO2PPM();
int temp = mhz19.getTemperature();
// 追記:画面の表示とカーソルを初期化することで、前回の文字の表示を消す。
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(0, 0);
// 変更:文字を画面に表示する。
M5.Lcd.print("co2: ");
M5.Lcd.println(co2ppm);
M5.Lcd.print("temp: ");
M5.Lcd.println(temp);
delay(5000);
}
CO2濃度を測定できました!!ついでに温度も!
外気のCO2濃度は400ppm前後だそうなので、870ppmは少し高めでしょうか。エアコンをつけて窓を締め切っている状態なので、感覚的には正しいように思います。 息を吹きかけてみると、10秒後ぐらいに3,000ppmぐらいになりました。息に反応する程度には計測できているようです。
とりあえず測定はできたので今回はここまで。この後はMH-Z19Cのキャリブレーションや画面表示のデザイン、クラウドへのアップロードなどを試してみたいと思います。