PR 記事には広告が含まれています
スポンサーリンク
Translate

CO2センサMH-Z19でCO2をmbedで測ってみる

スポンサーリンク

image
二酸化炭素センサが海外のネットで売っているのを見つけました。

気体の濃度って測るのが難しそうですが、こんな小さなモジュールで測ることができるんですね。面白そうなので、買って試してみました。
このセンサはCO2の濃度を0~5000ppmの範囲で測定し、結果を、PWMのパルス幅または、シリアルで出力してくれます。データシートはこちらです(Zhengzhou Winsen Electronics)。早速、mbed LPC1114FN28でデータを受け取って、パソコンに送信して値をモニターしてみたいと思います。

まずは、ブレッドボードとジャンパー線を使って配線できるように、メスのピンソケットを半田づけしました。
image
金ピカのボディーがすごさをアピールしていますが、プラスチックに金メッキがしてあるだけです。遮光のためなんでしょうかね。
このモジュールの電源は5Vです。mbedは3.3Vなので電源をDCDCコンバータで昇圧して5Vを作ろうと思います。ただ、このモジュールから出てくる信号(PWMやシリアル通信のピン)はすべて3.3Vになっているので、センサとmbedや3.3V系のマイコンとそのままつなぐことができます。よくできてますね。

ハードウェア
配線のブロック図はこんな感じです。
co2block
mbedねこちゃん(またはUSBシリアルインターフェース)から出ている3.3VをDCDCで5Vに変換し、CO2センサに供給します。
このようなDCDCコンバータを使いました。

シリアル通信は、パソコンに送信するためと、センサと通信するために2チャンネル必要なので、mbedマイコンに内蔵のシリアル機能と、普通のデジタルピンをシリアルとして使えるソフトウェアシリアルのライブラリを使いました。ソフトシリアルを試してみると、センサの通信速度の9600bpsでは受信データを取りこぼしてしまうことがあったので、速度を気にしないパソコンへのデータ送信用に使うことにしました。そして内蔵のシリアル通信機能をセンサにつなぎました。

センサとの通信
測定結果をセンサから送ってもらうために、センサに対して
0xFF 0x01 0x86 0x00 0x00 0x00 0x00 0x00 0x79
の9バイトのコマンドを送信します。すると以下の9バイトがて返ってきます。
0xFF 0x86 上位データ 下位データ 温度 状態 0x00 0x00 チェックサム

  • CO2濃度 上位データ*256 + 下位データ で求まります。単位はppmです
  • 温度 温度データ-20 -40を計算すると求まるようです。単位は℃です
  • 状態  通常0が返ってきます。ほかの値もあるみたいですが、0しか見たことないです
  • チェックサム 255 - 8バイトまでのデータの加算の下位8bit で求まった結果を同じならOK

となっています。
電源を入れて最初にセンサにコマンドを投げると、2,3バイトのゴミデータしか返ってきませんでした。2回めのコマンドからは測定結果が正しく返ってきます。
また、電源投入からセンサが安定するためにデータシートによると3分間は待っている必要があります。センサから値は返ってきますが、値が正しくない可能性があります。とくに最初の1分くらいは値が変でした。

ソフトウェア
作ったプログラムはこちらです。LPC1114FN28用ですが、ポートを変更すれば他のmbedでも動くと思います。
mbedねこちゃんでパソコンとシリアル通信をする場合には、シリアル通信ドライバーが必要になります。mbedのサイトのこちらからダウンロードしてセットアップしておいてください。その際、ねこちゃんをUSBに刺したままセットアップを実行しないとドライバーがインストールされませんでした。
パソコンでシリアルの受信ソフトを起動して、マイコンをリセットするとデータが送られてきます。
image
データの見方は

  • responds : センサから受信した9バイトの生データ
  • csm : 受信データから計算したチェックサムの値
  • CO2 : ppmに変換したCO2濃度
  • temp : センサの温度
  • stat : 状態

です。1秒おきに測定値がマイコンから届きます。

 

測定してみよう

さて、CO2濃度って実際どんな感じなんでしょうか。気象庁のページにこれまでのCO2濃度の変化が載っていました。年々右肩上がりに上がっていて、2017年は410ppmくらいなんですね。

実際の測定結果はこちら

co2graph
部屋の机の上にセンサを置いてしばらく測定していました。2000秒くらいの時に、窓を開けてセンサを窓のところに置いて放置しました。窓を閉めた部屋はだいたい650ppmで、窓のところでは450ppmってところでしょうか。ちゃんと値が変化して面白いですね値のばらつきは±40ppmって感じでしょうかね。

 

違うところでも測っていました。ある大きな吹き抜けのあるビルの休憩スペースで測定してみました。

co2graph2
結構変化しているものなんですね。それと、屋内は屋外よりもCO2濃度が高いんですね。

東京消防庁の資料によるとCO2濃度が2%(2万ppm)以上になると中毒症状が出るそうなので、それに比べたらぜんぜん問題ないレベルですね。

センサのキャリブレーション

最初、窓の外に置いておいても400ppm程度にならず、700程度の高い値のままでした。こんなときはキャリブレーションが必要です。外に20分ほど電源を入れたまま放置して、HDピンをGNDにつないで7秒以上待ちます。すると、その現在の濃度が400ppmに設定されます。少しの息がセンサにかかってもセンサの値が上がってしまうので、呼吸を止めてHDピンとGNDをショートしましょう。苦しいですが…

さてこれで二酸化炭素が手軽に測れるようになりました!!

といっても、測ってどうしようかな??

2020.1.29 追加 ESP32でも測定できるようにしてみました

追加終わり

関連記事