先日はじめてギターアンプを自作しましたが、今回はM5StickC Plusを使った電子工作です。在宅勤務が今後も続きそうなので、自宅の快適さを測りたいと思い、集中力に影響があると言われているCO2の濃度を測ることにしました。
デバイスと部品
- M5StickC Plus:秋月電子で購入
- MH-Z19C:秋月電子で購入
- ジャンプワイヤー オス-メス:以前Amazonで購入したもの
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」を選ぶと、サンプルコードが表示されます。ただし、まだマイコンに書き込みません。下記のコメント記載部分を追記、変更してからマイコンに書き込みます。
// 追記: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のキャリブレーションや画面表示のデザイン、クラウドへのアップロードなどを試してみたいと思います。