### 4.3.8 PM2.5 ダスト検出 #### 4.3.8.1 概要 ![Img](./media/top1.png) PM2.5 ダスト検出では、レーザー式粉塵計を使用して空気中のPM2.5濃度を測定します。微粒子を捕集してその成分を分析しながら、粉塵濃度を連続的に監視できます。空気力学的直径が2.5マイクロメートル未満の粒子をPM2.5と呼びます。粒径が小さくなるほど、呼吸器系への取り込み率が高くなります。 このプロジェクトでは、micro:bit ボード、PM2.5ダストセンサ、OLEDディスプレイ、噴霧(atomization)モジュール、オンボードスピーカーを使ってPM2.5ダスト検出システムを構築します。PM2.5ダストセンサが空気中のPM2.5粒子を検出し、OLEDは検出されたPM2.5値をリアルタイムで表示します。値が閾値に達するとスピーカーがアラームを鳴らし、噴霧モジュールが水霧を噴射して粉塵を抑制します。 ![Img](./media/bottom1.png) #### 4.3.8.2 コンポーネントの知識 ![Img](./media/2top.png) **PM2.5 ダストセンサ** ![Img](./media/PM2.5.png) このPM2.5ダストセンサはGP2Y1014AU0Fチップを搭載しており、タバコの煙のような直径0.8μm以上の極めて微細な粒子を効果的に検出できます。赤外LEDとフォトトランジスタが斜めに配置され、空気中の粉塵の反射光を検出します。超低消費電力(最大20mA、典型11mA)を特徴とし、アナログ電圧出力は粉塵密度と線形に変化するため、空気清浄機、空調の空気モニタ、PM2.5検出器などに広く応用されています。 ⚠️ **注意: GP2Y1014AU0Fチップ搭載のPM2.5ダストセンサは、比較的正確な測定値を得るために電源投入後少なくとも30秒~2分の予熱時間が必要です。** **仕様:** - 電源電圧: DC 5 ~ 7V - 動作電流: 20mA(Max) - 最小検出粒子径: 0.8μm - 感度: 0.5V/(0.1mg/m³) - クリーンエア時電圧: 0.9V (typical) - 動作温度: -10℃~65℃ ![Img](./media/2bottom.png) #### 4.3.8.3 必要部品 | ![Img](./media/microbitV2.png)|![Img](./media/ExpansionBoard.png)|![Img](./media/Atomization1.png)| | :--: | :--: | :--: | | micro:bit V2 メインボード ×1 | micro:bit シールド ×1 |噴霧モジュール ×1| |![Img](./media/PM2.5-1.png)|![Img](./media/OLED.png)| ![Img](./media/AAbattery.png)| |PM2.5 ダストセンサ ×1|OLEDディスプレイ ×1 |AA電池(**自分で用意**) ×6| |![Img](./media/batterycase.png) |![Img](./media/4pin.png)|![Img](./media/3pin.png)| |電池ホルダー ×1|4ピンケーブル ×2 |3ピンケーブル ×1 | |![Img](./media/usb.png) | | | | micro USB ケーブル ×1 | | | #### 4.3.8.4 配線図 ⚠️ **配線の際は、ワイヤーの色にご注意ください。** | PM2.5 ダストセンサ | ワイヤー色 | micro:bit シールド ピン | micro:bit ボード ピン | | :---------------: | :--------: | :------------------: | :-----------------: | | GND | 黒 | G | G | | VCC | 赤 | V2 | V | | LED | 青 | 1 | P1 | | OUT | 緑 | 2 | P2 | | OLED ディスプレイ | ワイヤー色 | micro:bit シールド ピン | micro:bit ボード ピン | | :----------: | :--------: | :------------------: | :-----------------: | | GND | 黒 | G | G | | VCC | 赤 | V2 | V | | SDA | 青 | 20 | P20 | | SCL | 緑 | 19 | P19 | | 噴霧モジュール | ワイヤー色 | micro:bit シールド ピン | micro:bit ボード ピン | | :----------------: | :--------: | :------------------: | :-----------------: | | G | 黒 | G | G | | V | 赤 | V2 | V | | S | 黄 | 16 | P16 | ![Img](./media/couj8.png) #### 4.3.8.5 コードフロー ![Img](./media/flow-chart-08.png) #### 4.3.8.6 テスト用コード ⚠️ **ヒント1: micro:bit ボードにコードをダウンロードする前に、ライブラリファイル “oled_ssd1306\.py” をインポートしてください。参照: ** “[Import Library on MU](https://docs.keyestudio.com/projects/KS4050/en/latest/docs/MicroPython/MU_development_environment.html#import-library-on-mu)” . ![Img](./media/WPSA1.png) ⚠️ **ヒント2: if() 条件の閾値 500 は、実際の状況に応じて変更できます。** **完全なコード:** ```Python ''' Theme: PM2.5 dust detection Function: OLED displays the amount of PM2.5 dust and the PM2.5 dust sensor controls the micro:bit 5×5 dot matrix, speaker and atomization module Compiling IDE: MU 1.2.0 Author: https://docs.keyestudio.com ''' # import related libraries from microbit import * from oled_ssd1306 import * import music import time # initialize and clear oled initialize() clear_oled() # Pin configuration led_Pin = pin1 out_Pin = pin2 pin16.write_digital(1) # set P16 pin to high level # Time parameter delayTime = 280 delayTime2 = 40 offTime = 9680 def microsecond_delay(us): """Precise microsecond delay""" start = time.ticks_us() while time.ticks_diff(time.ticks_us(), start) < us: pass while True: # Measurement sequence led_Pin.write_digital(0) # LED OFF microsecond_delay(delayTime) # 280μs dustVal = out_Pin.read_analog() # Read the sensor microsecond_delay(delayTime2) # 40μs led_Pin.write_digital(1) # LED ON microsecond_delay(offTime) # 9680μs # Calculation and display if dustVal > 36.455: # The exact same calculation formula voltage = dustVal / 1024.0 pm25 = (voltage - 0.0356) * 120000 * 0.035 # OLED displays detailed information add_text(0, 0, "PM2.5 dust: ") # Display the value of PM2.5 in the corresponding position of OLED add_text(0, 2, str(round(pm25)) + " ug/m3") # Display the value of PM2.5 in the corresponding position of OLED # Quality indication if pm25 > 500 : # PM2.5 value > 500 display.show(Image.SAD) # LED matrix displays a sad pattern music.play("E5:4") # speaker plays E5 tone sleep(1000) pin16.write_digital(0) # set P16 pin to low level sleep(200) pin16.write_digital(1) # set P16 pin to high level sleep(3000) pin16.write_digital(0) # set P16 pin to low level sleep(200) pin16.write_digital(1) # set P16 pin to high level sleep(1000) else: # or display.show(Image.HAPPY) # LED matrix displays a happy pattern music.reset() # no tone pin16.write_digital(1) # set P16 pin to high level else: print("Low value:", dustVal) display.show(Image.NO) # delay 0.2s sleep(200) clear_oled() # clear OLED ``` ![Img](./media/line1.png) **簡単な説明:** ① microbit、oled_ssd1306、music、time のライブラリをインポートします。 ```Python from microbit import * from oled_ssd1306 import * import music import time ``` ② OLED を初期化し、クリアします。 ```Python initialize() clear_oled() ``` ③ PM2.5 ダストセンサのピンを初期化します。 ```Python led_Pin = pin1 out_Pin = pin2 ``` ④ 噴霧モジュールをピン P16 に接続し、初期状態をオフにします。 ```Python pin16.write_digital(1) ``` ⑤ 時間変数の初期値を設定します。 ```Python delayTime = 280 delayTime2 = 40 offTime = 9680 ``` ⑥ マイクロ秒遅延用のサブ関数を定義します。 ```Python def microsecond_delay(us): """Precise microsecond delay""" start = time.ticks_us() while time.ticks_diff(time.ticks_us(), start) < us: pass ``` ⑦ PM2.5 ダストセンサの測定タイミング制御を設定します。これは主に空気中の粉塵濃度を検出するために使用します。 ```Python led_Pin.write_digital(0) # LED OFF microsecond_delay(delayTime) # 280μs dustVal = out_Pin.read_analog() # Read the sensor microsecond_delay(delayTime2) # 40μs led_Pin.write_digital(1) # LED ON microsecond_delay(offTime) # 9680μs ``` ⑧ 判定文: if()...else... PM2.5 のアナログ値が 36.455 を超えた場合、濃度値を計算して OLED に表示します。 それ以外の場合は、シリアルモニタに対応する粉塵アナログ値を出力します。 ```Python if dustVal > 36.455: # The exact same calculation formula voltage = dustVal / 1024.0 pm25 = (voltage - 0.0356) * 120000 * 0.035 # OLED displays detailed information add_text(0, 0, "PM2.5 dust: ") # Display the value of PM2.5 in the corresponding position of OLED add_text(0, 2, str(round(pm25)) + " ug/m3") # Display the value of PM2.5 in the corresponding position of OLED else: print("Low value:", dustVal) display.show(Image.NO) ``` ⑨ 判定文: if()...else... 検出されたPM2.5粉塵の濃度が500 μg/m³を超えると、5×5 LEDマトリクスは ![Img](./media/ab2.png) を表示し、スピーカーがアラームを鳴らします。1秒後に噴霧モジュールが水霧を噴射します。 それ以外の場合は、5×5 LEDは ![Img](./media/ab3.png) を表示し、スピーカーは鳴らず、噴霧モジュールは動作しません。 ```Python if pm25 > 500 : # PM2.5 value > 500 display.show(Image.SAD) # LED matrix displays a sad pattern music.play("E5:4") # speaker plays E5 tone sleep(1000) pin16.write_digital(0) # set P16 pin to low level sleep(200) pin16.write_digital(1) # set P16 pin to high level sleep(3000) pin16.write_digital(0) # set P16 pin to low level sleep(200) pin16.write_digital(1) # set P16 pin to high level sleep(1000) else: # or display.show(Image.HAPPY) # LED matrix displays a happy pattern music.reset() # no tone pin16.write_digital(1) # set P16 pin to high level ``` #### 4.3.8.7 テスト結果 ![Img](./media/4top.png) 配線後に micro USB ケーブルで給電し、さらに十分な電源を確保するために外部電源(単3電池6本)を接続し、「Flash」をクリックしてコードを micro:bit ボードにダウンロードします。 ![Img](./media/A130.png) テストコードをアップロードしたら、micro:bit の背面にあるリセットボタンを押します。 ![Img](./media/A455.png) 室内の床を掃く、ライターの火花をつける、安全に少量の紙を燃やすなどして明確なPM2.5粒子を発生させると、PM2.5ダストセンサがそれらを検出し、その濃度がOLEDにリアルタイムで表示されます。 検出されたPM2.5粉塵濃度が500 μg/m³を超えると、5×5 LEDマトリクスは ![Img](./media/ab2.png) を表示し、スピーカーがアラームを鳴らします。1秒後に噴霧モジュールが水霧を噴射します。そうでない場合は、5×5 LEDは ![Img](./media/ab3.png) を表示し、スピーカーは鳴らず、噴霧モジュールは作動しません。 | OLED に表示される値 | 空気の状態 | | :---------------------: | :---------: | | 0-75 | 優良 | | 75-150 | 良好 | | 150-300 | 普通 | | 300-1050 | 注意 | | 1050-3000 | 悪い | | 3000 + | 非常に悪い | ![Img](./media/dongtu-8.gif) ⚠️ **注意: 実験で使用されているビルディングブロックは本キットに含まれていません。** (**Tip:** 結果が観察できない場合は、micro:bit ボードのリセットボタンを押してください。) ![Img](./media/4bottom.png)