これは 😺TECHSCORE Advent Calendar 2018😺 の1日目の記事です。
おうちの二酸化炭素濃度を計ってみる
家の窓を閉めきっていると空気が悪くなりますが、一体どんだけ空気悪いのかなんとなく気になっていました。
とはいえ計測器は高額。センサーモジュールを探して自作することにしました。
寒い時期ですが、二酸化炭素濃度がわかれば最短の換気もできるかもしれません。
完成品はこちら
とりあえず、どういったものになったか先に出してしまいます。
ユニバーサル基板に各モジュールをはんだ付けして、クラフト紙でケースを作りました。
使用する部品
- Arduino Nano 互換機
- MH-Z19 (二酸化炭素センサー) 約2,100円
- 0.96インチ 128x64 OLED ディスプレイ 約300円
購入先などは後に載せておきます。
接続方法
見たままです。
クリックして、拡大して見てください。
MH-Z19 は、ブレッドボードなどのピッチとは合っていないようなので、若干"ハの字"になるかと思います。
また↑に示されているホール以外にコネクタが付いていることもあるようですが、折り取ってしまっても問題ありません。
OLED ディスプレイや Arduino Nano は素直に接続できます。
接続したら、あとは書き込むだけです。
プログラムの書き込み
ソースコードを下に掲載しますが、そのままではコンパイルできません。
Arduino IDE のメニューの「ツール→ライブラリの管理」から以下の二つをインストールする必要があります。
- Adafruit GFX Library
- Adafruit SSD1306
コード概要
ライブラリを使っていることもあり、特に難しいこともありません。
MH-Z19 で CO2 計測した値を OLED ディスプレイに表示し、PC からも値を取得できるようにシリアル出力もしています。
MH-Z19 はソフトウェアによるシリアル接続、OLED ディスプレイは I2C によって接続されます。
もし、MH-Z19 の使用ピンを変えたい場合は、MHZ19Serial(A0, A1)
を変更すれば良いかと思います。
また、隠し機能らしく怪しい値なのですが、温度もわかるようなので取得しています。
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#include <SoftwareSerial.h> #include<Wire.h> #include<Adafruit_GFX.h> #include<Adafruit_SSD1306.h> Adafruit_SSD1306 display(-1); SoftwareSerial MHZ19Serial(A0, A1); byte Request[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79}; struct Response { word header; byte vh; byte vl; byte temp; byte tails[4]; } __attribute__((packed));; void setup() { MHZ19Serial.begin(9600); Serial.begin(115200); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); } void loop() { struct Response response; MHZ19Serial.write(Request, sizeof Request); MHZ19Serial.readBytes((char *)&response, 9); if (response.header != 0x86ff) { return; } word ppm = (response.vh << 8) + response.vl; byte temp = response.temp - 40; display.clearDisplay(); display.setTextSize(4); display.setTextColor(WHITE); display.setCursor(0, 0); display.println(ppm); display.setTextSize(2); display.setCursor(100, 13); display.println(temp); display.display(); Serial.print(ppm); Serial.print(" "); Serial.println(temp); delay(10000); } |
シリアル接続
Serial.print
などで書き出している情報は、USB 接続すれば PC から読みだせます。
連携して何かするのであれば、Ruby などでスクリプトを書くところですが、とりあえず確認するには picocom
や screen
が便利です。
ボーレート(115200)を指定するのだけ忘れないで下さい
コマンド例:
1 2 3 |
$ picocom -b 115200 /dev/ttyUSB0 $ screen /dev/ttyUSB0 115200 |
I2C のアドレスについて
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
の 0x3c
ですが、モジュール裏面(下記写真の赤い部分)にある IIC ADDRESS SELECT
が 0x7A
と 0x78
のどちらに接続されているかで変わります。
このアドレスは 1 bit 左シフトされたもので、0x7A
なら 0x3d
、0x78
なら 0x3c
となります。
シフトされている理由は不明です…。なんで?
キャリブレーションについて
今回、キャリブレーションが面倒なこともあって、手動では特に行なっていません。
しかし、自動キャリブレーション機能があるらしく、一応それらしい値が取れています。
換気などに明らかに影響を受けているのもわかります。
少なくとも変化はわかるので十分使えそうです。
ちなみに自動キャリブレーションはデフォルト有効の機能で、24 時間毎にその間の最低値を 400ppm とみなしてくれるようです。
一日一回換気せよ、ということでしょう!
購入先
私が購入したページと検索キーワードを載せます。
海外の通販サイトですが、運が悪くなければおよそ 2 週間前後で届きます。
高くなると思いますが、国内のサイトでも購入できると思います。
- OLED ディスプレイ 「I2C OLED 0.96」
- 二酸化炭素センサー 「MH-Z19」
Arduino Nano 互換機はどこのご家庭にもあると思いますので、省略します。
また、MH-Z19 の仕様はこちらの PDF になるようです。
どんだけ空気が悪かったのか
部屋のドアを閉めて寝ると、起きる頃には 1,000ppm を越えているという残念な事になっていました。
就寝時に限らず、部屋のドアを閉めているとグングン二酸化炭素濃度が上っていきます。
しかし、ドアを開けておくだけで大分改善されるようです。
健康のためにドアは開け放しておいたほうが良さそうです。
オフィスの空気
オフィスでも計測してみましたが、空調のおかげか 1,000ppm 越えることはないようです。
法律で求められることのようなので当然かもしれませんが、ちょっとつまらないと思ってしまいました…。
建築物環境衛生管理基準について|厚生労働省
これからも二酸化炭素を生成していきたい
これが二酸化炭素と同時にカワイイを生成する生物です。
末永く二酸化炭素を生成していってほしいですね。
ライセンス
回路図は、Fritzing で生成しました。
回路図の画像の著作権は以下にあります。
- OLED および MH-Z19: MIT ライセンス / Gijs Noorlander 氏
- その他: CC BY-SA 3.0 / Fritzing