DIY空気質モニター自作:PM2.5、CO2、VOC、オゾン、温湿度をArduinoで測定
自分が吸っている空気の質が気になったことはありませんか?あるいは、オフィスで眠くなったり、一晩寝ても朝から疲れていたりする理由を考えたことは?空気質の悪化は多くの悪影響を及ぼし、疲労、頭痛、集中力低下、心拍数増加などの原因になります。空気質モニタリングはあなたが思っているより重要かもしれません。このチュートリアルでは、PM2.5、CO2、VOC、オゾン、さらに温度と湿度を測定できる自作空気質モニターの作り方を学びます。 動画または以下の記事をご覧ください。 各空気質パラメータが人体にどう影響するか、センサーの原理を説明します。このプロジェクトの頭脳はArduino Pro Miniボードで、2.8インチNextionタッチディスプレイと組み合わせて使いやすいUIを実現しています。 すべてのセンサー値をリアルタイム表示。特定のセンサーをタッチすると、過去24時間分の履歴データがグラフ表示されます。ディミング機能で画面輝度を下げたり完全に消灯したりも可能。寝室での夜間モニタリングに便利です。 夜間は画面を消灯し、翌朝各センサーの履歴を個別に確認できます。 それでは製作プロセス全体を順を追って解説します。この記事を読めば、あなたも自作できるようになります。 このデバイスには4つの主要空気質センサーを搭載。まずPMS5003でPM2.5(直径約2.5マイクロメートルの粒子状物質)を測定。粒子状物質は肺の奥深く、血流、脳まで到達し多くの健康被害を引き起こす最も有害な大気汚染形態です。 このセンサーはレーザー散乱原理で動作。内蔵ファンが制御された気流を作り、環境中の粒子を集光レーザービームに通します。 粒子が光を散乱させ、フォトダイオードが検出。マイクロプロセッサーがPM濃度に変換します。このセンサーの結果はかなり信頼性が高く、PM2.5のほかPM1とPM10も出力可能です。 次にMH-Z19でCO2(二酸化炭素)を測定。人間は呼吸でCO2を排出するため、室内濃度は容易に高くなります。高濃度では危険なだけでなく、眠気、疲労、生産性低下なども引き起こします。 非分散赤外線(NDIR)原理を使用。赤外線光源が測定対象の空気で満たされたチューブを通過し、反対側の光学フィルターとIR検出器で通過光量を測定。 空気中のCO2分子が特定波長のIR光を吸収し、他の波長は通過させる性質を利用。放出光量と受光量の差からCO2濃度を算出します。このセンサーもかなり正確な結果が得られます。 VOCとオゾン測定にはMP503とMQ-131ガスセンサーを使用。これらは加熱型金属酸化物センサーで、対象ガス存在時の抵抗変化を検出する原理です。 金属基板に特定電流を流し、存在ガス量に応じて抵抗が変化します。 MQ-131のターゲットガスはオゾンのみ。一般家庭では特定の空気清浄機、フェイシャルスチーマー、紫外線発生殺菌ランプなどから発生します。 一方MP503はアルコール、煙、イソブタン、メタナールなど複数のターゲットガスを持ちます。VOC(揮発性有機化合物)は洗剤、洗浄剤、芳香剤、塗料、化粧品など日常製品から放出される有機ガス。頭痛、目の刺激、皮膚反応、めまいなどを引き起こします。 回路図で全接続を確認しましょう。 必要なコンポーネント: 免責:これらはアフィリエイトリンクです。Amazonアソシエイトとして適格販売から収益を得ています。 正しい抵抗値:R1=1K、R2=2K、R6=100Kまたは1M、R7=1K PM2.5センサーはシリアルインターフェースでArduinoと通信。5V動作だがRXロジックレベルは3.3Vなので分圧器が必要。CO2センサーとNextionディスプレイもシリアル通信。VOCとオゾンセンサーはArduinoのアナログ入力で読み取り、DHT22はデジタルピン使用。2個のトランジスタでセンサーヒーターを制御。DS3231 RTCモジュールで時刻管理(I2C通信)。全デバイスはMini USBコネクターから5V給電。 関連記事:ベストArduinoスターターキット8選【2021年更新版】 すべてをブレッドボードで接続すると、多数の配線で大変なことになります。 そのため、このプロジェクトにはPCBが必須です。 PCB設計にはAltium Designerを使用。これが今回の動画スポンサーです。 Altium Designerは数十年の革新と開発の集大成で、真に統合された設計環境を実現。パワーと使いやすさの完璧なバランスで、市場で最も広く使われるPCB設計ソリューションの地位を確立しています。 Altium DesignerでこのプロジェクトのPCBを設計した過程を紹介します。まず回路図を作成。Altium Designerには基本電子部品の内蔵ライブラリがありますが、さらにメーカーから直接部品検索できる機能があり、コンポーネント調達が非常に便利です。 例として、Manufacturer Part Search機能でMini USBコネクターを検索。ここから3Dモデル、フットプリント、寸法などのデータにも簡単にアクセスできます。 独自コンポーネントライブラリも作成可能。このプロジェクトのほとんどのコンポーネントは自作しました。各パーツの3Dフットプリントを自作したかったためです。PCBフットプリント用3Dモデルは任意のCADソフトで作成し、.STEPファイルとして保存、Altium Designerにインポートできます。 回路図完成後、PCBを生成。コンポーネントを配置し、オートルート機能でワンクリックで全配線を自動生成。 必要なら手動調整も可能。設計ルール設定でオートルートの動作を制御、各ネットの幅指定なども可能。この時点で3D表示も確認でき、PCBアセンブリ全体の3Dファイルをエクスポートして後でケース設計に活用できます。 Altiumに教育コンテンツ支援をいただき感謝します。このソフトについて詳しく知りたい、試してみたい方は以下リンクをご覧ください。WebベースのAltium 365ビューアーでプロジェクトプレビューとファイル確認も可能です。 Altium Designer無料トライアル – https://www.altium.com/yt/howtomechatronics Altium Designerプロジェクトファイル: プロジェクトファイル、ライブラリ、電子部品3Dモデルの.STEPファイルを含むAltium Designerファイル: PCB Gerberファイル: PCB完成後、GerberファイルとNCドリルファイルを生成、単一zipファイルにまとめて製造発注準備完了。 発注はJCLPCB。zipファイルをドラッグ&ドロップでアップロードするとPCBの視覚情報がすべて表示されます。 希望プロパティを選択し、リーズナブルな価格で発注。 数日でPCB到着。品質は素晴らしく、設計通り完璧。 PCB実装開始。まず小さな部品から:抵抗と2個のトランジスタをハンダ付け。 次にArduino Pro Miniを実装。まずピンヘッダーをArduinoにハンダ付け。必要なピンはすべてではありませんが、A4、A5、DTRピンなど必要なものは漏れなく実装してください。同じレイアウトのArduino Pro Miniを使用してください(ピン配置が異なることがあります)。 DHT22センサーを実装。ピンを90度曲げてから挿入。ハンダ付け時に部品を固定するため、Blu-tack粘着剤を使うこともあります。 2個のコンデンサーは電源安定化用。電源はMini USBコネクターから5V供給。 電源コネクター真上に2個のスイッチをハンダ付け。1つはデバイス電源ON/OFF、もう1つはArduinoへスケッチ書き込み時用。USB-UARTインターフェース、ディスプレイ、PM2.5センサー、VOC、オゾン、CO2センサー用ピンヘッダーを実装。 DS3231 RTCモジュールも同様にピンを90度曲げてハンダ付け。バックアップ電池を装着すれば、メインPCB電源喪失時も時刻を保持。これでPCB完成。残るはPM2.5センサーとディスプレイ接続用ケーブルの準備。センサー付属ケーブルにオスピンヘッダーをハンダ付けしてPCBに接続しやすくしました。ディスプレイ接続用にはコネクター裏面に4本ワイヤーをハンダ付けし、PCBに接続。 これで空気質モニターのハードウェアは完成。あとはケースを作るだけ。Altium DesignerからエクスポートしたPCBアセンブリ全体の3DモデルをCADソフトにインポートし、ケースを設計。 SOLIDWORKSで最もシンプルなケースを設計。上下2パーツと数本のボルト・ナットのみの構成。透明アクリル板で製作しました。PCBとコンポーネントが見える見た目が好きだからです。DIYプロジェクトをアピールするのにも最適。 このDIY空気質モニター3DモデルはThangsでダウンロード、ブラウザ探索可能: Thangsで3Dモデルをダウンロード。 使用するアクリル板は4mm厚で、ディスプレイにぴったりフィット。CNCマシンがないため、金属用手ノコで手動カット。 ディスプレイ開口部は、まずドリルで2箇所穴あけ、ミニノコギリの刃を通して慎重に切り出し。ヤスリで形状を整え。3mmドリルでPCB固定用と上下プレート連結用のすべての穴あけ。 ここでアクリルの保護フィルムを剥がします。これが意外と満足感のある作業。PCBをベースプレートにM3ボルト・ナットで固定。PM2.5センサー固定にはM2ボルトを使用。 スペーサーナットで上下プレートを連結。オス・メスペアのスペーサーナットを使えば、希望のプレート間距離を簡単に確保できます。 個人的にこのケースはかなり気に入っています。見た目も良く、センサー周りに空気がスムーズに循環する機能性も備えています。 デバイスに電源を入れ、プログラムを書き込みます。Mini USBコネクターから5V給電。5V USBアダプター、スマホ充電器、モバイルバッテリーなどから給電可能。 Arduino Pro Miniへのスケッチ書き込みにはUSB-シリアルUARTインターフェースが必要。プログラミングヘッダーに接続。PCのUSBに接続する前に、必ずデバイス本体のメイン電源をONにしてください。PCのUSB電源は500mAのみで、正常動作に十分でない可能性があるため。Arduinoスケッチ書き込み時は、PCB上の書き込みスイッチもONにしてください。 ArduinoコードとNextionディスプレイプログラムはこちらからダウンロード: Arduino IDEでArduino Pro Miniにスケッチを書き込むには、まずボード選択でこのボードを選び、プロセッサーバージョンを適切に選択、ポート選択、書き込み方式を「USBasp」に設定。 Arduinoへのコード書き込み後、Nextionディスプレイにもプログラムを書き込む必要があります。Nextionディスプレイには内蔵ARMコントローラーがあり、ディスプレイを独立制御します。 ボタン、テキスト、画像、変数などすべてのグラフィック要素はディスプレイ側で生成・制御。専用のNextion Editorでこれらを作成します。ディスプレイとArduinoはシリアル通信(2線)でやり取り。Arduinoはセンサー値をディスプレイへ送信し、ディスプレイは必要時にデータをArduinoへ送信。 ディスプレイプログラム書き込みにはmicroSDカードが必要。Nextion Editorから出力される.TFTファイルを保存。 電源OFF状態でmicroSDカードをディスプレイのカードスロットに挿入。電源ONでプログラムがディスプレイに書き込まれます。カードを抜き、再度電源ONすれば空気質モニターが動作開始。 各センサー用ライブラリ(MHZ19、PMS、MQ131、DHT、DS3231)を使用。各センサーのデータ読み取り方法を理解するには、ライブラリのドキュメントとサンプルを試すことを推奨します。 MH-Z19とPMS5003がシリアル通信を使用するためSoftwareSerialライブラリを使用。ArduinoとNextionディスプレイの通信にはハードウェアシリアル(デフォルト)を使用。 Arduinoがセンサーを読み取り、データをNextionディスプレイへ送信。例: Nextion側に「tempV」という変数があり、その値を更新するには「tempV.val=22」のようなコマンドを送信。変数名、".val"、値の順。最初の2行でこれを実行し、3つのユニークなwriteコマンド(0xff 0xff 0xff)でコマンド終了を知らせます。 Nextionディスプレイプログラムにはタイマーがあり、Arduinoのloop同様に継続的に画面数値を更新。 このタイマーイベントで、センサー値に応じて背景色を変更するコードも実装。 2ページ目には波形グラフがあり、Arduinoに蓄積された履歴値を取得して表示。時間軸とY軸値もArduinoから取得。 波形グラフ上とメイン画面の数値上には「Hotspots」と呼ばれる透明ボタンが配置され、タッチ操作を受け付けます。波形上のホットスポットを押すとイベントで「page 0」に戻る動作になります。 全体的に、このArduino空気質モニターのプログラムはこう動作します。完全に理解するには、各センサーのライブラリ動作とNextionディスプレイの仕組みを学ぶ必要があります。 ※VOCセンサーは生データ(アナログ値0〜1024)のみ読み取り、ppm/ppb値ではありません。値が高いほどVOC存在を示します。 オゾンセンサーでより正確な出力を得るには、ライブラリのキャリブレーション例に従い この動画/記事を楽しんで学んでいただけたら幸いです。Patreonでの支援も検討いただけると励みになります。質問はコメント欄で、Arduinoプロジェクト集もご覧ください。概要


PM2.5センサー – PMS5003


CO2センサー – MH-Z19


VOCとオゾンセンサー – MP503とMQ-131


DIY Arduino空気質モニター 回路図


Arduino空気質モニター用PCB製作




Altium 365ビューアー: https://www.altium.com/viewer

PCB実装






空気質モニターケース製作




プログラミング





コード解説

Serial.print("tempV.val="); Serial.print(temp); Serial.write(0xff); Serial.write(0xff); Serial.write(0xff);

setTimeToRead()とsetR0()を正しく設定する必要があります。ただしsetTimeToReadを長くするとサンプリング中にプログラムがブロックされ、他の処理がフリーズします。回避策もありますが、本当に必要でない限りオゾンセンサーは使用しないことを推奨します。
製造プロセス
- Raspberry Piで構築する空気質・気象ステーション:InfluxDB & Grafana活用
- OpenSensorsで空気質を測定: ArduinoとPythonによるガイド
- Heliumベースのソーラー駆動空気質センサー:設計と導入ガイド
- Arduinoで作るモニター用Ambilightシステム:没入感アップの自作ガイド
- K30 CO2センサで室内空気質をリアルタイム監視する
- Arduinoとスマホで作るスマート電圧計 – 簡単DIYプロジェクト
- ArduinoとMAX30100で作るリアルタイムIoT心拍数モニター
- Arduino Dueと3.2インチTFTで作る温度監視付きリアルタイムクロック
- Arduino、Google Cardboard、Bluetoothで作るDIY VRスケートボード
- シャープGP2Y1010AU0Fセンサーで作る高精度空気質モニター
- DIY ArduinoラジオニクスEMR治療デバイスの構築