屋内環境を手軽にモニタリングする～⑤PPD42NSからPM2.5濃度をJavaで取得する(GPIO / Pi4J)～

## はじめに
PM2.5濃度を測定するセンサーとして、安価な[PPD42NS](http://wiki.seeedstudio.com/Grove-Dust_Sensor/)を使用します。これは検出結果をデジタル出力のHi/Loで出力して、所定の計算式でPM2.5濃度を算出します。本記事では、Raspberry Pi 3BのJavaのGPIOモジュールとして[Pi4J](https://pi4j.com/)を使用して、PPD42NSからPM2.5濃度を取得するために作成したJavaライブラリ[ppd42ns-driver](https://github.com/s5uishida/ppd42ns-driver)の概要を紹介します。といっても、Githubの内容そのままです。実装の詳細や使い方のサンプルは、[Githubのコード](https://github.com/s5uishida/ppd42ns-driver/blob/master/src/io/github/s5uishida/iot/device/ppd42ns/driver/PPD42NSDriver.java)を参照して下さい。

## PPD42NSとRaspberry Pi 3Bの接続
5V、GND、PM2.5、Txを以下の通り接続します。なお、[こちら](https://github.com/mauricecyril/pidustsensor)も参考になります。

- `Pins` of [PPD42NS](http://wiki.seeedstudio.com/Grove-Dust_Sensor/)
  - Vin (pin#3 - Red)
  - GND (pin#1 - Black)
  - PM2.5 (pin#4 - Yellow)
- [GPIO of Raspberry Pi 3B](https://www.raspberrypi.org/documentation/usage/gpio/README.md)
  - Vin --> (2) or (4)
  - GND --> (6), (9), (14), (20), (25), (30), (34) or (39)
  - Tx --> (19) GPIO10, (38) GPIO20 or (8) GPIO14

なお、OSの設定については、前回の記事「[屋内環境を手軽にモニタリングする～④MH-Z19BからCO2濃度をJavaで取得する(シリアル通信 / jSerialComm)～](https://qiita.com/items/1759498f8f706c4c3314)」を参照して下さい。

## WiringPiインストール
Raspberry Pi 3BのGPIOを操作するJavaライブラリ[Pi4J](https://pi4j.com/)を使用するにあたり、[WiringPi](http://wiringpi.com/)というライブラリが必要になります。以下の通りにインストールします。

```
# apt-get update
# apt-get install wiringpi
```

Raspberry Pi 4Bで使用する場合は、最新版を以下のようにインストールします。[こちら](http://wiringpi.com/wiringpi-updated-to-2-52-for-the-raspberry-pi-4b/)を参考にして下さい。

```
# wget https://project-downloads.drogon.net/wiringpi-latest.deb
# dpkg -i wiringpi-latest.deb
```

バージョンが2.52であることを確認して下さい。

```
# gpio -v
gpio version: 2.52
```

**なお、2019年10月の時点で、Pi4JとWiringPiの組み合わせでRaspberry Pi 4Bを使用する公式な情報を確認していません。一応、簡単に動作することを確認しましたが、何らかの問題が発生するかもしれません。**

## サンプルコード
ppd42ns-driverの使い方のサンプルは以下の通りです。**注意点として、一回の測定に約30秒かけていますので、センサーデータの読み出し`ppd42ns.read()`の戻りは、毎回30秒程度かかります。**

```Java
import com.pi4j.io.gpio.Pin;
import com.pi4j.io.gpio.RaspiPin;

import io.github.s5uishida.iot.device.ppd42ns.driver.PPD42NSDriver;
import io.github.s5uishida.iot.device.ppd42ns.driver.PPD42NSObservationData;

public class MyPPD42NS {
    private static final Logger LOG = LoggerFactory.getLogger(MyPPD42NS.class);
    
    public static void main(String[] args) {
        PPD42NSDriver ppd42ns = PPD42NSDriver.getInstance(RaspiPin.GPIO_10);
        ppd42ns.open();
    
        while (true) {
            try {
                PPD42NSObservationData data = ppd42ns.read();
                LOG.info("[{}] {}", ppd42ns.getName(), data.toString());
            } catch (IOException e) {
                LOG.warn("caught - {}", e.toString());
            }
        }
    
//      if (ppd42ns != null) {
//          ppd42ns.close();
//      }
    }
}
```

`ppd42ns.read()`で返るデータの詳細は、こちらの[クラス](https://github.com/s5uishida/ppd42ns-driver/blob/master/src/io/github/s5uishida/iot/device/ppd42ns/driver/PPD42NSObservationData.java)を参照して下さい。`pcs/0.01cf`と`μg/m^3`の二つの単位でPM2.5の濃度を取得できます。

## 一連の記事
このシリーズは、以下の記事から構成されます。
1. [動機とコンセプト](https://qiita.com/items/9c31e6fd9b6eb0fa9c96)
2. [Bluetooth LEアドバタイズ信号をJavaでキャッチする(Bluetooth LE / bluez-dbus)](https://qiita.com/items/a4543c9e7fb13b4c7c6e)
　関連するGithubは[こちら](https://github.com/s5uishida/bluetooth-scanner)。
3. [TI SensorTag CC2650から温度/湿度/照度などをJavaで取得する(Bluetooth LE / bluez-dbus)](https://qiita.com/items/79a2de6a7026ef230e9b)
　関連するGithubは[こちら](https://github.com/s5uishida/cc2650-driver)。
4. [MH-Z19BからCO2濃度をJavaで取得する(シリアル通信 / jSerialComm)](https://qiita.com/items/1759498f8f706c4c3314)
　関連するGithubは[こちら](https://github.com/s5uishida/mh-z19b-driver)。
5. **PPD42NSからPM2.5濃度をJavaで取得する(GPIO / Pi4J)(今回)**
　関連するGithubは[こちら](https://github.com/s5uishida/ppd42ns-driver)。
6. [産業オートメーション機器の稼動情報をJavaで取得する(OPC-UA / Eclipse Milo)](https://qiita.com/items/60954d356a3ea1048c61)
　関連するGithubは[こちら](https://github.com/s5uishida/rainy-opcua)。
7. [簡易ツールにまとめる](https://qiita.com/s5uishida/items/c56f1444c6856656b128)
　関連するGithubは[こちら](https://github.com/s5uishida/rainy)。
8. [後記](https://qiita.com/s5uishida/items/d2a888eb2d68e72f32ae)

## 追記
[2019.11.16]
簡易ツールの最新情報は、[こちら](https://github.com/s5uishida/rainy)をご参照下さい。