- 必要なコンポーネント
- PM2.5およびPM10を測定するためのNovaPMセンサーSDS011
- 0.96フィートOLEDディスプレイモジュールの基本
- 一酸化炭素(CO)を測定するためのMQ-7センサーの準備
- 大気質指数の計算
- 回路図
- パフォーマンスボード上に大気質監視システム回路を構築する
- AdafruitIOのセットアップ
- のコード説明
- AQIモニタリングシステム用の3Dプリントケーシング
- AQIモニタリングシステムのテスト
冬が始まると、私たちの上にぶら下がっている空気は、燃えている畑、工業工場、および車両の交通からの煙とガスの排出で厚くなり、太陽を遮り、呼吸を困難にします。専門家は、高レベルの大気汚染とCOVID-19パンデミックは、深刻な結果をもたらす可能性のある危険な組み合わせになる可能性があると述べています。大気質のリアルタイム監視の必要性は非常に明白です。
そのため、このプロジェクトでは、Nova PM SDS011センサー、MQ-7センサー、およびDHT11センサーを使用してESP32大気質監視システムを構築します。また、OLEDディスプレイモジュールを使用して大気質の値を表示します。インドの大気質指数(AQI)は、PM10、PM2.5、SO2およびNO2、CO、オゾン、NH3、およびPbの8つの汚染物質に基づいています。ただし、すべての汚染物質を測定する必要はありません。そこで、PM2.5、PM10、一酸化炭素の濃度を測定して、大気質指数を計算します。AQI値はAdafruitIOで公開されるため、どこからでも監視できます。以前は、Arduinoを使用してLPG、煙、およびアンモニアガスの濃度も測定しました。
必要なコンポーネント
- ESP32
- NovaPMセンサーSDS011
- 0.96'SPIOLEDディスプレイモジュール
- DHT11センサー
- MQ-7センサー
- ジャンパー線
PM2.5およびPM10を測定するためのNovaPMセンサーSDS011
SDS011センサーは、NovaFitnessによって開発されたごく最近の大気質センサーです。レーザー散乱の原理に基づいて動作し、空気中の粒子濃度を0.3〜10μmにすることができます。このセンサーは、小さなファン、吸気バルブ、レーザーダイオード、およびフォトダイオードで構成されています。空気は、光源(レーザー)が粒子を照らす空気入口から入り、散乱光は光検出器によって信号に変換されます。次に、これらの信号が増幅および処理されて、PM2.5およびPM10の粒子濃度が取得されます。以前、ArduinoでNova PMセンサーを使用して、PM10とPM2.5の濃度を計算しました。
SDS011センサーの仕様:
- 出力:PM2.5、PM10
- 測定範囲:0.0-999.9μg/ m3
- 入力電圧:4.7V〜5.3V
- 最大電流:100mA
- スリープ電流:2mA
- 応答時間:1秒
- シリアルデータ出力頻度:1回/秒
- 粒子径分解能:≤0.3μm
- 相対誤差:10%
- 温度範囲:-20〜50°C
0.96フィートOLEDディスプレイモジュールの基本
OLED(有機発光ダイオード)は、有機化合物を使用して作られた発光ダイオードの一種で、電流を流すと励起されます。これらの有機化合物は独自の光を持っているため、通常のLCDのようなバックライト回路は必要ありません。このため、OLEDディスプレイ技術は電力効率が高く、テレビやその他のディスプレイ製品で広く使用されています。
ディスプレイの色、ピン数、サイズ、コントローラーICに基づいて、さまざまなタイプのOLEDが市場に出回っています。このチュートリアルでは、幅128ピクセル、長さ64ピクセルのモノクロブルー7ピンSSD13060.96インチOLEDモジュールを使用します。この7ピンOLEDはSPIプロトコルをサポートし、コントローラーICSSD1306はOLEDが受信した文字を表示するのに役立ちます。リンクをたどって、OLEDとさまざまなマイクロコントローラーとのインターフェースの詳細をご覧ください。
一酸化炭素(CO)を測定するためのMQ-7センサーの準備
MQ-7 CO一酸化炭素ガスセンサーモジュールは、空気中のCO濃度を検出します。センサーは10〜10,000ppmの濃度を測定できます。 MQ-7センサーは、モジュールとして購入することも、センサーのみとして購入することもできます。これまで、さまざまな種類のガスセンサーを使用してさまざまなガスを検出および測定してきましたが、興味がある場合はそれらを確認することもできます。このプロジェクトでは、MQ-7センサーモジュールを使用して、PPMの一酸化炭素濃度を測定しています。 MQ-7ボードの回路図を以下に示します。
負荷抵抗RLは、センサーを機能させる上で非常に重要な役割を果たします。この抵抗器は、ガスの濃度に応じて抵抗値を変化させます。MQ-7センサーボードには1KΩの負荷抵抗が付いていますが、これは役に立たず、センサーの読み取り値に影響します。したがって、適切なCO濃度値を測定するには、1KΩの抵抗を10KΩの抵抗に交換する必要があります。
大気質指数の計算
インドのAQIは、標準時間間隔(ほとんどの汚染物質で24時間、一酸化炭素とオゾンで8時間)で測定された特定の汚染物質の平均濃度に基づいて計算されます。たとえば、PM2.5とPM10のAQIは24時間の平均濃度に基づいており、一酸化炭素のAQIは8時間の平均濃度に基づいています。 AQIの計算には、PM10、PM2.5、二酸化窒素(NO 2)、二酸化硫黄(SO 2)、一酸化炭素(CO)、地表オゾン(O 3)、アンモニア(NH 3)、の8つの汚染物質が含まれます。および鉛(Pb)。ただし、すべての汚染物質がすべての場所で測定されるわけではありません。
汚染物質の測定された24時間の周囲濃度に基づいて、濃度の線形関数であるサブインデックスが計算されます(たとえば、PM2.5のサブインデックスは濃度31 µg / m3で51、濃度で100になります) 60 µg / m3、および45 µg / m3の濃度で75)。最悪のサブインデックス(またはすべてのパラメーターの最大値)が全体的なAQIを決定します。
回路図
IoTベースの大気質監視システムの回路図は非常に単純で、以下に示します。
SDS011センサー、DHT11、およびMQ-7センサーは+ 5Vで給電され、OLEDディスプレイモジュールは3.3Vで給電されます。SDS011の送信機と受信機のピンはESP32のGPIO16と17に接続されています。MQ-7センサーのアナログ出力ピンはGPIO25に接続され、DHT11センサーのデータピンはGPIO27センサーに接続されます。OLEDディスプレイモジュールはSPI通信を使用するため、OLEDモジュールとESP32の間にSPI通信を確立しました。以下の表に接続を示します。
S.No |
OLEDモジュールピン |
ESP32ピン |
1 |
GND |
接地 |
2 |
VCC |
5V |
3 |
D0 |
18 |
4 |
D1 |
23 |
5 |
RES |
2 |
6 |
DC |
4 |
7 |
CS |
5 |
S.No |
SDS011ピン |
ESP32ピン |
1 |
5V |
5V |
2 |
GND |
GND |
3 |
処方箋 |
17 |
4 |
TX |
16 |
S.No |
DHTピン |
ESP32ピン |
1 |
Vcc |
5V |
2 |
GND |
GND |
3 |
データ |
27 |
S.No |
MQ-7ピン |
ESP32ピン |
1 |
Vcc |
5V |
2 |
GND |
GND |
3 |
A0 |
25 |
パフォーマンスボード上に大気質監視システム回路を構築する
メイン画像からわかるように、アイデアは3Dプリントケーシング内でこの回路を使用することでした。したがって、上記の完全な回路はパフォーマンスボードにはんだ付けされています。OLEDとセンサーを取り付けるのに十分な距離を残すためにワイヤーを使用するようにしてください。私のパフォーマンスボードはOLEDとセンサーモジュールにはんだ付けされています。
AdafruitIOのセットアップ
Adafruit IOは、クラウド上のライブデータを集約、視覚化、分析できるオープンデータプラットフォームです。Adafruit IOを使用すると、インターネット経由でデータをアップロード、表示、監視し、プロジェクトをIoT対応にすることができます。Adafruit IOを使用して、モーターを制御し、センサーデータを読み取り、インターネット経由でクールなIoTアプリケーションを作成できます。
Adafruit IOを使用するには、最初にAdafruitIOでアカウントを作成します。これを行うには、Adafruit IO Webサイトにアクセスし、画面の右上にある[Get Started forFree]をクリックします。
アカウント作成プロセスが終了したら、アカウントにログインし、右上隅にある[View AIO Key]をクリックして、アカウントのユーザー名とAIOキーを取得します。
「AIOキー」をクリックすると、Adafruit IOAIOキーとユーザー名を含むウィンドウがポップアップ表示されます。このキーとユーザー名をコピーすると、コードで使用されます。
ここで、AIOキーを取得した後、DHTセンサーデータを保存するためのフィードを作成します。フィードを作成するには、[フィード]をクリックします。次に、[アクション]をクリックし、使用可能なオプションから[新しいフィードを作成]を選択します。
この後、フィードの名前と説明を入力する必要がある新しいウィンドウが開きます。説明の記述はオプションです。
この後、[作成]をクリックします。新しく作成されたフィードにリダイレクトされます。
このプロジェクトでは、PM10、PM2.5、CO、温度、湿度、およびAQI値の合計6つのフィードを作成しました。上記と同じ手順に従って、残りのフィードを作成します。
フィードを作成したら、センサーデータを1ページに視覚化するAdafruitIOダッシュボード機能を作成します。そのためには、まずダッシュボードを作成してから、これらすべてのフィードをそのダッシュボードに追加します。
ダッシュボードを作成するには、[ダッシュボード]オプションをクリックし、[アクション]をクリックしてから、[新しいダッシュボードの作成]をクリックします。
次のウィンドウで、ダッシュボードの名前を入力し、[作成]をクリックします。
ダッシュボードが作成されたら、GaugeやSliderなどのAdafruitIOブロックを使用してデータを視覚化します。ブロックを追加するには、右上隅の「+」をクリックします。
次に、「ゲージ」ブロックを選択します。
次のウィンドウで、視覚化するフィードデータを選択します。
最後のステップで、ブロック設定を変更してカスタマイズします。
次に、上記と同じ手順に従って、残りのフィードに視覚化ブロックを追加します。私のAdafruitIOダッシュボードは次のようになりました。
のコード説明
このプロジェクトの完全なコードは、ドキュメントの最後に記載されています。ここでは、コードのいくつかの重要な部分について説明します。
このコードは、SDS011、Adafruit_GFX、 Adafruit_SSD1306、 Adafruit_MQTT、およびDHT.hライブラリを使用します。SDS011、Adafruit_GFX、およびAdafruit_SSD1306ライブラリは、ArduinoIDEのライブラリマネージャーからダウンロードしてそこからインストールできます。そのためには、Arduino IDEを開き、 Sketch <Include Library <ManageLibrariesに 移動し ます 。次に、SDS011を検索し、R。ZschiegnerによるSDSセンサーライブラリをインストールします。
同様に、AdafruitのAdafruitGFXおよびAdafruitSSD1306ライブラリをインストールします。Adafruit_MQTT.hおよびDHT11.hは、指定されたリンクからダウンロードできます。
ライブラリをArduinoIDEにインストールした後、必要なライブラリファイルを含めてコードを開始します。
#include
次の行で、OLEDディスプレイの幅と高さを定義します。このプロジェクトでは、128×64のSPIOLEDディスプレイを使用しました。あなたは変更することができ SCREEN_WIDTH 、および SCREEN_HEIGHTの ディスプレイに応じて変数を。
#define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64
次に、OLEDディスプレイが接続されているSPI通信ピンを定義します。
#define OLED_MOSI 23 #define OLED_CLK 18 #define OLED_DC 4 #define OLED_CS 5 #define OLED_RESET 2
次に、前に定義した幅と高さ、およびSPI通信プロトコルを使用してAdafruitディスプレイのインスタンスを作成します。
Adafruit_SSD1306ディスプレイ(SCREEN_WIDTH、SCREEN_HEIGHT、OLED_MOSI、OLED_CLK、OLED_DC、OLED_RESET、OLED_CS);
次に、AdafruitIOサーバーからコピーしたWiFiおよびAdafruitIOの資格情報を含めます。これらには、MQTTサーバー、ポート番号、ユーザー名、およびAIOキーが含まれます。
const char * ssid = "Galaxy-M20"; const char * pass = "ac312124"; #define MQTT_SERV "io.adafruit.com" #define MQTT_PORT 1883 #define MQTT_NAME "choudharyas" #define MQTT_PASS "988c4e045ef64c1b9bc8b5bb7ef5f2d9"
次に、センサーデータを保存するためのAdafruitIOフィードを設定します。私の場合、さまざまなセンサーデータを保存するために、AirQuality、Temperature、Humidity、PM10、PM25、およびCOの6つのフィードを定義しました。
Adafruit_MQTT_Client mqtt(&client、MQTT_SERV、MQTT_PORT、MQTT_NAME、MQTT_PASS); Adafruit_MQTT_Publish AirQuality = Adafruit_MQTT_Publish(&mqtt、MQTT_NAME "/ f / AirQuality"); Adafruit_MQTT_Publish Temperature = Adafruit_MQTT_Publish(&mqtt、MQTT_NAME "/ f / Temperature"); Adafruit_MQTT_Publish Humidity = Adafruit_MQTT_Publish(&mqtt、MQTT_NAME "/ f / Humidity"); Adafruit_MQTT_Publish PM10 = Adafruit_MQTT_Publish(&mqtt、MQTT_NAME "/ f / PM10"); Adafruit_MQTT_Publish PM25 = Adafruit_MQTT_Publish(&mqtt、MQTT_NAME "/ f / PM25"); Adafruit_MQTT_Publish CO = Adafruit_MQTT_Publish(&mqtt、MQTT_NAME "/ f / CO");
ここで、 setup() 関数内で、デバッグ目的でシリアルモニターを9600のボーレートで初期化します。また、 begin() 関数を使用して、OLEDディスプレイ、DHTセンサー、およびSDS011センサーを初期化します。
void setup(){my_sds.begin(16,17); Serial.begin(9600); dht.begin(); display.begin(SSD1306_SWITCHCAPVCC);
セットアップ 関数内の forループ は、定義された数までの値を収集し、カウンターをゼロに設定するために使用されます。
for(int thisReading1 = 0; thisReading1 <numReadingsPM10; thisReading1 ++){readingsPM10 = 0; }
センサー値の読み取り:
ループ関数内で、 millis() メソッドを使用して、1時間ごとにセンサー値を読み取ります。各ガスセンサーは、 0〜4095の アナログ値を出力します。この値を電圧に変換するには、次の式を使用します 。RvRo= MQ7Raw *(3.3 / 4095); ここで、 MQ7Raw は、センサーのアナログピンからのアナログ値です。また、SDS011センサーからPM2.5とPM10の読み取り値を読み取ります。
if((unsigned long)(currentMillis-previousMillis)> =間隔){MQ7Raw = analogRead(iMQ7); RvRo = MQ7Raw *(3.3 / 4095); MQ7ppm = 3.027 * exp(1.0698 *(RvRo)); Serial.println(MQ7ppm); エラー= my_sds.read(&p25、&p10); if(!error){Serial.println( "P2.5:" + String(p25)); Serial.println( "P10:" + String(p10)); }}
値の変換:
PM2.5とPM10の値が既にμgの/ Mである3が、我々は、Mg / mのPPMから一酸化炭素値を変換する必要がある3。変換式は次のとおりです。
濃度(mg / m 3)=濃度(PPM)×(分子質量(g / mol)/モル体積(L))
ここで、COの分子量は28.06 g / mol、モル体積は25 ℃で24.45Lです。
ConcentrationINmgm3 = MQ7ppm *(28.06 / 24.45); Serial.println(ConcentrationINmgm3);
24時間平均の計算:
次に、次の行で、PM10、PM2.5の読み取り値の24時間平均、および一酸化炭素の読み取り値の8時間平均を計算します。コードの最初の行で、現在の合計を取得し、配列の最初の要素を減算します。これを新しい合計として保存します。最初はゼロになります。次に、センサー値を取得し、現在の読み取り値を合計に追加して、数値インデックスを増やします。インデックスの値がnumReadings以上の場合は、インデックスをゼロに戻します。
totalPM10 = totalPM10-readingsPM10; 読み取り値PM10 = p10; totalPM10 = totalPM10 + readingsPM10; readIndexPM10 = readIndexPM10 + 1; if(readIndexPM10> = numReadingsPM10){readIndexPM10 = 0; }
次に、最後に、これらの値をAdafruitIOで公開します。
if(!Temperature.publish(temperature)){delay(30000); } if(!Humidity.publish(humidity)){delay(30000); ………………………………………………………。………………………………………………………。
AQIモニタリングシステム用の3Dプリントケーシング
次に、バーニアを使用してセットアップの寸法を測定し、さらにセンサーとOLEDの寸法を測定してケーシングを設計しました。私のデザインは、完成すると次のようになりました。
デザインに満足したら、STLファイルとしてエクスポートし、プリンターの設定に基づいてスライスし、最後に印刷しました。この場合も、STLファイルはThingiverseからダウンロードでき、それを使用してケーシングを印刷できます。
印刷が終わった後、私は恒久的な囲いの中に設置されたプロジェクトを組み立てて施設に設置しました。完全に接続されたので、回路をケーシングに組み立てました。ここに表示されているように、すべてがうまく適合しました。
AQIモニタリングシステムのテスト
ハードウェアとコードの準備ができたら、デバイスをテストします。デバイスに電力を供給するために、外部12V1Aアダプターを使用しました。ご覧のとおり、デバイスはOLEDディスプレイにPM10、PM2.5、および一酸化炭素の濃度を表示します。PM2.5とPM10の濃度はμgの/ mである3一酸化炭素の濃度は、Mg / Mにあるとき3。
これらの測定値は、AdafruitIOダッシュボードでも公開されます。すべてのパラメーター(PM10、PM2.5、およびCO)の最大値がAQIになります。
過去30日間のAQI値がグラフとして表示されます。
これは、SDS011およびMQ-7センサーを使用して大気質指数を計算する方法です。プロジェクトの完全な作業は、以下にリンクされているビデオでも見ることができます。あなたがプロジェクトを楽しんで、あなた自身のものを作るのが面白いと思ったことを願っています。ご不明な点がございましたら、下のコメント欄にご記入ください。