今月初めにコロナウイルス蔓延防止対策が発動し、CO2メーターが品不足になっているというニュースを見ました。
ネット通販では在庫切れになっているところはあまり見かけなかったんですが、サイトに表示されている在庫数があてにならないことも前に経験しています。
セットもの(きれいな筐体=箱に入っているので箱ものともいう)は実際に品薄なのかもしれません。
しかし、セットものに頼らずとも自作するのはさして大変ではなさそうなので、自作を試してみました。
〇試作CO2メーター
センサーが届くまで二週間かかりましたが、Arduino UNOとLCDディスプレイ、CO2センサーで組んでみました。
ですが、一発動作とはいきませんでした。
全然CO2濃度が取得できず一週間ほどいろいろ試行錯誤した結果、SoftwareSerial.available()を使っていたのが原因と分かりました。
本来SoftwareSerial.available()は受信データがあるかどうかを確認するAPIなのですが、これが受信データの有無にかかわらず常に「受信データなし」の状態を返してきていたようです。
職業柄「シリアル通信はデータ途絶/データ化けがあって当たり前、シリアルの読み込みAPIはブロッキングする」が前提でコードを組んでいたのですが、それが逆効果になったようです。
実動作を確認したところ、SoftwareSerial.readBytes()はブロッキングしないことがわかりましたので、SoftwareSerial.available()を使わなくても問題なくエラー検出&リカバリができます。
それを前提にコードを書き直したところあっさり動作しました。
ほかのスケッチではちゃんとSoftwareSerial.available()が使えるので、使い方に何かしらの原因があったんでしょうけど、コードを組み替えちゃったので詳細は不明。
〇換気全開状態のCO2濃度
こっちは「まあ、こんなもんか」という感じですが。
〇センサーに直接呼気を当てた状態のCO2濃度
すごい値が出ました(笑
データシートによると5000ppmはこのセンサーの測定限界値です。
ヒトの呼気って結構CO2濃度高いんですね。
(ちょっと検索してみたら、安静時でも10,000ppmくらいあるらしい。
そりゃセンサに直接吹きかけたら測定限界超えるね)
この後放置したら少しずつ値は下がっていき、3分ほどしたら元の値に戻りました。
センサーとしてはちゃんと動作しているようです。
この後部屋の窓を閉め切って、どのくらい濃度が上がるか確認してみました。
換気の目安は1000~1500ppmだそうですが、1時間半ほどで1,000ppmを超えました。
我が家の場合、数時間に1回は換気したほうがよさそうです。
◇◇◇
ちなみに、最初の写真にある機材は次のような順番でスタックしています。
CO2センサー(MH-Z19C)
|
汎用シールド
|
I2C接続LCD用シールド ― I2Cアダプタ ― 1602 LCDモジュール
|
Arduino UNO
間に挟まっているI2C接続LCD用シールドは、秋月電子通商さんで販売されているArduino用ユニバーサル基板にMIL端子を付けてI2C接続用のピンを引き出しただけのものですが、UNO R3/MEGA2560 R3にあるI2C端子の2ピンだけで表示できるので、SoftwareSerialを使えない時のデバッグログ出力や、通常の表示関係で簡単に使えるので重宝しています。
汎用シールドも同様にArduino用ユニバーサル基板にMIL端子を付けただけのものです。
今回の実験では必要ないんですが、I2C接続用シールドの配線がおざなりでお見せするのが恥ずかしいので、それを隠すためにつけていますf(^^;
◇◇◇
さておき。
デバッグしていて気づいたんですが、このセンサ、CO2濃度以外の情報も取得できるようです。
〇レスポンスのダンプ
:
:
センサからのレスポンスをダンプしてたんですが、データシートではDon't careとされていた5バイト目、7バイト目にも何らかの情報が入っています。
5バイト目はほぼ一定の値となっていて意味が推測できません。
数日動かしていた範囲では50~59の間で変化しました。値の変化を部屋に置いてある温湿度計と比較もしていましたが、温度や湿度とも連動していませんでした。
ですので、温度でも相対湿度でも絶対湿度でもないようです。
7バイト目は10分間隔で1ずつ上昇しています。
電源を入れなおすと0に戻るので、電源投入からの経過時間(単位は10分)でしょうか?
センサーの電源を投入したのがいつだったか確認できないので、確証はありませんが…。





