CO2センサーは部屋の換気状態などを示す指標として使われています。

手頃な赤外線CO2センサーモジュールをArduinoでRISC-VマイコンCH32V003につないでみました。


[テスト装置]
CO2センサーから読み取った値(CO2のppm)をシリアルモニタに出力しました。

・MPU:CH32V003F4P6
    Boards;CH32 MCU EVT Boards by WCH Ver. 1.0.3
・CO2 Sensor:Winsen MH-Z19C
・Display:Arduinoのシリアルモニタ



配線はシンプルで,電源以外ではセンサーとはPWM入力線,PCとはUART出力線の2本だけです(^^)。



[接続方法とソフトでの処理の問題点]
シンプルな処理を選んだつもりでしたが,,いくつか問題がありました。

・MH-Z19C には5Vの別電源を用意します。平均は40mA以下らしいですがピーク時には125mA流れるとされています。

・MH-Z19C はUARTとPWMの両方の出力がありますが,一番シンプルなPWM方式を選びました。

・Arduino 標準でPWMのパルス長を読み取る pulseIn(pin, value, timeout) が動きません。コンパイルエラーは出ませんがどうもまだ整備されていない?ようですので,パルス長の読み取りは適当に作ってみました。

・CH32V003のArduinoで delay() delayMicroseconds() の系統はクロック処理の問題か?あまり信用できません(^^;;;;
このためパルス長の計測時のdelayMicroseconds() の設定などは実際のPWM出力のロジアナ波形と計測値を見比べながら決めました。

・PWMのパルス長からCO2のppmへの換算式はマニュアル通りではないようです。
換算式は秋月のQ&Aの例から頂きました。
 例: 400ppm = 5000×(82ms-2ms)/1000ms
   1000ppm = 5000×(202ms-2ms)/1000ms




[プログラムと出力結果]
 PWMのパルス長はms単位でカウントすることで代用しています。
また,出力結果は私の工作部屋の空気です(^^;;;;;




800ppmぐらいなので,ま,耐えられる部屋の空気ではあるようです(^^)。
この計測時のロジアナで見たパルス波形で,165msぐらいの波形でした。



約1000ms間隔でパルスは出ていました。





ちなみにオヤジが近くで息を吹きかけたりすると,軽く2000ppm近くまで濃度があがりますが,遠ざかると徐々に下がっていきます(^^;;;;;;
少し下がってきた時の計測値です。




厚労省の「建築物環境衛生管理基準の検討」では1000ppmが境界の基準のようですので,部屋の換気は必要ですね,,。



以上,いろいろと問題が起こってきましたが,なんとかCO2モジュールをつなぐ事ができました。

この計測結果の数値が正しいかどうかは他に手段を持たないので分かりませんが,空気環境に反応はしているので一応満足しています。

数値は装置をコンパクトにしてCO2の表示のある場所まで持っていって確かめるというテもありますかね(^^)。