MH-Z14Aからデータをとってxxxな記事はあるけど、キャリブレーションをしている例がほとんどなかった
どうもデータシートのv1.0.xにはコマンドの内容までは書かれていなかったみたい
公式HPを調べてみるとv1.2のデータシートがありコマンドの説明もされているので、備忘録も兼ねて仕様等をまとめてみる
また、日本語のデータシートは無くDeepLで翻訳しながらなので内容に誤りがあるかもしれないのでその際はコメントしていただきたい
データシート:https://www.winsen-sensor.com/d/files/MH-Z14A.pdf
諸元
出力別使用法
PWM※1
検出レンジが0~2000[ppm]の場合、1000ms(±5%)周期でPWMが出力されるので、High幅(Th),Low幅(Tl)を以下の式に当てはめればいいらしい
CO2濃度[ppm] = 2000 x ( Th - 2 ) / ( Th + Tl - 4)
ただし、実際に上の式で試したところシリアルでは720[ppm]と出てるのにPWMではTh=147,Tl=854,CO2濃度=290[ppm]と明らかに低すぎる値が算出されたので2000の部分は検出レンジによって変わるっぽい
測定値が720[ppm]の場合、2000ではなく5000にするとシリアルの値とほぼ一致する
測定レンジを知る術がわからないので使いづらいかもしれない
DAC
出力電圧0.4〜2.0[V]がCO2濃度の0〜10000[ppm]に対応するらしい、計算式は以下
CO2濃度[ppm]=(Vo(V)-0.4V)*検出レンジ[ppm]/(2.0V-0.4V)
例によって検出レンジがどれにあたるか分からないが、実際に試したところシリアルでは720[ppm]のとき出力電圧が0.62[V]で検出レンジが5000だとするとほぼ一致する値が算出出来た
シリアル(UART)
0x86:CO2濃度
CO2濃度の測定値を取得できる、換気の指標にするくらいなら校正せずにこのコマンドのみでいいかもしれない
現に冒頭でも言ったように校正して使用している記事がほとんど見当たらないので
送信データ:0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79
byte0:スタートバイト
byte1:リザーブ
byte2:コマンド
byte3〜7:0固定
byte8:チェックサム
受信データ:0xFF,0x86,0xXX,0xXX,0x00,0x00,0x00,0x00,0xXX
byte0:スタートバイト
byte1:コマンド
byte2:CO2濃度(上位1byte)
byte3:CO2濃度(下位1byte)
byte4〜7:0固定
byte8:チェックサム
0x87:ゼロ点校正
ゼロ点と言っているが400[ppm]に校正するコマンド
400[ppm]のCO2で満たした箱等に入れるか屋外で20分以上稼働させた後にこのコマンドを送る
ちなみに屋外のCO2濃度が400[ppm]程度とよく言われるが、気象庁の観測結果を見ると400[ppm]前後だったのは2013年まで
2020年時点では420[ppm]付近で+5%程度高い値の為、屋外で校正する場合は考慮する必要があるかもしれない
参考:https://ds.data.jma.go.jp/ghg/kanshi/obs/co2_monthave_yon.html
送信データ:0xFF,0x01,0x87,0x00,0x00,0x00,0x00,0x00,0x78
byte0:スタートバイト
byte1:リザーブ
byte2:コマンド
byte3〜7:0固定
byte8:チェックサム
受信データ:無し
0x88:スパン校正
上限側を校正するコマンド、2000[ppm]が推奨だが1000[ppm]以上ならokっぽい
これはゼロ点校正をしてからじゃないと使ってはいけないらしい
送信データ:0xFF,0x01,0x88,0xXX,0xXX,0x00,0x00,0x00,0xXX
byte0:スタートバイト
byte1:リザーブ
byte2:コマンド
byte3:校正値(上位1byte)
byte4:校正値(下位1byte)
byte5〜7:0固定
byte8:チェックサム
受信データ:無し
0x79:自動校正ON/OFF
24h毎にゼロ点校正を行う自動構成機能のON/OFFをするコマンドで、出荷時にONになっている
この機能はオフィスや家庭向けに作られているっぽいけど定期的に換気がされるような環境でなければ有効に働かない気がするので切ってしまおう
データシートのnoticeを読む限り校正周期は最長6ヶ月とあるので、それくらいの周期で手動校正すればいい
送信データ(ON):0xFF,0x01,0x79,0xA0,0x00,0x00,0x00,0x00,0xE6
送信データ(OFF):0xFF,0x01,0x79,0x00,0x00,0x00,0x00,0x00,0x86
byte0:スタートバイト
byte1:リザーブ
byte2:コマンド
byte3:ON/OFF指定
byte4〜7:0固定
byte8:チェックサム
0x99:測定範囲設定
測定レンジを設定するコマンド
4byteとってあるけど0~2000,0~5000,0~10000のそれぞれ0x000007D0,0x00001388,0x00002710しか設定してはいけないっぽい
送信データ(0~2000):0xFF,0x01,0x99,0x00,0x00,0x00,0x00,0x00,0xE6
byte0:スタートバイト
byte1:リザーブ
byte2:コマンド
byte3:0固定
byte4,5:上位2byte
byte6,7:下位2byte
byte8:チェックサム