冬場は寒いので、ドアをきちんと閉めないと嫌われたりした経験があると思います。
そんなちょっと不注意な行動が意外に部屋の換気の役に立つ今日この頃かもしれません。
数年前に使っていたCO2センサー(MH-Z19B)のことを思い出して、棚から出してみました。
MH-Z19Bのデータシート
近赤外の吸収でCO2の濃度を測定します。校正は一日のうちで一番低い値を400ppmとする割きりで小遣いで遊べる程度の低価格ながら、換気すると目に見えてCO2濃度が低下するので、なにかきちんとモニターできているような印象を与えます。
以前にも紹介したことがありますが、バッテリーとディスプレイとブルートゥースが使えるM5StickCを使って自宅の換気をモニターしてみましょう。
MH-Z19Bのデータシートを軽く眺めてもらうと、アナログ出力やPWM出力もありますが、測定結果をデジタル値で受け取ることのできるシリアル通信がお勧めです。M5StickCは小さいながら3本のシリアル入出力を使うことができます。USBケーブルを使ってPCとの通信は必要ですので、MH-Z19Bとの通信にはSerial1(G26,G0))を使います。MH-Z19Bの電源は5Vが必要なのですが、さいわいM5StickCには5V出力があります。
MH-Z19Bに9バイトのデータ要求コマンドを送るとすぐに9バイトの返信があります。そのうちの2バイトが測定データで単位はppmです。
ディスプレイに値を表示しつつ、USB経由でデータをPCに送ります。
データを受け取るPCと測定したいポイントは離れているでしょうから、ブルートゥースシリアルでもデータを送ります。
M5StickCの使い方は
M5StickCをはじめよう Arduino編
を参考にしました。
ブルートゥースシリアルについては
BluetoothSerialでお手軽無線通信(M5StickC)
に少し書かれています。
配線は4本です。
MH-Z19B------------M5StickC
Pin 3 GND----------GND
Pin4 5V--------------5V
Pin5 RxD-----------TxD(D26)
Pin6 TxD-----------RxD(D0)
プログラムの書き込み時はD0からピンを外さないとエラーになります。
うまく下のプログラムを書き込むと2秒間隔で測定結果が表示されます。
#include <M5StickC.h>
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;
byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
byte res[9];
void setup() {
M5.begin();
Serial1.begin(9600, SERIAL_8N1, 0, 26);
Serial.begin(9600);
SerialBT.begin("CO2Mon");
M5.Lcd.setRotation(3);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setTextFont(4);
M5.Lcd.setTextSize(2);
M5.Lcd.setTextColor(0x03E0,BLACK);//DarkGreen
}
void loop() {
Serial1.write(cmd, 9); //request PPM CO2
Serial1.readBytes(res, 9); //read response
int ppmHigh = (int) res[2];
int ppmLow = (int) res[3];
int ppm = (256 * ppmHigh) + ppmLow;
Serial.println(ppm);
SerialBT.println(ppm);
M5.Lcd.fillScreen(BLACK);
M5.Lcd.setCursor(10, 10);
M5.Lcd.printf("%5d",ppm);
delay(2000);
}
PCのLabVIEWはUSB経由でもブルートゥース経由でもデータを受け取ることができます。
これは「LabVIEW Community Editionでプログラミングを楽しもう」の第7章の「7-2_Continuous Serial Read.vi」を改造しました。
LabVIEW Community Edtion でプログラミングを楽しもう
チャートに表示しながらcsvファイルにデータを記録するプログラムです。
ブルートゥースシリアルを使うにはPCにブルートゥース機能が必要で、さらにM5StickC(CO2Mon)をデバイスとして追加する必要があります。
ペアリングがうまくできればCOMポートが2個追加されます。
おそらく番号の大きな方が読み取り側だと思います。
LabVIEW Community Editionで遊んでみてください。
20.12.11