ESP8266の真骨頂Deep-Sleepモードの使い方

今まで、[ArduinoIDEの環境準備](http://qiita.com/azusa9/items/264165005aefaa3e8d7d)、[WiFi接続方法](http://qiita.com/azusa9/items/7f78069cb09872cf6cbf)、[AD変換のやり方](http://qiita.com/azusa9/items/26e74e4e0d5773ce9c41)とやってきました。
今回はESP8266の目玉機能の一つであるDeep-Sleepモードへの突入、復帰のやり方を解説したいと思います。
スペックシートでは10μAと、とても低い消費電力になるので乾電池で長期間の運用が可能になると思います。
今回は、実際にDeep-Sleepモードにした時のアンペアも計測してみました。

## Deep-Sleepモードについての簡単な説明
ESP8266は、3つのスリープモードを持っていて、下記の記載がスペックシートにありました。

| モード名 | 電流 |
|:-----------:|:------------:|
| Modem-Sleep | 15 mA |
| Light-Sleep | 0.9 mA |
| Deep-Sleep | 10 uA |
スペックシートより

今回は、この中のDeep-Sleepを使ってみます。

## 注意点
* Deep-Sleepでは、出力IOピンの状態は維持されません。計測間隔が数分になるとか、仕事が無い間にDeep-Sleepモードに入れて電力の消費をへらすなどが考えられます。
* Deep-Sleepモードからの復帰時は、ボードがリセットされるのでプログラムの先頭からの実行になります。
* Deep-Sleepモードへの移行は少し時間が掛かるようです。プログラムの中でコレに関しての工夫が入っています。（モード変更命令出した後にdelayを入れるだけですが）

## 配線について
IO16のピンがWAKE（目覚め）ピンになっています。コレをRST端子に接続しておくことがDeep-Sleepモードからの復帰のためには必要です。

ここからは想像ですが、Deep-Sleepモードからの復帰は、内蔵のRCタイマーを掛けてそれが、規定カウント経つと、IO16ピンがGNDに落ちて、リセットがかかりDeep-Sleepモードから復帰すると言う仕組みのように思えます。（想像なので、間違っていたらコメントもらえればと思います）

![DSC_1350.JPG](https://qiita-image-store.s3.amazonaws.com/0/77002/8f1b71d9-143e-06e6-b770-d2b107ebd3ac.jpeg)




## ソースコード

WiFiに繋いでも良いのですが、今回はシンプルなソースコードにしました。
肝になる部分は下記です。

``` 
  //1:μ秒での復帰までのタイマー時間設定  2:復帰するきっかけの設定（モード設定）
  ESP.deepSleep(30 * 1000 * 1000 , WAKE_RF_DEFAULT);

  //deepsleepモード移行までのダミー命令
  delay(1000);
```

ESP..の行が突入命令です。タイマーの時刻を設定して、設定した時間で復帰するように設定しています。
第1引数の時間設定はμ秒なので、例では30秒後に復帰する設定になります。
モード設定は、下記を参考に出来ると思います。

    WAKE_RF_DEFAULT = 0, // RF_CAL or not after deep-sleep wake up, depends on init data byte 108.
    WAKE_RFCAL = 1,      // RF_CAL after deep-sleep wake up, there will be large current.
    WAKE_NO_RFCAL = 2,   // no RF_CAL after deep-sleep wake up, there will only be small current.
    WAKE_RF_DISABLED = 4 // disable RF after deep-sleep wake up, just like modem sleep, there will be the smallest current.
https://github.com/sandeepmistry/esp8266-Arduino/blob/master/esp8266com/esp8266/cores/esp8266/Esp.h

直後のdelay命令は、すぐにDeep-Sleepモードに突入できないので、次の行に命令を書いておくと実行されてしまいます。それを防ぐ為に、ダミーのdelay命令を入れて、Deep-Sleepモードに突入するための時間を稼いでいます。正確に計測したことは無いですが、突入に1秒かかるようなことは無いと思います。


全体のソースコードは下記になります。

```Java:QiitaWiFi03
#include <ESP8266WiFi.h>

void setup() {
  //デバッグ用にシリアルを開く
  Serial.begin(115200);
  Serial.println("");
  Serial.println("PG start");

  //LEDを点灯させるので、そのピンをOUTPUTに設定して、LOWに。
  pinMode(5, OUTPUT);
  digitalWrite(5, LOW);

}

void loop() {

  // Loop 関数突入時動作　LED　点灯→消灯→点灯
  digitalWrite(5, HIGH );
  delay(1000);
  digitalWrite(5, LOW);
  delay(1000);
  digitalWrite(5, HIGH );
  delay(1000);

  //DEEP SLEEPモード突入命令
  Serial.println("DEEP SLEEP START!!");

  //1:μ秒での復帰までのタイマー時間設定  2:復帰するきっかけの設定（モード設定）
  ESP.deepSleep(30 * 1000 * 1000 , WAKE_RF_DEFAULT);

  //deepsleepモード移行までのダミー命令
  delay(1000);

  //実際にはこの行は実行されない
  Serial.println("DEEP SLEEPing....");

}
```

## 実行時のシリアル画面
![2015_07_19__120900_632-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/77002/8b3d8158-175f-99ce-9902-672a570a7c29.jpeg)

文字化けしているところは、ESP8266が起動した時に出力されるデータなので無視して下さい。
その後、PG start がsetup内で実行されます。その後LEDが点滅して、Deep-Sleepモードに入ります。その直前にシリアルにメッセージを流しています。その後、Deep-Sleepモードに入り、時間が経つとリセットが掛かりプログラムの始めから実行されると言う事をくり返しています。

## 実際の消費電力
見にくいかと思いますが、16.9μAとなっています。（テスターのレンジ200μA）スペックシートにある10μAとイコールではありませんが、ほぼ理論値になっていると思って良いのかなと思います。

![DSC_1346.JPG](https://qiita-image-store.s3.amazonaws.com/0/77002/413adcbf-0c65-0fb9-e70e-858f2ff55a49.jpeg)


　
　

ESP8266のハマりどころを、下記に順次まとめています。あわせてこちらもご覧下さい。（随時更新中なので、ストックしてもらえれば更新時に通知させてもらいます）
http://qiita.com/azusa9/items/fe20794aa858a73fd97b


2016.08.14追記
何となく記事が古いよマークとかが出てきていたので、自分メモを更新してみようと。
「ESP.deepSleep(0)で永久スリープが出来る」　by　http://qiita.com/kiyopikko/items/4c525103700f52cb2894