朝の眠気にも影響!? ESP-WROOM02( ESP8266)とCO2センサー(MH-Z19B)でCO2濃度を測定してみる
こんにちは!
皆さんは日常生活でCO2(二酸化炭素)を気にしたことはありますか?
実はCO2は日常生活において大きな影響を及ぼすんです!
下記がCO2濃度の大まかの基準です。
350~500ppm | 外気 |
500~1000ppm | 一般的な屋内 |
1000~2000ppm |
悪い室内空気環境
|
2000~2500ppm |
眠気を感じてくる人が出てくる
|
2500~3000ppm |
肩こりや頭痛を感じてくる人が出てくる
|
3000ppm~ |
集中力などが低下してくる
|
今回CO2濃度に使うセンサーはMH-Z19Bというものを使います!
・仕様
・MH-Z19BはCO2の濃度を赤外線で測定し、0~5000ppmの範囲で結果を、
PWM通信のパルス幅または、シリアル通信で出力してくれます。
※最近は同じMH-Z19Bでも400~5000ppmが主流で、0から測れる物は激レアとなっています。
- サイズ 上の画像を参考に縦が2cm、横金部分が2.6cm、基盤を含めた横が4cm
- 非分散形赤外線吸収式
- 電源 4.5〜5.5V
- 平均電流 20mA
- インターフェイス UART または PWM 3.3V
- 動作温度 0~50度
- プリヒート 3分
- 温度補正あり。精度は±50ppm + 5%
※今回はシリアル通信で作ります。
(CO2センサーで安価なものはMQ-135などがありますが正直熱を発生するし精度があまり良くなかったです。)
それでは、早速作っていきたいと思います!
①「使う部品」
・MH-Z19B
2022年1月16日時点では電子工作ステーションで購入可能(2900円)⇩⇩⇩
※MH-Z19Cモデルが秋月電子などで売っておりますが性能が上がっている分、扱いが難しく今回紹介するやり方では動きませんのでMH-Z19Bをご使用ください
※MH-Z19Bモデルは現時点で、秋月電子などでの取り扱いは無いですので電子工作ステーションやメルカリにて入手することをお勧めします。
・低損失三端子レギュレーター 3.3V1A TA48033S
・電解コンデンサ 47μF35V(秋月電子で購入すると、3端子レギュレータに付属されています。)
・セラミックコンデンサ 0.1μF(秋月電子で購入すると、3端子レギュレータに付属されています。)
・LED(起動などを確認するためのメッセージ用に使う。なので任意)
電子工作ステーション 10円+送料(500円以上で送料無料)
秋月電子 10円+送料
・タクトスイッチ(2個)(任意ですがあると便利です)
電子工作ステーション 9円+送料(500円以上で送料無料)
秋月電子 10円+送料
・ブレットボード(どんな形状でもOK)
電子工作ステーション 250円+送料(500円以上で無料)(400穴)
秋月電子 270円+送料(400穴)
・ジャンパーワイヤー(オス・メス)
電子工作ステーション 1セット(10本)100円+送料(500円以上で無料)
秋月電子 10本220円+送料
(ブレットボードの細かいところを接続するためのワイヤーです。
ブレットボードで回路を組むとき、見栄え良く綺麗に繫げられますのであると便利)
・通信用マイクロUSBケーブルタイプB (家に無ければ)
秋月電子 120円+送料
ESP-WROOM-32とパソコンを繋ぐためのケーブルです。
100円ショップなどでも販売していますが、スマホ用充電専用タイプだと使えないのでご注意ください。
※任意(楽したい方向け)
ESP-WROOM-02開発ボードを使うとすぐに開発ができるよう回路が組まれているため、上記の「ESP-WROOM02」「超小型USBシリアル変換モジュール」「3端子レギュレータ」「電解コンデンサ 47μF35V」「セラミックコンデンサ 0.1μF」「タクトスイッチ」は不要になります!
②「Arduino IDEにESP-WROOM02を使えるように設定する」
・こちらをご参考に↓
Arduino IDEでESP-WROOM-02(ESP8266)とESP-WROOM-32を使えるようにする!(Windows10)
※Arduinoでチャレンジされる方は必要ありません。
※WSP-WROOM32でチャレンジされるこちらのサイトをご参考にお願いします。
③「回路」
・ESP-WROOM02の回路は再び下記サイトさんの「6.各部品の接続」を参考にしていただければと思います。
WROOM 単体に Arduino スケッチで Wi-Fi ストリーミング
・ESP‐WROOM02本体の接続箇所
pinナンバー | 状態 |
---|---|
GPIO 15(IO15) | LOW |
GPIO 2(IO2) | HIGH |
GPIO 0(IO0) | LOW |
EN | HIGH |
※GPIO 0(IO0)をLOWの状態で起動させるときのみ書き込みモード、LOWじゃなければ実行モードになります。
なのでGPIO 0とGNDにダクトスイッチをかましとくと後が楽です。
※RST(リセット)もLOWにすることでプログラムのリセットが行えますのでRSTとGNDにダクトスイッチをかましておくと後が楽です。
※ESP-WROOM-02開発ボードをご使用の方はここからスタート。
・センサーの裏面を参考に、接続していきましょう♪
MH-Z19B | ESP-WROOM-02-接続箇所(接続pin) |
V1n | 5V( + ) |
GND | GND( – ) |
Tx | IO4 |
Rx | IO5 |
※HDピンはゼロキャリブレーション様です。
(ゼロキャリブレーションとは、測定値をリセットして測定値がゼロとなるように調整する作業です。)
やり方は幾つかあるそうですが、一番簡単な方法は下記の様になります。
- 400ppmの場所(屋外や喚起された屋内など)で20分程動作させる。
- HDピンをGNDに7秒接続する。この瞬間が400ppmとして調整されます。
ゼロキャリブレーションは基本しなくて大丈夫です。数値が大幅におかしいと感じた時に試してみましょう!
接続するとこんな感じです。
(接続するコードが黒しかなくわかりずらいと思いますがお許しを(;^ω^))
※Tx、Rxは今回のプログラムに合わせて配置しているだけです。
空いているIOpinがあればそちらにしていただいても問題ないと思います。
・MH-Z19を起動させてみるとこんな感じに光ります↓
④「いよいよプログラミング」
・いよいよプログラミングですが、その前に今回はGitHbuで公開されているライブラリ、
「MHZ19_uart.h」というものを使わせて頂きますのでArduinoIDEにこちらのライブラリーを入れてください。
手順は簡単で、こちらからライブラリーをダウンロードして解凍します。
・解凍が終わりましたら「mhz19_uart-master」というフォルダーごと
「libraries」(C:\Users\…..\arduino\libraries)に入れるだけです。
後はArduinoIED起動させ、ファイルスケッチ例の中にmhz19_uartがあれば準備完了です。
・それでは今度こそプログラミングに入ります!
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 |
/*---------------------------------------------------------- MH-Z19 CO2センサーサンプルプログラム ----------------------------------------------------------*/ #include <MHZ19_uart.h> const int rx_pin = 4; //Serial rx pin no const int tx_pin = 5; //Serial tx pin no MHZ19_uart mhz19; /*---------------------------------------------------------- MH-Z19 CO2 sensor setup ----------------------------------------------------------*/ void setup() { Serial.begin(115200); pinMode(12, OUTPUT);//メッセージ用LEDなので無くても問題ありません。 mhz19.begin(rx_pin, tx_pin); mhz19.setAutoCalibration(false); Serial.print("MH-Z19 now warming up... status:"); Serial.println(mhz19.getStatus()); delay(1000); } /*---------------------------------------------------------- MH-Z19 CO2 sensor loop ----------------------------------------------------------*/ void loop() { int co2ppm = mhz19.getPPM(); int temp = mhz19.getTemperature(); digitalWrite(12, LOW); //CO2濃度出力 Serial.print("co2: "); Serial.println(co2ppm); //気温出力(おまけ機能ですが精度は悪いです) Serial.print("temp: "); Serial.println(temp); delay(5000); digitalWrite(12, HIGH); } |
5秒ごとにCO2を取得するプログラムです。
後はESP-WROOM02を書き込みモードにしてこのプログラムを書き込めば完了です!
ちなみにコード内にさり気なく記載してあります気温取得ですが、精度は悪く±3度くらいはありました!
※ビルドをした際に、こんなエラーが出たら書き込みモードになっていないのが原因です。
(GPIO 0(IO0)をLOWの状態で起動させるときのみ書き込みモード、LOWじゃなければ実行モードになります。)
改善されない場合はもう一度③「回路」を読み直してみてください。
2018/7/21追記
※シリアルモニターに変な暗号が表示されたり、何も表示されない場合、
シリアルモニターの右下にあるbpsが115200bpsになっているか確認してください。
※シリアルモニターが選択できない場合、まずツールの中にあります「シリアルポート:COM 」が選択されているか確認してください。
これが選択できない状態だたUSBケーブルが原因の可能性があります。USBケーブルは必ずデータ通信が可能なものを使用しましょう。
実行結果
・室内で取得した結果↓(誰もいないリビング)
約580ppmで快適と言えるでしょう。(気温は28度だったらしい)
・屋外で取得した結果↓(4階のベランダ)
約490ppmですので正常に機能してると言えるでしょう!
(気温は約21度とこの時期にしては寒かったのでわりと合ってたと思われます)
※取得には数十秒のタイムラグがあるようです。
ちなみに以前寝起きの寝室を測ってみたところ約2000ppmもあり驚きました!
どうも寝起きが今一悪いわけですねw 原因が特定できて良かったです。
窓を開けて寝たら目覚めが良くなり、CO2の存在は偉大だと実感しました!
このことから、屋内にいるときはこまめに換気をすることでCO2濃度を下げ、結果として作業の効率化に繋げることが可能です。
応用編↓
以上、ご訪問ありがとうございました^^
ご不明点などがございましたらお気軽にコメントくださいませ^^
9件のフィードバック