ESP-WROOM-02 の色々備忘録

# ピン配置

- プログラムの書き込みのため、3つのピンをPULL-UP/DOWNする必要あり。
- IO0,IO2,IO15は他の用途に利用しないのがおすすめ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164437/17d2d5d1-8b4d-794f-098c-eb0b21710b8d.png)

|  名称  |     働き     |
|------:|:------------:|
|3V3	|3.3V電源(VDD)  |
|EN	|ChipEnablePin(Active HIGH)|
|RST	|リセットピン。   |
|TOUT   |アナログ入力ピン。0V(0)〜1.0V(1024)まで|
|RXD	|UART0_RXD/GPIO3|
|TXD	|UART0_TXD/GPIO1|

|  名称  |     働き     |Digital In|Digital Out|Analog In|Analog Out|
|------:|:------------:|:--------:|:--------:|:--------:|:--------:|
|IO0	|GPIO0（プログラム書き込みモード選択に使用）|    -    |    -    |    -    |    -    |
|IO2	|GPIO2（ブート時は3.3Vにプルアップ）|    -    |    -    |    -    |    -    |
|IO4	|GPIO4 / SDA|    ✕    |    ◯    |    ✕    |    ◯    |
|IO5	|GPIO5 / SCL|    ✕    |    ◯    |    ✕    |    ◯    |
|IO12	|GPIO12 / MISO|    ◯    |    ◯    |    ✕    |    ◯    |
|IO13	|GPIO13 / MOSI|    ◯    |    ◯    |    ✕    |    ◯    |
|IO14	|GPIO14 / CLK|    ◯    |    ◯    |    ✕    |    ◯    |
|IO15	|GPIO15 / CS（ブート時はGNDにプルダウン）|    -    |    -    |    -    |    -    |
|IO16   |GPIO16|    ✕    |    ✕    |    ✕    |    ◯    |

引用元：
- http://eleclog.quitsq.com/2015/08/esp-wroom-02.html
- https://synapse.kyoto/hard/ESP-WROOM-02_blink/page003.html
- https://qiita.com/umi_kappa/items/ac3d37db44a2dcfe71fd

#チップ情報/フラッシュサイズの確認

- 以下のコードでフラッシュメモリの容量を確認して、書き込み設定のFlashSizeでSPIFFの必要量を指定しましょう。

```
void setup(void) {
  Serial.begin(115200);
  
  Serial.print("CPU Frequency = ");
  Serial.print(ESP.getCpuFreqMHz());
  Serial.println(" MHz");
  
  Serial.print("ChipID = ");
  Serial.println(ESP.getChipId(), HEX); //MACアドレスの下位３バイト
  
  Serial.print("Flash Chip IDE Size = ");
  Serial.print(ESP.getFlashChipSize()); //Arduino IDE 設定の Flash Size になる
  Serial.println(" byte");
 
  Serial.print("Flash Chip Real Size = ");
  Serial.print(ESP.getFlashChipRealSize()); //ESP-WROOM-02 内蔵最大 Flash Size になる
  Serial.println(" byte");
  
  Serial.print("Free Heap Size = ");
  Serial.println(ESP.getFreeHeap());
  
  Serial.print("Free Sketch Size = ");
  Serial.println(ESP.getFreeSketchSpace());
  
  Serial.print("Sketch Size = ");
  Serial.println(ESP.getSketchSize());  
}  
```



#アナログ入力

- アナログ入力はTOUTピンのみ。最大1.0Vまでなのに注意。
- system_adc_read()という関数を使って、アナログ値を取得します。

```
extern "C" {
  #include "user_interface.h"
}

void setup() {
  Serial.begin(115200);
}

void loop() {
  int res = system_adc_read();
  Serial.println(res);
}
```

#I2C

- I2C 用の端子は、ESP8266 データシート上では IO2/IO14 となっているものの、pins_arduino.hで IO4/IO5 として定義されているので、Wire.begin()をそのまま（ピン指定無し）で使用する場合は、IO4=SDA,IO5=SCLとなります。
- 使用するピンを変える場合は、Wire.begin(SDA,SCL)という形で、ピンを指定します。

```
void setup() {
  Serial.begin(115200);
  Wire.begin(); // = Wire.begin(4, 5);
}
```

#タイマー

- ESPで最も使いやすいタイマーはTickerです。ライブラリをインクルードして使用します。
- 時間はmsec単位で指定します。

```
#include <Ticker.h>

Ticker ticker1;

void ticker1Loop() {
  Serial.print("Loop!");
}

void setup() {
  Serial.begin(115200);
  ticker1.attach_ms(1000, ticker1Loop); //連続使用
  ticker1.once_ms(1000, your_loop1);    //1回のみ
}

void loop() {
  ticker1.detach(); //タイマー停止する場合
}
```
引用元：https://qiita.com/exabugs/items/34aab51eb2d35207629b


#スリープ

- 3種類のスリープが存在。
- Deep-Sleep が最も低消費電力だが、時限タイマーまたはスイッチでの復帰のみ。
- Modem-Sleep / Light-Sleep は無線通信などの割り込みでも復帰可能。

|Parameters |current|
|----------:|:-----:|
|Modem-Sleep|15,000 uA|
|Light-Sleep|900 uA|
|Deep-Sleep |10 uA|

##1.Modem-Sleep / Light-Sleep
- setup 関数内で wifi_set_sleep_type( type ) を実行する。
- 実行後は適当なタイミングで、自動的にスリープと目覚めを繰り返す。

```
extern "C" {
#include <user_interface.h>
}

void setup() {
  // ... Wi-Fi設定等
  wifi_set_sleep_type(MODEM_SLEEP_T);
  //wifi_set_sleep_type(LIGHT_SLEEP_T);
}
```

##2.Deep Sleep
- 指定時間経過後にリセットが実行され、再起動がかかる。消費電力はダントツで低い。
- リセット実行のために（IO16がGNDに落ちるため）IO16をRST(リセット)に繋いでおく必要がある。
- スリープ時間はマイクロ秒で指定する。
- 消費電流はWiFi接続からデータ送信等までは70〜80mA程度の電流が流れ、DeepSleepに入ると0.9mA程度に。

```
void setup() {
  // ... Wi-Fi設定等
  // setup の末尾に記述
  ESP.deepSleep(60 * 1000 * 1000); //60秒(1分に1回）でスリープ復帰する場合
}

void loop() {
}
```

引用元：
- https://qiita.com/exabugs/items/9edf9e2ba8f69800e4c5
- https://ambidata.io/blog/2017/06/05/esp8266-current/