### 4.3.8 PM2.5 ダスト検出
#### 4.3.8.1 概要

PM2.5 ダスト検出では、レーザー式粉塵計を使用して空気中のPM2.5濃度を測定します。微粒子を捕集してその成分を分析しながら、粉塵濃度を連続的に監視できます。空気力学的直径が2.5マイクロメートル未満の粒子をPM2.5と呼びます。粒径が小さくなるほど、呼吸器系への取り込み率が高くなります。
このプロジェクトでは、micro:bit ボード、PM2.5ダストセンサ、OLEDディスプレイ、噴霧(atomization)モジュール、オンボードスピーカーを使ってPM2.5ダスト検出システムを構築します。PM2.5ダストセンサが空気中のPM2.5粒子を検出し、OLEDは検出されたPM2.5値をリアルタイムで表示します。値が閾値に達するとスピーカーがアラームを鳴らし、噴霧モジュールが水霧を噴射して粉塵を抑制します。

#### 4.3.8.2 コンポーネントの知識

**PM2.5 ダストセンサ**

この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℃

#### 4.3.8.3 必要部品
| |||
| :--: | :--: | :--: |
| micro:bit V2 メインボード ×1 | micro:bit シールド ×1 |噴霧モジュール ×1|
||| |
|PM2.5 ダストセンサ ×1|OLEDディスプレイ ×1 |AA電池(**自分で用意**) ×6|
| |||
|電池ホルダー ×1|4ピンケーブル ×2 |3ピンケーブル ×1 |
| | | |
| 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 |

#### 4.3.8.5 コードフロー

#### 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)” .

⚠️ **ヒント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
```

**簡単な説明:**
① 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マトリクスは  を表示し、スピーカーがアラームを鳴らします。1秒後に噴霧モジュールが水霧を噴射します。
それ以外の場合は、5×5 LEDは  を表示し、スピーカーは鳴らず、噴霧モジュールは動作しません。
```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 テスト結果

配線後に micro USB ケーブルで給電し、さらに十分な電源を確保するために外部電源(単3電池6本)を接続し、「Flash」をクリックしてコードを micro:bit ボードにダウンロードします。

テストコードをアップロードしたら、micro:bit の背面にあるリセットボタンを押します。

室内の床を掃く、ライターの火花をつける、安全に少量の紙を燃やすなどして明確なPM2.5粒子を発生させると、PM2.5ダストセンサがそれらを検出し、その濃度がOLEDにリアルタイムで表示されます。
検出されたPM2.5粉塵濃度が500 μg/m³を超えると、5×5 LEDマトリクスは  を表示し、スピーカーがアラームを鳴らします。1秒後に噴霧モジュールが水霧を噴射します。そうでない場合は、5×5 LEDは  を表示し、スピーカーは鳴らず、噴霧モジュールは作動しません。
| OLED に表示される値 | 空気の状態 |
| :---------------------: | :---------: |
| 0-75 | 優良 |
| 75-150 | 良好 |
| 150-300 | 普通 |
| 300-1050 | 注意 |
| 1050-3000 | 悪い |
| 3000 + | 非常に悪い |

⚠️ **注意: 実験で使用されているビルディングブロックは本キットに含まれていません。**
(**Tip:** 結果が観察できない場合は、micro:bit ボードのリセットボタンを押してください。)
