M5StickCとMH-Z19Bで部屋の二酸化炭素を計測して記録する
8/16/2020, 7:16:51 AM
前回からの続き。
MH-Z19B
まず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のデータを読むコード
接続できたら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っていう系統があるっていうのはこの記事で知った。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を知っていれば誰でもアクセスできるようにしちゃった。
あとは1日データを溜めて、グラフ化してみよう。