M5StickCとMH-Z19Bで部屋の二酸化炭素を計測して記録する

8/16/2020, 7:16:51 AM
前回からの続き。

MH-Z19B

M5StickCとMH-Z19B
M5StickCとMH-Z19B
MH-Z19BをM5StickCに接続して、CO2センサーのデータを読み取ってGoogle Sheetに記録するプログラムを書く。
まずMH-Z19BについてるピンとM5StickCを接続する。MH-Z19Bに電力を供給するために、MH-Z19BのVinピンとM5StickCの5V outをつなぎ、MH-Z19BのGNDピンとM5StickCのGNDをつなぐ。MH-Z19BからデータをM5StickCで読み取るために、MH-Z19BのTxピンとM5StickCのG0、MH-Z19BのRxピンとM5StickCのG26をつなぐ。M5StickC側のGPIOピンはなんでもいいっぽいが、つないだピン番号をコードに書く必要がある(後述)。
MH-Z19Bのピン接続
MH-Z19Bのピン接続
M5StickCのピン接続
M5StickCのピン接続

MH-Z19Bのデータを読むコード

接続できたらM5StickCでデータを読むコードを書く。日本語で書かれたM5StickCでMH-Z19Bを扱う記事を読むと、UIFlowでPythonでコードを書いている例やM5CloudでPythonを使う例が出てきてArduino/Cなコードが出てこなくて一瞬焦ったが、ArduinoのLibrary ManagerでMH-Z19を検索して出てくるライブラリを#includeして普通に使えた。
実際のコードを書くときにライブラリのexamples/BasicUsageを参考にしたんだが、M5StickCで使う場合は一部コメントアウトされている方を使う必要があったりする。別にポイントってほどのことではないが、Serial1をbeginで開くときに指定する実引数でボーレート(BAUDRATE)を9600にして、上述のTxとRxの番号を指定することで正しくデータを読み取れるようになる。この辺がサンプルコードの中ではHardwareSerialになっていたり(Serial1でよい)、RX_PINとTX_PINの値が違っていたり(M5StickCではGPIO10やGPIO11へのアクセスはない)するが、まあ見ればわかるって話だと思う。ESP32にはSerial1とSerial2っていう系統があるっていうのはこの記事で知った。
ソース: https://github.com/fumiakiy/M5StickC/
CO2センサー完成。気温は高めに出る。
CO2センサー完成。気温は高めに出る。

Google Sheetに記録するコード

CO2センサーのデータをSerialに出力してそれっぽいデータが取れていることが確認できたので、これをGoogle Sheetに送って記録しておくことにする。Google SheetにひもづけたApp ScriptをWeb Deployすれば勝手にHTTPのエンドポイントを作ってくれるので、下記のような単純なApp Scriptで、HTTP POSTでJSONを受け取ってGoogle Sheetに追加できる。
function writeData(ar) {
  const d = new Date()
  const aar = [...ar, d.getTime(), d.toLocaleString()]
  const sheet = SpreadsheetApp.getActiveSheet();
  sheet.insertRowBefore(1);
  sheet.getRange(1, 1, 1, aar.length).setValues([aar])
}

function doPost(e) {
  const d = e.postData.contents;
  const j = JSON.parse(d);
  writeData(j);
  return ContentService.createTextOutput("ok");
}
このコードをWeb DeployすればURLが割り当てられるので、それに対してM5StickCからHTTP POSTすればよい。めんどくさいので認証は省いてURLを知っていれば誰でもアクセスできるようにしちゃった。
ソース: https://github.com/fumiakiy/M5StickC/
あとは1日データを溜めて、グラフ化してみよう。
« M5StickCでベッドサイドのランプをOn/OffするBlogAndroid quick settings tile that [dis]connects a Bluetooth headset »