2021年1月24日日曜日

二酸化炭素 測定 自作 DS-CO2-20

二酸化炭素センサー到着しました

中国からDS-CO2-20が届きました。

2週間かからなかったです。

他の人が注文したのと一斉に送付するのでタイミングがよかったのでしょう。

日本のAmazonからも購入できますがちょっと高いです。 AliExpressは$25ほどでした

     データシートはこちら

準備編はこちら

校正なしで正確だった。びっくり


窓をあけたらちゃんと430ppmになりました。

これはいまの地球の二酸化炭素のベース値です。20年前は400ppm以下だったので地球規模で二酸化炭素が増えてるのがわかりますね。

いままでの簡易測定器では一週間くらい使うとどんどん狂って数値が低くなり、窓を開けると200ppmとか地球ではなくなるので、一週間後が楽しみです


コロナ渦では1,000ppm以下推奨

病院や待機施設では1,000ppm以下になるよう空調を調整しているそうです。

一般家庭では2,000ppmくらいは普通に到達しますので、かなり良いコンディションといえるでしょう。

自宅もこれくらいを目指して喚起を心がけたいですな。



DC-CO2-20センサーの注意点


どのバージョンかわからん


DC-CO2-20はいくつかバージョンがあって、バージョン2.9からI2C対応のようです

それ以前のバージョンだとUART(RS232C/TTL)専用だったり、SELECTが逆だったりするようです

幸い自宅に届いたのはV2.9以上のようです

どのバージョンなのかを読み取る方法はありません!

ケースにも袋にも書いてありませんし、I2Cで読んだパラメーターにもそれらしい値はありませんでした

I2Cができなかった場合は、V2.9以外であれば後述の6番ピンを10kΩでプルアップしてみてください。 

V2.6だとプルアップでI2Cのようです。 

プルダウン/プルアップしてもI2Cに反応がなく、UARTで読み出せない場合は壊れているかもしれません...


ピンの幅が2mm


ICチップの2.54mmではなくファン系の2mm幅だったので基盤に直付けできない


I2Cのアドレス変更できない


通常I2Cは異なるアドレスをハードウェアのショートピンなどで変更すれば、同じセンサーを複数I2Cの同一バスにぶら下げられるんですが、これはダメかもしんない
でもひょっとしたら温度センサーみたいにアドレス自動設定かもしんない
2個買えばよかった


実機


センサー工作


さてデータシートの通りに配線します

センサー    機能名                      ラズパイのPIN

1 VCC                        4    (5V)

2 GND                        6    (GND)

3 SDA                        3    (GPIO2) SDA

4 SCL                        5    (GPIO3) SCL

5 RESET                    開放(リセット用に使うかも)

6 I2Cmode=L             9    (GND)

7 PWM                      開放(使わない)

なぁんだ、簡単だね...と思ったらですね、センサーの端子のピッチが2mmだって。

ファンのコネクターに使われるタイプのピッチですね。

ICの幅である2.54mmじゃなかったので、ICソケットに差して使う事ができません。

とりあえず線をハンダで直付けします...センサー交換したい時めんどくさいなぁ


ピカピカ点滅しています。

この時最大200mAも電流が流れます(スペックシートより)。連続だと電池は無理ですね

リセット端子をLにすると止まりますが、内部のマイコン復帰に0.5秒くらいかかるようです 



Raspberry PI側


配線を終了後、Raspberry PIで I2Cが動作するように設定します。

ラズパイのI2Cの設定方法についてはこちらの記事も参考に。

記事中でconfig.txtで50000を指定しているのはクロックを50KHzの設定です。

I2Cは100kbitと10kbitのモードがあるので、まぁ中間あたりを指定しているだけです


ラズパイのCLIターミナル(sudo su - でroot済み)を開けて、

# i2cdetect -l

i2c-1 i2c       bcm2835 I2C adapter           I2C adapter

 

i2c-1 があるので1台検出できました。

続いて1番にどのアドレスが割り当てられているかを見てみます

 

# i2cdetect -y 1

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f

00:          -- -- -- -- -- 08 -- -- -- -- -- -- -- 

10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 

以下略


I2Cの1番のアドレス0x08に何か検出しています。

この0x08がアドレスとなるので、i2cgetとかi2cdumpで指定すると値が読み出せます。


DS-CO2-20 のデータシートによると

アドレス 値                        意味
00,01     'BM' 固定
02,03     フレームサイズ。      8byte固定っぽい
04,05     CO2の値。ppm。    これがほしい
06,07     キャリブレーションパラメーター1 hi/lo
08,09     キャリブレーションパラメーター2 hi/lo
0a,0c     チェックデジット。    00から09まで足した値がhi/loで入っている


との事なので、04と05を読み出せば良いようです。

仕事で使うなら12byte全部読んでチェックデジットも計算すべきでしょう。

# i2cdump -y 1 0x08

No size specified (using byte-data access)

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef

00: 42 4d 00 08 03 85 00 00 0c 7e 01 a9 00 00 00 00    BM.???..?~??....

10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................

正しく読めているようです

二酸化炭素の量は4byte目と5byte目なのでw付きでワード読み出しします

  • -yは即座に値を表示
  • 最初の1はI2Cの1番Bus (i2c-1とでていた数値)
  • 0x08はセンサーのアドレス
  • 4は4バイト目から読み出せ
  • wはワード読み出し

# i2cget -y 1 0x08 4 w

0x9403

うん、せっかく4,5byteと読み出したいのにエンディアン逆だめんどくせぇ。

 

i2cgetにL/Hを逆に読み出す方法はないようです。古いコマンドだしね。仕方ないね。

bashは16進数変換と四則演算ができるので上位バイトを256倍して下位バイトと足し合わせます

 

# echo $((`i2cget -y 1 0x08 4`*256 + `i2cget -y 1 0x08 5`))


977

おお、部屋は977ppmとの事

自宅にはGC-02という二酸化炭素検出器があるので、その表示は990ppm

誤差23ppmなので一般家庭で使う分には十分です


省電力化


スペックシートによると測定中ピカっと光っている時は最大200mAも流れているんだそうです。

5V電源が常時とれれる環境であればまぁ大丈夫ですが、NETATMOみたいに単四電池で半年とか動作させるなら間欠動作にさせないといけないですね。

5番ピンをLOWホールドにすればRESETがかかった状態で点滅がとまります。

復帰には0.5秒ほどかかるようです。ピカピカ1回分というところかな。

ただ2波式であっても安定には数分かかるらしいので、測定の度にリセットはすべきではないのかなぁ。わからん。 


zabbixと連携


グラフで出せるようになります。

 

zabbixエージェント(クライアント) 


センサーをつけたzabbix_agent.confの設定 

# vi /etc/zabbix/zabbix_agentd.conf


PidFile=/var/run/zabbix/zabbix_agentd.pid

LogFile=/var/log/zabbix-agent/zabbix_agentd.log

LogFileSize=0


Server=zabbixサーバーのIP


ServerActive=127.0.0.1


UserParameter=co2,/bin/bash -c "echo $((`i2cget -y 1 0x08 4`*256 + `i2cget -y 1 0x08 5`))"


AllowRoot=1

Include=/etc/zabbix/zabbix_agentd.conf.d/*.conf


I2Cをsudoしなくても読めるようにする

これはグラフツールのzabbixが読めるようにする設定

group i2cにzabbixを足しておく。AllowRoot効いてないのかなぁ

 AllowRootのせいではなく、usermodコマンドで i2cインターフェイス に権限を渡す必要があるのを忘れていた(前の自分の記事で気づいた) 

最近のLinuxはセキュリティが厳しくて無駄に難しくなってるねぇ 

chmod 777 くらいじゃダメなんだよね(20年前のじじぃ知識) 


# sudo usermod -aG i2c zabbix

 

# vigr


i2c:x:998:pi,zabbix


 

zabbixサーバー


zabbixサーバーのほうでは、zabbix_agentのco2の項目を読み出せばok

zabbix_get -s クライアントのIP -k "co2"

950




end

2021年1月9日土曜日

二酸化炭素測定器を自作 (準備編)

二酸化炭素は眠い


コロナのおかげでほぼ自宅から出ないで作業が続いています

冬に入って窓も締め切る状態になると二酸化炭素が部屋に溜まっていって集中力が落ちている気がします(個人の感想です)

NETATMOという環境測定の機材を使っているんですが、だいたい1,000ppmを超えるとモヤとした感じになり1,800ppmを超えたあたりから眠くなってきます

                                    NETATMOの表示例


実は最近の電車も2,000ppmが超えないようにきちんと管理されています。小田急線の車掌側の運転台でその表示が見れる事もあります。

昔は満員電車で女性が酸欠でよく倒れていましたが、ここのところそういうのが激減しています。これは女性の為を思ってのことではなく、倒れると電車が遅延するということが主な理由だと思いますがWINWINなので大変結構なことかと。

NETATMOの問題点

NETATMOはグラフに出してくれるのでとても便利なんですが、1週間に1度程度部屋を完全換気して430ppmにしないとどんどんずれていくのと、クラウド側のサーバーが非力過ぎるのか年中メンテしていてグラフを見たい時に見れないという事がありストレスがたまります

しかも結構高い。1センサー1台で1万円くらい 

という事で自作してみようと思いました

二酸化炭素センサー

 PC WatchでCO2センサーを自作されている記事を見かけました。センサーの選び方までは良かったんですが、長期観測していないニワカ丸出しで最終的には使い物にならないじゃん、と憤ったのがこのブログを書くきっかけです。

手に入るセンサーにはいくつか方式があって

VOC(TVOC)方式

揮発性物質をセンシングする。空気が淀むと人間からでてくるガスで汚れてくのでなんとなく二酸化炭素も増えてるんじゃないかと推測できる

メリット

安い。amazonで500円くらいでI2Cセンサーが買える。(=Raspberry直結可能)

低消費電力。電池でいける 

 

デメリット

二酸化炭素測定としては推論値

1ヶ月程度で補正が必要 

経年劣化がひどくて数年でダメになる。袋から出しただけで劣化が始まる

 NDIR方式

二酸化炭素が特定の光の波長を吸収する(4.3um)ので、赤外線LEDやレーザーを発光させて、反対側の受光部で測定する事で計測する。 

メリット

正確

デメリット

高い。電気食う。

1週間に1度新鮮な空気(430ppm)で補正が必要 

エージングが必要 

エージンングに430ppmで48時間暴露が必要ってデータシートにあるのにDIY記事の多くが「安定するのに時間がかかりました」とかもうね。データシート読むのは必須でしょう? 

 

二酸化炭素以外のガスを無視できるが、発光素子の経年劣化、受光部レンズに油などがつく事により経年劣化するので随時補正が必要。NETATMOも1週間に1度この補正が必要なのでおそらくこのセンサー

 

2波長NDIR方式(本命)

メリット
補正がほぼ不要。ビル管理向け

デメリット
さらに高い

発光部が2箇所。4.3μmの赤外線と3.8μmの赤ランプを交互に切り替えて1箇所の受光部で測定する。4.3μmは二酸化炭素を吸収し3.8μmのほうは吸収しないので差分で二酸化炭素量がわかる
ビルなど数十年にわたって計測する必要があるところなどメンテフリーが必須なところに使われる

他の方式として受光部が2箇所あるタイプもある。こちらはもっと正確なんだけど窒素封入部とかあるのでもっと高い

2波長NDIRを買うのだ!

 amazonでググるとNDIR方式のセンサーは割と売ってました。

MH-Z14が人気のようです。だが高い。元は2,000円以下なのに5,000円近い。売ってくれるだけありがたいですが。

ただしほとんどがUART(RS232C)でRaspberry PIにくっつけるには少々ヘンテコテクニックが必要。bluetoothが使えなくなっちゃう

DIY記事のほとんどが config.txtをこうすればUART使えますよ!とあるけど、そのラズパイは専用になっちゃうものばかり。

UARTだと線が5mくらいが限界&ノイズ対策大変で距離が稼げない(雨の日は動かないとかあるあるネタ)

複数のセンサーを同時に接続できるI2Cがいいよぉ。パッシブ接続でも50mくらいケーブル引き回せるし。アクティブなら1kmとかだ。(工場で使えるレベル)

あとラズパイ1台で複数いける。いろいろケチって使いたいんだよぉぉ。 

 

理想はI2Cで2波長NDIRを求めて

日本には無い

無いんだ、これが。 

村田製作所とかが作ってるのは知ってるんだけど、1個5,000円で1,000個単位(500万円)でしか買えない。自作ユーザーなんか相手にしてくれない(当然か笑)

秋月電子で浜松ホトニクスのセンサーは売ってるけど高いし、そもそもセンサー部分だけなので超ローノイズのオペアンプ回路が必要でそれをA/D変換してとか個人じゃ無理。μWを補償する回路なんて作れる自信ありませーん。普通のハンダゴテで作るの無理です。企業の開発向けですね。


中国にはごろごろある

という事でAlipayサイトへ

I2C使えて2波長NDIRで3,000円くらいのセンサーを探すと

DS-CO2-20 というのが良さそうです。データシートはここ。2016年に発売されてディスコンになってますが、在庫は豊富なようです。新型は精度が上がって値段倍くらい。

$23でした。実はamazon.co.jpでも取り扱ってたけど7,000円近いです。即時欲しいならまぁこちらを選択するのもありなのかな。

壊してしまうかもしれないので2個買いました。届くのは2月過ぎ。


続く!

のか?


追記

データシート読んでて気づいたんだけど、I2Cのアドレス変更する方法ないっぽい!?これじゃ1wireで複数読み取りできんではないか。ぬあーしくった。他のセンサーも探してみよう。