Groveダストセンサーで自宅のPM2.5濃度を計測する（with ESPDuino-32）

GW中の自粛期間を活用して、前々からやりたかった自宅のPM2.5計測を試してみました。

# 環境
- 開発PC（Mac Catalina 10.15.3）
- [waves ESP32 ESPDuino-32](https://www.amazon.co.jp/waves-ESP32-ESPDuino-32-ESP-WROOM-32-%E6%8A%80%E9%81%A9%E5%8F%96%E5%BE%97%E5%93%81/dp/B074PNFJGF)
- [GROVE - ダストセンサ](https://www.switch-science.com/catalog/3081/)
- ジャンパーワイヤー3本（オス - オス）
- Arduino IDE

# 開発環境の準備
### Arduino IDEのセットアップ
- IDEのインストール
[以前の記事](https://qiita.com/KG_/items/c4a50a072f992dde78a3#%E9%96%8B%E7%99%BApc%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97)参照。
今回の作業では`Mosquittoのセットアップ`と`USB変換チップのドライバインストール`は不要です。

- ESPDuino-32用ライブラリをインストール
    - [こちらの記事](https://www.mgo-tec.com/arduino-core-esp32-install)の`２．Stable 版（安定版） Arduino – ESP32 のインストール`の手順でインストールしました。インストール

- ボードの設定
    - ボードは、`ESP32 Dev Module`を選択します。
    - ボードの設定については以下のとおりです。
        - [こちらの記事](https://www.mgo-tec.com/arduino-core-esp32-install)の`【stable ver 1.0.4で、ESP32, Dev-KitC, M5Stack Basicの場合】`の設定に概ね合わせました。
        - ただし、Upload Speedについては`921600 `だとエラーで書き込めなかったため、[Amazonの商品説明に記載](https://www.amazon.co.jp/waves-ESP32-ESPDuino-32-ESP-WROOM-32-%E6%8A%80%E9%81%A9%E5%8F%96%E5%BE%97%E5%93%81/dp/B074PNFJGF)のとおり`115200`にしました。 
        - ↓が設定した内容です。   
        ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/a823984a-da47-3a71-8e4c-deadf7828ac9.png)

### プログラム書き込みテスト
[こちら](https://blog.kyume1109.com/2018/03/30/post-26/)のサンプルコードを用いて書き込みテストをおこないました。

- ESPDuino-32への書き込み方法は少しクセがあります、[こちら](https://www.amazon.co.jp/gp/customer-reviews/R3N5YS6W4Z5BE3/ref=cm_cr_dp_d_rvw_ttl?ie=UTF8&ASIN=B074PNFJGF)のコメントに書き込み手順が記載されています。
- 書き込みが成功したら、シリアルモニターで動作確認します（↓のようにHello Worldと出ていればOK）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/6fef1e81-2e0a-6f72-feca-5840496cf720.png)
- なお、一度、書き込み途中で`A fatal error occurred: Timed out waiting for packet content`というエラーが発生しました。
    - ダストセンサーと接続してるジャンパーピンを外したら、書き込み成功しました。
    - 原因の参考になった記事は[こちら]。(https://github.com/espressif/esptool/issues/394)

### 配線
配線イメージ
（配線の仕方は[こちら](https://algorithm.joho.info/arduino/grove-dust-sensor-pm2-5-microg-per-m3/)を参考にしました）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/379e8b32-56dc-1861-1643-3a0b3fae1773.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/0fd42e9d-7a39-a8dc-2056-63d44ad1dc9f.png)

### 測定プログラムについて
- 測定プログラムは[こちら](https://algorithm.joho.info/arduino/grove-dust-sensor-pm2-5-microg-per-m3/)のサンプルコードでほぼそのまま動きました。
- サンプルコードと違う点は、ピン番号のところです。

```C++
#include "ESPDuino32PinMapping.h" //変えた部分

int pin = ESPDUINO32_D8; //変えた部分
unsigned long t0;
unsigned long ts = 30000; // 30000ms
（以下略）
```
- 変更内容
    - サンプルコードはArduino UNOで動かすもので、信号ピンのピン番号が8（D8ピン）でした。
    - ESPDuinoではD8の位置のピンがIO12にあたるのですが、番号は12です。
    - なので、`12`と直に番号を指定するか、`ESPDuino32PinMapping.h`をincludeして`ESPDUINO32_D8`などと指定するとOKです。
    - Arduinoのピン番号とESPDuinoのピン番号のマッピングについては、[こちら](https://developer.atmosphereiot.com/documents/hardwareselection/espduino32.html)を参照（`ESPDuino32PinMapping.h`もこのサイトの「Resources」でダウンロードできます）。
- 正常動作すると、以下のイメージのとおり測定結果が出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411926/e940544a-d436-adff-7bbf-28b164b1a19f.png)

# 次やろうと思うこと
[前に別のボードで温度とか計測してAWSにデータを蓄積させる](https://qiita.com/KG_/items/18e435a4bc8f506f505f)、というのをやりましたが、ESPDuinoに温度センサーをつけて、PM2.5と一緒に測定してGCPにデータを蓄積させて分析する、というところまでやってみたいなと。。。