二酸化炭素センサー到着しました
中国から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/lo08,09 キャリブレーションパラメーター2 hi/lo0a,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