💭

Raspberry Piで部屋の空気コンディションモニタを作る方法

2021/05/14に公開4

こんにちは、TAKUYAと申します。個人開発で生計を立てています。

部屋の空気の質を知ることは、自身の生産性を高く保つためにとても重要です。
換気を怠ると、思っている以上にパフォーマンスに悪影響が出てしまいます。
リモートワークで自宅で仕事をしていてなんとなく集中できないな…と感じている方は、ぜひ換気を意識してみてください。

今回は、気温、湿度、気圧、そしてCO2濃度を表示するエアクオリティモニタを作ってみました。
CO2レベルが1,000ppm以上になると音で知らせるようにし、換気のタイミングが分かるようにしました。本記事ではその制作過程をウォークスルー形式でご紹介していきます。
雑誌感覚で楽しめるように写真をふんだんに添付しました。では始めましょう。

Architecture

こちらがアーキテクチャです。
Raspberry Pi Zero Wをメインとし、Nginxを走らせ、ANAVI Infrared pHATにいくつかのセンサーを取り付けています。
好きなデバイスでブラウザから閲覧できます。

Raspberry Pi Zero W

SanDisk 32GB MicroSD Card

Anker 2-in-1 USB C Memory Card Reader

Raspberry Pi Imagerのダウンロード

Raspberry Pi OS を SD Cardに書き込む

Wi-Fi接続を設定する

ラズパイをWi-Fiネットワークに接続するには、wpa_supplicant.confというファイルをSDカードのルートディレクトリに作成します。

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
 ssid="<Name of your wireless LAN>"
 psk="<Password for your wireless LAN>"
}

<Name of your wireless LAN><Password for your wireless LAN> をご自身のWi-Fiネットワークのものに書き換えましょう。

SSHサーバを有効にする

ネットワーク経由でSSHサーバにログインできるように、SSHサーバを有効にします。
sshという名前の空ファイルを touchコマンドでルートディレクトリに作成します。

Raspberry Piを起動する

Wi-Fiネットワークに接続されたか確認する

ping raspberrypi.local

Raspberry PiにSSHで接続する

ssh pi@raspberrypi.local

デフォルトのユーザとパスワードは以下のとおりです:

  • user: pi
  • pass: raspberry

ANAVI Infrared pHAT

ANAVI Infrared pHATはラズパイ向けのアドオンで、赤外線でエアコンなどをコントロールする用に作られました。
オプションでセンサモジュールが付いてきて、これがとても便利です。
Advanced Kitを購入すると、以下の空気センサモジュールが付いてきます:

  • HTU21D - 温度 & 湿度
  • BMP180 - 温度 & 気圧
  • BH1750 - 明るさ

ANAVI Infrared pHATをRaspberry Pi Zeroにインストールする

繋げるだけです。ソルダリング不要。

I2Cスロットにセンサーを繋ぐ

MH-Z19 - CO2濃度センサ

MH-Z19は安価で手に入るCO2濃度センサです。

MH-Z19をUARTスロットに繋ぐ

MH-Z19が作動してる事を確認する

上記のように白い窓が定間隔で点滅します。かわいい。

Raspberry Piのパッケージを更新する

sudo apt update
sudo apt upgrade -y

git と ビルドツールをインストールする

sudo apt install git build-essential

python-smbus と i2c-tools をインストール

sudo apt install python-smbus i2c-tools

I2Cインターフェースの有効化

sudo raspi-config

'Interface Options' -> 'I2C' -> 'Yes'.
その後、再起動します。

I2Cインターフェースが動作してるか確認する

sudo i2cdetect -y 1

センサモジュールをテストするためにサンプルコードをダウンロードする

git clone https://github.com/AnaviTechnology/anavi-examples.git
cd anavi-examples

wiringpiをインストール

sudo apt install wiringpi

サンプルコードをビルドする

cd ./sensors/HTU21D/c
make
./HTU21D

シリアルインターフェースを有効化する

sudo raspi-config

'Interface Options' -> 'Serial Port' -> 'No' -> 'Yes'.
再起動。

python-pipをインストール

sudo apt install python-pip

mh-z19用のPythonモジュールをインストール

sudo pip install mh-z19

テスト:

sudo python -m mh_z19
# -> {"co2": 5000}

いい感じですね。でも値がおかしいです。キャリブレーションしましょう。

MH-Z19を外にしばらく置く

ZERO point calibrationを実行する

デバイスを外に置いてしばらく経ったら、ZERO point calibrationを実行してキャリブレーションします:

sudo python -m mh_z19 --zero_point_calibration

すると、値が最低値まで下がります:

sudo python -m mh_z19
# -> {"co2": 400}

nginxをインストールする

Webサーバを入れましょう。

sudo apt install nginx

Web UIを入れる

GitHubに僕が作ったWebインターフェースを公開してあります。

https://github.com/craftzdog/anavi-phat-sensors-ui

こちらを再利用します。

cd ~
git clone https://github.com/craftzdog/anavi-phat-sensors-ui
cd anavi-phat-sensors-ui

センサーのCプログラムをビルドする

サンプルをいじってJSON出力するようにしたものをビルドします。

cd sensors/BH1750
make
cd ../HTU21D
make
cd ../BMP180
make

テストデータを用意する

いったん手動でセンサーデータを作ります。

cd ~/anavi-phat-sensors-ui
mkdir data
./sensors/HTU21D/HTU21D > ./data/HTU21D.json
./sensors/BMP180/BMP180 > ./data/BMP180.json
./sensors/BH1750/BH1750 > ./data/BH1750.json
sudo python -m mh_z19 > ./data/MH_Z19.json

nginxを設定する

sudo vi /etc/nginx/sites-available/default

以下の行を編集します:

root /var/www/html;

以下のように:

root /home/pi/anavi-phat-sensors-ui;

そしてnginxを再起動します。

sudo /etc/init.d/nginx restart

Web UIをブラウザから開く

わーい!

rootのcrontabを設定して5分ごとにセンサーデータを更新するようにする

sudo crontab -e

以下のように編集します:

*/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 * * * * /home/pi/anavi-phat-sensors-ui/sensors/BH1750/BH1750 > /home/pi/anavi-phat-sensors-ui/data/BH1750.json

Raspberry Piをケーブルボックスに入れる

センサー部分をちょっとだけ出すようにします。ピョコっと。


以上です。ご参考になれば幸いです。エンジョイハッキング。

Follow me online

ブログの更新通知をメールで受け取る

My YouTube channel

Discussion

namikirinamikiri

質問なのですが、 ANAVI Infrared pHAT はCo2濃度を測るだけなら、必須ではない認識で大丈夫でしょうか?(当方、NatureRemoを持っているので温度・湿度等はそちらでカバーできる為。)