リモートワークで自宅にこもりながら、外も寒いし暖房もつけっぱなし。定期的な換気が必要なんだけど大体忘れがちになりますよね。これなんとかならないかなーということで調べてみると、こういうのが。
すっかり忘れていたけど、そういえば去年発表されてました。が、日本には全然来る気配がないんですよね・・・
であれば自分で作ってみよう、ということでRaspberry Piを使って室内の空気コンディションをモニタするというのをやってみました。
目次
参考にしたもの
参考、というか、実は↓まんまなぞらせてもらっただけだったりします。
が、ただし、私の環境だとこの手順通りにやってもできないものがいくつかあったたので、そのあたりの対処などを少し記載します。
必要なもの
最初にまず必要なものをリストアップ。
Raspberry Pi
上記の記事ではRaspberry Pi Zero WHを使っているみたいですが、Zero WHに限らず、そもそもRaspberry Piがどこも欠品中で手に入らない・・・以前使っていたRaspberry Pi 2 Model Bが、たまたま手元に残っていたのでこれを使うことにしました。
RPiの在庫不足はいつになったら解消するのかなぁ・・・
あ、そう、Raspberry Pi 2 Model BではWi−FiがないのでUSBのWi−Fiドングルが必要です。
ANAVI Infrared pHAT
Raspberry Pi用アドオンボード。名前にある通り、スマートリモコンを作るための赤外線モジュールというのがメインだけど、それだけじゃなくてセンサ用のI2CスロットやUARTポート(シリアルポートみたいなものみたい)がついていて、面倒なハンダ付け不要でRPiのGPIOに指すだけで使えるというようなもの。
上記のクラウドファンディングのサイト、もう終わってるのかなと思いきや普通に買えます。購入するオプションはいくつかあって、Advanced Kitというのを選択すれば温湿度・気圧・光センサーがセットになってるのでそれを買いました。
ちなみに、サポートしているのは、RPi A+/B+/2B/3B/Zero/Zero W(H)、ということで余っていたRPi2 Model Bでも安心して使えました。ちなみに、RPi4でもパッチを当てれば使えるということで、マニュアルが更新されているようです。
MH-Z19
今回のキモである二酸化炭素センサーです。ANAVI Infrared pHATのUARTポートに繋いで使います。元の記事ではおそらくMH-Z19Bだと思われるのだけど、現在出回ってるのはMH-Z19Cの様子。微妙に異なるみたいなのでライブラリが動かない可能性があるらしいけど、今回の用途では特に問題なかったです。
Amazonだとたくさん出てきてよくわからないので、秋月電子で買いました。
ジャンパーワイヤ(メスーメス)
ANAVI Infrared pHAT Advanced Kitについているセンサーは全部ケーブル付きのものになっていますが、MH-Z19だけ別なのでこれをつなぐためのジャンパーワイヤが必要です。よく使うオスーメス、オスーオスじゃなくて、メスーメスが必要になりますのでお忘れなく。
手順の違い
基本的には元のサイトの手順に従えばよいですが、違ったところだけいくつか。
Python3
OSは最新のRaspberry Pi OS 32-bit(Release 2022-01-28)なのですが、Pythonが2から3になってます。ということで、python-smbusパッケージではなくて、python3-smbusパッケージを使う必要があります。
$ sudo apt install python3-smbus
wiringpi
以下にあるように、GPIO操作を行うためのパッケージ「Wiring Pi」がdeprecatedとなってしまっているので、apt-get installして見つかりません。
で、raspi-gpioを使え、というのが正解なんだろうなと思いつつも、コマンドの出力も色々違うみたいだし、このへんちょっとよくわからない。ということで、 Wiring Piのパッケージはまだ公開されているようなので、それを使うことにしました。
BMP180のビルドに失敗する
Webインタフェースのコードに含まれているBMP180気圧センサーのコードですが、ビルドに失敗します。
$ git clone https://github.com/craftzdog/anavi-phat-sensors-ui $ cd anavi-phat-sensors-ui $ cd ../BMP180 $ make gcc -o BMP180 BMP180.o BMP180-example.o -I. -lwiringPi -lm /usr/bin/ld: BMP180-example.o:(.bss+0x0): multiple definition of `oversampling'; BMP180.o:(.bss+0x0): first defined here /usr/bin/ld: BMP180-example.o:(.bss+0x4): multiple definition of `ac1'; BMP180.o:(.bss+0x4): first defined here /usr/bin/ld: BMP180-example.o:(.bss+0x6): multiple definition of `ac2'; BMP180.o:(.bss+0x6): first defined here /usr/bin/ld: BMP180-example.o:(.bss+0x8): multiple definition of `ac3'; BMP180.o:(.bss+0x8): first defined here /usr/bin/ld: BMP180-example.o:(.bss+0xa): multiple definition of `b1'; BMP180.o:(.bss+0xa): first defined here /usr/bin/ld: BMP180-example.o:(.bss+0xc): multiple definition of `b2'; BMP180.o:(.bss+0xc): first defined here /usr/bin/ld: BMP180-example.o:(.bss+0xe): multiple definition of `mb'; BMP180.o:(.bss+0xe): first defined here /usr/bin/ld: BMP180-example.o:(.bss+0x10): multiple definition of `mc'; BMP180.o:(.bss+0x10): first defined here /usr/bin/ld: BMP180-example.o:(.bss+0x12): multiple definition of `md'; BMP180.o:(.bss+0x12): first defined here /usr/bin/ld: BMP180-example.o:(.bss+0x14): multiple definition of `ac4'; BMP180.o:(.bss+0x14): first defined here /usr/bin/ld: BMP180-example.o:(.bss+0x16): multiple definition of `ac5'; BMP180.o:(.bss+0x16): first defined here /usr/bin/ld: BMP180-example.o:(.bss+0x18): multiple definition of `ac6'; BMP180.o:(.bss+0x18): first defined here collect2: error: ld returned 1 exit status make: *** [Makefile:11: BMP180] Error 1
Cはさっぱりわからない、ということでいろいろ調べてるとBPM180をPythonから利用するためのライブラリ「Adafruit_Python_BMP」があることがわかったのでそちらで代替しました。
$ cd $ git clone https://github.com/adafruit/Adafruit_Python_BMP.git $ cd Adafruit_Python_BMP $ sudo python setup.py install
examplesディレクトリの下にサンプルがあるのでこいつをつかえばできそう。WebインタフェースがBMP180経由で参照しているのは気圧(pressure)だけなので、こいつを取得してJSONで返すだけのpressure.pyを作りました。
#!/usr/bin/python import Adafruit_BMP.BMP085 as BMP085 sensor = BMP085.BMP085() print('{{"pressure": {0:0.2f}}}'.format(sensor.read_pressure() / 100))
$ python pressure.py {"pressure": 1015.45}
あとは5分おきに生成しているcronを修正してあげればOK。
*/5 * * * * /usr/bin/python -m mh_z19 > /home/pi/anavi-phat-sensors-ui/data/MH_Z19.json */5 * * * * /home/pi/anavi-phat-sensors-ui/sensors/HTU21D/HTU21D > /home/pi/anavi-phat-sensors-ui/data/HTU21D.json #*/5 * * * * /home/pi/anavi-phat-sensors-ui/sensors/BMP180/BMP180 > /home/pi/anavi-phat-sensors-ui/data/BMP180.json */5 * * * * /usr/bin/python /home/pi/Adafruit_Python_BMP/examples/pressure.py > /home/pi/anavi-phat-sensors-ui/data/BMP180.json */5 * * * * /home/pi/anavi-phat-sensors-ui/sensors/BH1750/BH1750 > /home/pi/anavi-phat-sensors-ui/data/BH1750.json
できたもの
ケースとかに入れたいところではあるけど、とりあえず。二酸化炭素一番多そうなデスク周りにおいてますw
こんな感じで動いてます。1000ppmを超えるとアラーム音が定期的に鳴って、換気をお知らせしてくれます。いいですね。
まとめ
キャリブレーションで屋外に出してたときが約450ppm、ヒーターのある部屋に持ってくると2000ppm軽く超えてました。今までこんな状態で仕事してたのか、というのが見える様になったのは収穫ですね。
ただ、窓を開けて換気をするとみるみる下がるんですが、寒くない程度にしようと思うと900ppmぐらいまでしか下がらない。暖房入れずに窓閉めるだけにしたとしてもすぐに1100ppmぐらいは軽く越えてくるので、以外に1000ppm以下を保つのは難しいなと感じてます。なのでちょびっといじって1500ppmにしてたり、あとはアラーム音も違うものに差し替えたり。この辺は中を読んでいろいろいじるのも楽しいと思います。
元記事の作者の方に感謝。ちなみに、作者の方のブログが面白くて、特に以下のデスクの記事はとても参考にさせてもらいました。こちらもおすすめです。