virt_flyのブログ -52ページ目

virt_flyのブログ

フライトシミュレーターソフトのFlightGearで仮想飛行を楽しむブログです。

↑スマホでCO2センサーをつけたRAspberryPi Zeroを操作し、CO2濃度を記録したCSVファイルを表示させる

定時記録の実行

前回のブログでは、CO2センサーのMH-Z19Bの動作確認まで実施することができました。

思えば、親指大のセンサーケースの中で、赤外線を照射されてガス分子が振動し、CO2分子の固有振動数に共振する波長4.26μmの赤外線が分子振動によって吸収される、その度合いからCO2ガス濃度をコマンド一つで知ることができるというのですから、すごいというか少し感動してしまいます。

 

しかし、面倒なことにいちいちコマンドラインからsudo python3 -m mh_z19と入力して実行しないと、CO2濃度が測定、もといMH-Z19Bは約5病間隔で赤く発光するところから自動でCO2濃度が測定されているように思われますので、値が表示されないというべきところでしょう。またそれ以上に、せっかくのCO2濃度も測りっぱなしでメモをとらないと記録が残らないというのは、いかにも残念なです。

 

そこで、定時に記録がされるように、参考サイト「Raspberry Piにセンサーを付けてCO2濃度を測定してみる」(打つか投げるか https://blog.ko31.com/202004/raspberry-pi-measure-co2/)にならって実行してみました。

 
1)データを出力
 

●jqのインストール

前述のコマンドの実行でアウトプットされたCO2濃度は、json(JavaScript Object Notation)形式のデータとなっていて、これをいじれるようにjjqをインストールするそうです。

 $ sudo apt-get install jq

 

●シェルスクリプトの作成

参考サイトのスクリプトをまんま借用。ただし、ファイル名は何のスクリプトかわかるようにco2.shに改めました。

 #!/bin/sh

 date=`date '+%Y-%m-%d %H:%M:%S'`
 
 result=`sudo python3 -m mh_z19 | jq '.co2'`
 if [ $? -gt 0 ]; then
     echo "${date},0"
     exit 1;
 fi
 
 echo "${date},${result}"

 

※作成したファイルのパーミッションに注意

 

作成したシェルスクリプトを実行すると、日時とCO2濃度がカンマ区切りで出力されます。

 例)
 pi@raspberrypi:~$ ./co2.sh      ←これを実行
 2021-01-17 00:17:04,706     ←日時とCO2濃度を出力

 

2)定時実行にはcron

 

●cronに登録

今回Raspberry Piでセンサーを使うのが初めてで、あちこちサイトを参考のために覗いていたら、cronという言葉にしばしばでくわしました。cronとは、UNIX系OSの常駐プログラムの一種で、設定したスケジュールで目的のプログラムを定時実行させるという便利なもので、常識的なあまりか各サイトとも詳しい説明がなかったようです。

 

先のスクリプトが1分おきに実行されるように、cronに登録することになるのですが、念の為にcronのステータスを確認したところ、エラーが発生。そんなディレクトリ、ファイルは存在しないと。

 

あれこれネットで調べて愕然としました。コマンドが違っている!

例えばcronのステータス。

 $ /etc/rc.d/init.d/crond status
 $ sudo /etc/init.d/cron status

エラーした前者と後者とでは、よく見ると全然違っています。

 

 

登録は、以下を実行

 $ crontab -e

 

すると、初回はエディター聞いてきましたのでとりあえずNANOを選択、次を書き込みました

 * * * * * /home/username/co2.sh >>co2.csv

 

メモ)

前半の5つの*がスケジュールを設定する部分で「分 時 日 月 曜日」に相当。詳しくはふれませんが数字が入ります。デフォルトの5つの*が並んだ* * * * * では、毎分(1分毎に)コマンドが実行されます。コマンド指定部分は後半。

 

cronの表示方法は、crontab -l
cronの削除方法は、crontab -r  注意!登録したすべてが消えてしまいます
 

●cronのログを有効化しておく必要

件の登録では、計測結果をcsvファイル(logファイルでも良い)に1分毎に出力するように書き込みましたが、実際に出力させるにはあらかじめcronのログを有効化しておく必要がありました。

 

次のようにNANOを起動し、rsyslog.confファイルを開き

 $ sudo nano /etc/rsyslog.conf

 

以下のコメントアウトを外します。

  cron.*        /var/log/cron.log

 

●計測出力の実行

次を実行することで、計測値がcsvファイルに出力されます。Raspberry Piを起動するたび自動実行されます。

 $ sudo /etc/init.d/cron start

 

なお、停止は、sudo /etc/init.d/cron stop

 

  再起動は、sudo /etc/init.d/cron restart

 
出力されたデータは、ホームディレクトリーに生成されたco2.csvファイルを開いて見るか、下記の通り入力して確認でききます。ちなみに、数字はさかのぼって15回分のデータをここでは表示することを示します。
 $ tail -15 co2.csv   ←数字は15回分を表示の意味

 

↑カンマ区切りでターミナルに出力、あるいはCSVファイルで確認

 

 

<参考>

「Raspberry Piにセンサーを付けてCO2濃度を測定してみる」(打つか投げるか https://blog.ko31.com/202004/raspberry-pi-measure-co2/

「クーロン(cron)をさわってみるお」(https://qiita.com/katsukii/items/d5f90a6e4592d1414f99) cronの使い方が初心者にはがわかりやすかった。

「ラズベリーパイでCronを使って定期処理を行う方法、ハマりポイントやCronが動かない場合の対処方法など 」(Keep it up! https://k99-tech.com/blog/archives/1141) これを見てエラーの原因に気付く

↑Raspberry Pi Zero WHとCO2センサーMH-Z19B(手前)

Raspberry PiとMH-Z19BでCO2濃度計測の覚書

コロナ対策として、換気の目安となる二酸化炭素濃度を知るための測定器が、あまた売られています。怪しげな安物を除いても、1万円から10数万円と高価ながら、キャリブレーションができないようなお粗末なものも少なくないとか。

 

貧乏人には、高額なものに手を出せないし、ハズレを引くくらいなら、はじめから安いセンサーで測定器を自作するほうがましかも。

 

1)システムを構成する機器

 

 シングルボードコンピューター  Raspberry Pi Zero WH
 非分散型赤外線(NDIR)方式
 CO2センサー
 MH-Z19B
 リモート操作用  パソコンまたはスマートホン

 

 

 

 

 

 

 

 

 

2)機器の接続

 

●CO2センサーMH-Z19BとRaspberry Piとの接続

 Raspberry Pi側  MH-Z19B側
 5V  V+
 GPO14(TXD)  Rxd
 GPO15(RXD)  Txd
 GND  V-

 

 

 

 

 

 

 

 

●パソコン(スマホ)とRaspberry Piとの接続

Wi-Fiを通じたインターネット接続を介し、realVNCによりパソコンまたはスマートホンからRaspberry Piをリモート操作します。

 

3)システムの設定と動作確認

 

●ライブラリーのインストール

Ued Takeyukiさんというご奇特な方がMH-Z19のpythonパッケージを公開されているのを利用(Https//test pypi.orgg/project/mh-z19/)。Terminalより以下のようなコマンドを実行します。

 $ sudo pip3 install mh-z19

 

 

この段階では、動作確認をしてもRaspberry Pi ZeroではttySOがどうしたやらのエラーが表示され、Raspberry Pi 4では何も起こらずじまいでした。

 

●シリアルを有効に

Raspberry Pi OSの[設定]から[インターフェース]タブの「シリアル」の有効にチェックをいれてみました。が、変化は見られません(次のraspi-configを実行するなら不要?)。

 

●UARTを有効に

/boot/config.txtの末尾にenable_uart=1を追加。変化は見られません。

しかたがないので、ターミナルでsudo raspi-configを実行。

 $ sudo raspi-config
 続いて[5 Interfacing Optoins]を選択
 →次いで[P6 Serial]を選択。
 →「Would you like a login shell to be accessible over serial?」と聞いてくるので、
 [いいえ]を選択。
 →「Would you like the serial port hardware to be enabled? 」と聞いてくるので、
 [はい]を選択して[了解]

 

 

 

 

 

 

 

 

 

 

 

●動作確認

動作確認のため、sudo python3 -m mh_z19を実行。無事、下記のように二酸化炭素濃度が表示されました。

 例)
 pi@raspberrypi:~ $ sudo python3 -m mh_z19  ←これを実行
 {"co2": 590}  ←CO2濃度

 

 

 

 

 

↑パソコンで遠隔操作されたRaspberry Pi ZeroでCO2測定の動作確認を行っているところ

 

4)キャリブレーション(校正)

 

CO2センサーの使用に際しては、精確を期すため常々calibration(校正)を行うことが求められます。基準となる外気の二酸化炭素濃度をゼロポイントとし、MH−Z19Bでは400ppmを与えます。その方法には複数ありますが、今回は手動校正を行いました。

400ppm未満(の屋外のもしくはよく換気した室内)で少なくとも20分間動作の上、HDピンをGNDに7秒以上接触させる、というわかりやすい方法です。

 

なお、MH-Z19Bには、ABCロジック機能という自動校正機能があって、電源投入後の24時間で一番低かった時を400ppmに設定してくれるという便利な(?)機能があります。デフォルトはON。24時間365日人がいるようなところに置いておいたらどうなるのでしょう。今回利用したpythonパッケージでは、ON/OFFの機能が実装されているようです。

 

<参考>

「Raspberry Piにセンサーを付けてCO2濃度を測定してみる」(打つか投げるか https://blog.ko31.com/202004/raspberry-pi-measure-co2/)

「窓を開けて新鮮な空気をいれよう!Raspberry PiでCO2濃度を測ろう」(https://qiita.com/UedaTakeyuki/items/c5226960a7328155635f

「Intelligent Infrared CO2 Module(Model: MH-Z19B)」(Winsen https://www.winsen-sensor.com/d/files/infrared-gas-sensor/mh-z19b-co2-ver1_0.pdf)

↑二酸化炭素センサーMH-Z19B

キャリブレーションに困惑

コロナ禍のため、密を避け換気が求められる今日この頃。とは言え、寒いとついつい換気も億劫になりがちです。二酸化炭素濃度とコロナウイルスの関連性は充分に証明されているわけではなさそうですが、換気のタイミングを知るには有用とのことで、注文していたのがCO2センサー。

 

前回のブログで述べた年明け早々の旅行で、新幹線の車内のCO2濃度が測れたのは、このセンサーが年末には届き、試してみることができたから。

 

選んだCO2センサーは、比較的低価格で、またキャリブレーション(注参照)や安定するまでの時間の点で扱いやすく見えるMH-Z19。CO2の赤外線吸収特性を利用したNDIR検出方式によるものと見られます。購入したMH-Z19は一番価格の安かったものにしたためか、他の製品と比べると形状で円形の突起がなかったり、端子の表記が違っていたりして、パッチもん(イミテーション)の可能性がないではありません。

 
測定は、MH-Z19つないだRaspberry Pi Zeroに、必要なpythonパッケージをインストール、スクリプトを書いて実行します。簡単なメモを次回に掲載します。
 
●室内の二酸化炭素濃度についての基準
 

さて、参考にすべき二酸化炭素濃度に関しては、新型コロナウイルス感染症厚生労働省対策本部がまとめた推奨される換気方法によれば、「ビル管理法における空気調和設備を設けている場合の空気環境の基準」にもとづき、1,000ppm以下とされます。800ppmを超えたら換気、1000ppm以上は至急換気と考えるのが良さそうです。なお、温度や湿度の考慮も必要になりますが、ここでは割愛します。詳しくは厚生労働省の「冬場における『換気の悪い密閉空間』を改善するための換気の方法」が参考になります。

 

●実際の測定値

 

それでは、実際の測定値を見てみましょう。

思っていたほど高くなりません。換気をしていない8畳間に一人で居ても500ppm台前半という値です。さすがに息を吹きかけると1000ppmや2000ppm台を超すのですが、同じ状態でパソコン作業を続けていても部屋のCO2 濃度が大きく変わらず、布団を持ってきて一晩寝た後でも800ppmには達しなかったりで、正しく機能しているのか心配になります。そんなものなのでしょうか。

 
いっそのこと人が多くいる場所で測って見ようと、前回述べたように新幹線の車内で測ってみたり、昨日も200人ほど集まったホールで測ってみたのですが、前者で500ppm前半、後者で600ppm前後と変わりばえしない数値ばかり。パッチもんを掴まされたのではと疑いも湧いてくるというもの。
 
今一度、起床後の部屋のCO2濃度の変化を調べてみました。その結果が次のグラフです。
 
重大なことに気づきましたが後にふれるとして、まずグラフを見ての考察です。
 
起床直後は、800ppm余あったCO2濃度が徐々に下がって行きます。昼間より夜間の方がCO2濃度が高いのは昼間に光合成をする植物も夜中は呼吸するためCO2濃度が高くなる影響と見られます。本来それほどの差ではなさそうですが、工場地帯でもなく、郊外の広大な住宅街であり、草木以外の要因は思い浮かびません。測定開始後1時間経過で10分間換気、一気に濃度が下がります。窓を閉め換気が終了した時点で一旦上昇しかけた濃度も、寒い部屋におれず無人となったらまた少し低下、その後部屋で測定値をモニターしている間は、わずかばかりでも上昇したのは、呼気の影響でしょう。残りの30分では、単時間の出入りなど戸の開け締めで一進一退となったものと見られます。この限りでは、順調に計測できているように見えるのですが…。
 
グラフ中、線の途切れはデータの欠損です。通常、センサーのつなぎわすれや、ジャンパー線の抜けがあるとnull値が返されます。これ以外にRaspberry Pi Zeroに特有と思えるのが、処理能力の遅さ。例えばデータをメールに添付して送るために、送信フォームを開こうとクリックしてもなかなか開かず、競合してかCSVファイルはnull値になるようです。Raspberry Pi Zeroはあくまでも処理能力に劣るマイコンボードであって、パソコンのように扱われるのは荷が重いと考えるべきなんでしょうね。
見つかった問題は、換気で最低となったCO2濃度です。自然界の外気のCO2濃度400ppmを大きく下回る
314ppmとなっています。何らかの要因でセンサーが誤作動でもしたのでしょうか。はたまたキャリブレーション(校正)に問題があったのでしょうか。
 
●キャリブレーション
 

厚生労働省の「冬場における『換気の悪い密閉空間』を改善するための換気の方法」には、

二酸化炭素濃度の測定には「NDIRセンサーが扱いやすい測定器」であるが、「製造者等によって定期的に校正されたもの」の使用が望ましく、「校正されていない測定器については、あらかじめ、屋外の二酸化炭素濃度を測定し、測定値が外気の二酸化炭素濃度(地域、季節、時間によって異なるが、415ppm〜450ppm程度。)と大きく乖離しないことを確認」することとされています。

 

キャリブレーションとは、CO2濃度の測定のゼロポイントを外気のCO2濃度に合うよう常々測定器の校正を行うこと。地球温暖化の原因となるCO2濃度は年々上昇していて、すでに400ppmを上回っているものの、MH-Z19では400ppmをゼロポイントとしています。

 

MH-Z19のキャリブレーションは、400ppm未満(の屋外のもしくはよく換気した室内)で少なくとも20分間動作の上、HDピンをGNDに7秒以上接触させる、というわかりやすい方法を実行。屋外では木枯らしのせいでチリが巻き上がるのか(センサーはカバーとフィルターで覆われていますし、風が強いほど拡散されてCO2濃度は低くなるはずですが)、数値は400や420どころでなく、困ったものの低目に出るのは覚悟で妥協したものでした。

 

ところが、測定値に一度きりですが300そこそこのありえない値が出たわけですから、キャリブレーションが高すぎたものか? 室内でも400ppmの時がありましたし。

 

そこで、わかりやすい方法以外の2つのキャリブレーションの方法を今一度よく調べてみたところ、AB C logicというのは自動校正のAらしく、インストールしたpythonパッケージを確認するとこれがONになっているではありませんか。24時間計測して一番低い濃度の時を400ppmと自動的にみなすわけですから、それならいつも屋内で測定しているうちに、キャリブレーションされたと考えてもおかしくはありません。

 

それなら、キャリブレーションをやり直せばよいのではと、とりあえず屋外で測定してみたところ、なんと今度は外気で600ppmという値がでるのですからびっくり。これでは、ゼロポイントが高いのやら低いのやらさっぱりわかりません。キャリブレーションは、外気の直接の影響がない、よく換気できた室内で行ったほうがましかもしれませんね。

 

屋外のほうがCO2濃度が高い納得できる理由はないものの、測定器が壊れているとも思えず、低い異常値もまれな誤動作による不具合とすれば、おおよそ測定は正しく行われているのかもしれません。いずれにしてもキャリブレーションは要注意で、ABC logicがONになっていることに留意しておいたほうがよさそうです。