You are here

ESP8266: ESP8266-LEAFでディープスリープ

ディープスリープの概要

ESP8266-LEAFで使用しているESP-WROOM-02は、消費電力を抑えるために、ほとんど電力を使用しない状態で指定時間待機するDeep Sleep機能が組み込まれています。

ESP-WROOM-02は通常では50~200mA程度の電流を消費するようですが、DeepSleepを使用すると、消費電流は10μA程度に抑えることができます。

消費電力を抑えることは、電池での運用時に稼働期間を長くするために重要ですが、この他にもESP-WROOM-02の発熱量を小さくするためにも非常に重要です。

ESP.deepSleep()メソッドでスリープ時間をμ秒単位で、32ビット符号なし整数で指定するため、最大で70分程度のスリープ期間となります。
それを超える長時間のスリープが必要な場合には、1時間程度のDeepSleepを繰り返し実行させることで対応することになります。


ディープスリープを利用する準備

DeepSleepを使用する場合には、D16(GPIO16)端子とRST端子を1KΩ程度の抵抗で接続します。

ESP-WROOM-02のDeepSleepに関する報告の多くでは、GPIO16端子とRST端子を直接接続するようにしていますが、このような接続は、ESP8266-LEAFのように、スケッチの自動書き込み機能が組み込まれているモジュールでは不適切だと考えられます。

DeepSleepを使用する場合には、DeepSleepから復帰する際にGPIO16をLOWにしてESP-WROOM-02をリセットして復帰させます。
このため、DeepSleepでスリープしている間は、GPIO16は出力端子に設定されています。
一方、スケッチの自動書き込み機能を持つESP-WROOM-02モジュールを使用している場合には、RST端子には、自動リセット用の信号(出力)が接続されています。
このため、GPIO16をRSTに直接接続すると、自動リセット用の信号線とかち合うことになります。

GPIO16とRSTの接続


DeepSleepから復帰の処理は、スリープからの復帰というよりは、リセットによる再起動処理となります。

このため、一般的なリセットによる起動と、DeepSleepからの復帰を識別するために、ESP.getResetReason(void)を利用することができます。
ESP.getResetReason(void)が返す主要な文字列を以下に示します。


  • Power on
  • External System
  • Deep-Sleep Wake


#define SLEEP_SECONDS 10

// DeepSleepから復帰するたびにsetup()の処理内容も実行されます
void setup()
{
  Serial.begin(115200) ;
  // 起動要因の表示(上の行も含めて不必要であれば削除)
  Serial.println(ESP.getResetReason()) ;
/*
 * 初期化処理をここに
 */
}

void loop()
{
/*
 * 稼働中に行う処理をここに
 */
  // スリープ期間をμ秒で指定
  ESP.deepSleep(SLEEP_SECONDS * 1000 * 1000 , WAKE_RF_DEFAULT) ;

  delay(1000) ; // スリープに入るまでの十分な待ち時間
}

このプログラムを実行すると、Arduino IDEのシリアルモニタに、10秒ごとにESP-WROOM-02の起動時の文字化けした文字列と、"Deep-Sleep Wake"の文字列が表示されます。


上記の例は、初期化をsetup()に、通常の処理をloop()に分かち書きするスタイルでしたが、以下のような書き方をすることもできます。

#define SLEEP_SECONDS 10

void setup()
{
  Serial.begin(115200) ;
  // 起動要因の表示(上の行も含めて不必要であれば削除)
  Serial.println(ESP.getResetReason()) ;
/*
 * 初期化処理をここに
 */
/*
 * 稼働中に行う処理をここに
 */
  // スリープ期間をμ秒で指定
  ESP.deepSleep(SLEEP_SECONDS * 1000 * 1000 , WAKE_RF_DEFAULT) ;
}

void loop()
{
}

使用パーツ


開発ソフト: 
チップファミリー: 
MCUチップ: