kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

Raspberry Piで部屋の空気コンディションモニタを作ってみた

f:id:kun432:20220219171625p:plain

リモートワークで自宅にこもりながら、外も寒いし暖房もつけっぱなし。定期的な換気が必要なんだけど大体忘れがちになりますよね。これなんとかならないかなーということで調べてみると、こういうのが。

すっかり忘れていたけど、そういえば去年発表されてました。が、日本には全然来る気配がないんですよね・・・

であれば自分で作ってみよう、ということで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

f:id:kun432:20220219194223j:plain

こんな感じで動いてます。1000ppmを超えるとアラーム音が定期的に鳴って、換気をお知らせしてくれます。いいですね。

f:id:kun432:20220219194454p:plain

まとめ

キャリブレーションで屋外に出してたときが約450ppm、ヒーターのある部屋に持ってくると2000ppm軽く超えてました。今までこんな状態で仕事してたのか、というのが見える様になったのは収穫ですね。

ただ、窓を開けて換気をするとみるみる下がるんですが、寒くない程度にしようと思うと900ppmぐらいまでしか下がらない。暖房入れずに窓閉めるだけにしたとしてもすぐに1100ppmぐらいは軽く越えてくるので、以外に1000ppm以下を保つのは難しいなと感じてます。なのでちょびっといじって1500ppmにしてたり、あとはアラーム音も違うものに差し替えたり。この辺は中を読んでいろいろいじるのも楽しいと思います。

元記事の作者の方に感謝。ちなみに、作者の方のブログが面白くて、特に以下のデスクの記事はとても参考にさせてもらいました。こちらもおすすめです。