PM2.5センサー(PMS5003)を使う
PMS5003というPM2.5センサーを使う方法を説明します。これは、粒子状物質(particulate matter: PM)の濃度を測るセンサーです。
PM(particulate matter)とは
粒子状物質(particulate matter: PM)とは、空気中を飛んでいる目に見えない物質(目に見えないほど小さい粒)のことです。だいたい直径が100マイクロ・メートル(μm)から0.01マイクロ・メートル(μm)くらいのものを指しています。1マイクロ・メートル(μm)の長さは、1 * 10^-6 m(1メートルを10の6乗で割った長さ)です。1ミリメートル(mm)が1 * 10^-3 mなので、1ミリの1000分の1の長さが1マイクロ・メートルです。
粒子状物質(particulate matter: PM)には大気汚染の原因になるものがあり、それは健康被害や環境問題(酸性雨など)を引き起こします。人間がそれを吸うと、鼻やのど、気管、肺などに悪影響を与えます。空気中の物質の多くは鼻や、のどでブロックされて、それ以上体内へ侵入できませんが、物質が小さくなれば気管や肺にも入ります。直径が5 µm以下になると、肺の奥にまで届くそうです。肺には空気中の酸素を血液に取りこむ役割があるので、その際に毒性のある物質も血液中に取りこまれる可能性があり、そうなると毒性物質が体全体へ広がることになります。
粒子状物質(particulate matter: PM)は、直径の大きさによって違うカテゴリーに分けられています。直径が10 μm以下のものをPM10、2.5 μm以下のものをPM2.5と呼びます。PM10はPM2.5を含みます(PM2.5はPM10の一部)。以下の図は、PM10とPM2.5を髪の毛と比較したものです。髪の毛の太さ(直径)は50〜70 μmなので、PM10の直径はそれの約1/5です。PM2.5はさらに小さくなります。
PM2.5よりも小さな物質のカテゴリーもあり、直径が1 μm以下のものをPM1.0、直径が0.1 μm以下のものをPM0.1と呼びます。
環境問題の観点ではPM10の濃度(concentration)が重要で、健康被害の観点ではPM2.5の濃度が重要だそうです。濃度の単位はµg/m^3です。つまり、空気1 m^3(1立方メートル)の中に含まれるPMの粒の重さ(µg)です。WHOによれば、PM10の濃度を70 µg/m^3から30 µg/m^3に減らすことができれば、世界の大気汚染に関連する死亡者数330万人(年間)を15%減らせるとのこと。また、アメリカのEPA(Environmental Protection Agency)や日本の環境省によると、PM2.5の濃度が高いほど健康被害が大きくなるとのこと。
準備
ラズパイの画面左上にあるラズベリーのアイコンをクリックし、Preferencesを選択、さらにRaspberry Pi Configurationを選択します。小さなウィンドウが表示されるので、その中の「Interfaces」のタブを選択し、「Serial Port」をon/enabledにして、「Serial Console」をoff/disabledにします。ラズパイをリブート(再起動)するかどうか聞かれたら、Yes/OKを選んでリブートしてください。
ラズパイとの接続
センサーにワイヤーが付属しているので、それをセンサーのコネクターに差しこんでください。ワイヤーの反対側の端は以下のようになっています。
ここでは、VCC、GND、TXDの3つのピンを使います。以下の表のように、この3つのピンをラズパイのGPIOピンと接続してください。
PM2.5センサーのピン | ラズパイのGPIOピン |
---|---|
VCC | 5V |
GND | GND(どのGNDピンでもよい) |
TXD | GPIO 15 |
センサーの動作テスト
まず、「CircuitPythonをインストールする」に書いてある作業をやってください。次にラズパイのTerminalで以下のコマンドをひとつづつ実行:
sudo pip3 install adafruit-circuitpython-busdevice
sudo pip3 install adafruit-circuitpython-pm25
センサーからPM濃度を読み取るプログラムがpm-read.pyです。このプログラムは、2秒に1回センサーからデータを読み取ってプリントします。これがずっと続くので、止めるにはCtrl-Cしてください。
関数PM25_UART()
は、センサーとのやり取りをする「通信口」のようなものを返します。ここでは、それが変数sensor
に入っています。その通信口を使ってsensor.read()
という関数を呼ぶと、PM濃度のデータが返されます。返されるPM濃度のデータはディクショナリーで、それが変数pmData
に入っています。
pmData = sensor.read()
関数sensor.read()
が返すPM濃度のデータはディクショナリー形式になっていて、以下の3つのキーを使っています。それぞれにキーに対応するのは、大きさの違うPMの濃度です。
ディクショナリーのキー | ディクショナリーの値 |
---|---|
“pm10 env” | 直径が0.3〜1.0 μmのPMの濃度(µg/m^3) |
“pm25 env” | 直径が1.0〜2.5 μmのPMの濃度(µg/m^3) |
“pm100 env” | 直径が2.5〜10 μmのPMの濃度(µg/m^3) |
pm-read.pyでは、以下のように3種類のPM濃度をプリントしています。
print("0.3-1.0 μm in diameter:", pmData["pm10 env"], "μg/m^3")
print("1.0-2.5 μm in diameter:", pmData["pm25 env"], "μg/m^3")
print("2.5-10 μm in diameter:", pmData["pm100 env"], "μg/m^3")
次のプログラムpm-concentration.pyは、PM2.5の濃度とPM10の濃度を計算してプリントします。PM2.5の濃度は、直径が2.5 μm以下のPMすべてをカウントした濃度なので、pmData["pm25 env"]
とpmData["pm10 env"]
を足したものになります。PM10の濃度は、直径が10 μm以下のPMすべてをカウントした濃度なので、pmData["pm100 env"]
とpmData["pm25 env"]
、pmData["pm10 env"]
を足したものになります。
次のプログラムpm-aqi.pyは、PM濃度からAQI(Air Quality Index)という指標値を求めるプログラムです。AQIは、PM濃度をもとにして空気の汚染度を数値化し、空気汚染のレベルを分かりやすく示すためのものです。以下のように、AQIの範囲ごとに、空気汚染のレベルが6つに分けられていています。
AQIの値 | AQIのカテゴリー(空気汚染のレベル) |
---|---|
0 - 50 | Good(良い) |
51 - 100 | Moderate(普通) |
101 - 150 | Unhealthy for Sensitive Groups(PM濃度に敏感な人たちにとっては健康に良くない) |
151 - 200 | Unhealthy(健康に良くない) |
201 - 300 | Very Unhealthy(極めて健康に良くない) |
301 - 500 | Hazardous(危険) |
AQIの計算方法はここに書いてあります。