【IoT入門】小型Arduino互換機で温度を取得する

# 最初に
IoT機器を作りたいと思い、温度取得まで出来たのでここにメモを残します。

## 用意するもの
・ESP01
（Amazonだと1個500円くらいかな…）
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/6da69908-c257-c464-8837-9bd8053afea7.png">

・BMP280
（Amazonだと安くて1個200円くらい、ただ湿度がとれるBME280のほうが少し高いけど良いかもしれません。）
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/69499e3f-8f94-a513-4d4f-a2d4d4cf0695.png">

**代用は効くけど、あると便利なもの**
・ESP01書き込み機材
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/487c5691-f557-33d5-b621-61e9c18f192f.png">

※Amazonにもありますが、改造が必要です。

・ブレッドボード
・ブレッドボード用の線材
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/41f80ab5-acdc-31dc-dfe0-2eef2b0111bc.png">

・USB to Serial変換
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/34aacdf5-9a3c-56fe-b3e5-c74fc98d1c89.png">

#実施
## 配線
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/2b832f38-c80b-e1b4-7310-ec8c6a651701.png">


## 1.準備
モジュールを利用するために、下記のURLをボードマネージャに追加します。

```
http://arduino.esp8266.com/stable/package_esp8266com_index.json
```

<img width="150" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/b5cd9f71-c2a8-b7b2-74b6-1130c7b9a9fb.png">

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/95118d2e-cda1-6401-1500-d97ebcc50662.png">

ボードはボードマネージャから`esp`と探すと`esp8266`というのが出るので、この設定を利用します。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/286b19df-4783-7b78-e976-3f6c4bac40d8.png">

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/09d6b822-1a4b-187d-e6c2-a93583430510.png">

### 私の設定値はこんな感じです。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/05111fe4-7bc7-b6af-02cd-109f2f11f6d0.png">

## 2.Code
### モジュールインストール

まず、利用するモジュールをダウンロードします。
ライブラリをインクルードからライブラリの管理を選択します。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/95738b71-81a4-36f4-c30d-15958278b870.png">

`ライブラリマネージャ`で`BME280`と検索します。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/385d1d93-eaff-2d6b-bc90-c6edd64f3786.png">
BME280というモジュールをインストールします。

### ソースコード編集
モジュールにはコーディング例が入っているのでこれを利用します。
`ファイル`の`スケッチ例`と選択して、下の方に行きます
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/1d6e99c2-576b-7551-fe12-92856aa7294f.png">

`BME280`の中に`BME_280_I2C_Test`という項目があるのでこれを選択します。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/f8778759-bb3d-72d5-8101-2d5895728f92.png">

ソースコードを下記のように変更します。
`Wire.begin();`を削除し、2行追加します。
これはi2cで利用するポートの初期化と指定です。

```c
  Wire.pins(0, 2);  //追加
  Wire.begin(0, 2); //追加
 //Wire.begin();      削除

  while(!bme.begin())
  {
    Serial.println("Could not find BME280 sensor!");
....
```

## 3.書き込みとテスト
これを、書き込み用の環境に接続し、書き込みを行います。

書き込みボタン
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/0d040e88-92f9-9ee3-29d5-f942ee327cfb.png">

下記のような表示が出れば正常に終了です。

```shell
Executable segment sizes:
IROM   : 238256          - code in flash         (default or ICACHE_FLASH_ATTR) 
IRAM   : 27680   / 32768 - code in IRAM          (ICACHE_RAM_ATTR, ISRs...) 
DATA   : 1260  )         - initialized variables (global, static) in RAM/HEAP 
RODATA : 888   ) / 81920 - constants             (global, static) in RAM/HEAP 
BSS    : 25456 )         - zeroed variables      (global, static) in RAM/HEAP 
最大958448バイトのフラッシュメモリのうち、スケッチが268084バイト（27%）を使っています。
最大81920バイトのRAMのうち、グローバル変数が27604バイト（33%）を使っていて、ローカル変数で54316バイト使うことができます。
esptool.py v2.8
Serial port /dev/cu.wchusbserial1410
Connecting....
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: b4:e6:2d:26:d9:43
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 1MB
Compressed 272240 bytes to 198387...

Writing at 0x00000000... (7 %)
Writing at 0x00004000... (15 %)
Writing at 0x00008000... (23 %)
Writing at 0x0000c000... (30 %)
Writing at 0x00010000... (38 %)
Writing at 0x00014000... (46 %)
Writing at 0x00018000... (53 %)
Writing at 0x0001c000... (61 %)
Writing at 0x00020000... (69 %)
Writing at 0x00024000... (76 %)
Writing at 0x00028000... (84 %)
Writing at 0x0002c000... (92 %)
Writing at 0x00030000... (100 %)
Wrote 272240 bytes (198387 compressed) at 0x00000000 in 22.6 seconds (effective 96.3 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
```

実行環境に接続して、電源をいれれば温度が取得できます。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/10c8a590-494c-0c18-4ff2-82f16031189a.png">


# 感想
実際に、ハードウェアがからんでくるため、いろいろなところで悩んでしまいました。
電気系の勉強もサボっているため、引き続きしていきたいと思います。
参考になったら`良いね`ください！

# 詰まったところ、詰まりそうなところ
## USB to Serial はMACではドライバが必要
組み込み系のケーブルは基本的にはドライバが必要です。
購入した機器により、異なるのですが基本的には「型番」で検索をすると出てきます。
「型番」が不明な場合は、基板上の英数字で検索すればいいと思います。

恐ろしく読みづらいので、私はスマホで撮影して拡大して見ています。

<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/34aacdf5-9a3c-56fe-b3e5-c74fc98d1c89.png">
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/872a9380-b19d-ee0e-4fbf-7f75e21d6d84.png)

## GNDレベルを同一にしないとSerial通信ができない
シリアル通信を行う場合、該当の機器と電位差が発生してしまう事があります。
そうすると、うまく通信が行えない場合があるので、各グランド線は同一にしておくと良いです。
※私もこれで通信できず悩みました…

## 電源が安定化しないと動かない場合がある（書き込み失敗も含む）
今回は3.3Vでしたが、電源がこの電圧を出力できていてもうまく行かない場合があります。
理由として、電気を消費し始めると電圧が下がってしまい安定動作しなくなります。
対策としてキャパシタなどをグランドと3.3Vの間に挟んでおくと、電流が不足した場合にそこから
取得するようなイメージになるので安定化します。
私も電源回路には`10μF`と`0.1μF`のキャパシタを挟んでいます。

こんな感じです。
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/e03962cb-138d-633a-9d6a-be8ab9255e77.png">

## シリアル通信で変な文字が出る
Serialの通信速度が異なる場合になります。
ソースコードで定義されている通信速度に合わせる、または何度か変更してみるのもいいと思います。

## Serialが複数ポートあり、選択に失敗している。
私もよく間違えるのですが、2台以上のSerialポートが有る場合に選択を間違えているとうまく動きません。
`ツール`＞`シリアルポート`から選択が可能です。

<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/5fd98704-943d-41f8-0779-a183449aa386.png">

## 書き込みモードにならない
Amazonなどに売っている、書き込み用の機材は一部配線を改造しなければ書き込みできません。
私もこのように`GPIO0`と`GND`ショートさせています。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/a3ea22b2-4d25-58db-8cc4-a610c7e32300.png">
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/c70aac4d-6e79-d47c-be81-142c075a61f1.png">