ESP32のディープスリープで電池駆動を長く保つ実践入門【2026年版】|消費電流の測り方とタイマー・外部割り込みウェイクアップ

ESP32のディープスリープで電池駆動を長く保つ実践入門のアイキャッチ

ESP32をコンセントではなく電池で動かそうとすると、多くの人が最初にぶつかるのが「1日ももたずに電池が切れる」という壁です。Wi-Fiを常時つないだままだと消費電流は100〜200mA前後にもなり、モバイルバッテリーでも数時間から1日程度しか動きません。これを数週間〜数ヶ月に伸ばす鍵が「ディープスリープ」です。本記事では、ESP32のスリープモードの違い、消費電流の実測の考え方、タイマー/外部割り込みでの起床、電池寿命の見積もり方までを、実際のコードとともに解説します。

目次

ESP32のスリープモードは4種類

ESP32には消費電流の異なる複数の省電力モードがあります。おおまかには次の4つです。

  • Modem-sleep:CPUは動いたままWi-Fi/Bluetoothの無線部だけ休ませる。数十mA。
  • Light-sleep:CPUを一時停止しRAMを保持。数百µA〜数mA。復帰は高速。
  • Deep-sleep:CPUとほとんどの周辺を停止し、RTCコントローラだけを残す。数µA。復帰はリセットに近い。
  • Hibernation:RTCメモリも含めさらに多くを止める最小消費の状態。

電池駆動で「定期的にセンサーを測って送る」用途では、待機時間の大半をDeep-sleepで過ごし、必要なときだけ起きて処理する設計が基本になります。

ディープスリープの消費電流の目安

Espressifの公式資料によると、ESP32-S3のディープスリープ時の消費電流はデータシート上でおよそ7µA、モジュール(ESP32-S3-WROOM-1)の実測でも約8µAとされています。文献によっては数µA〜150µA程度と幅を持って示されます(出典:Espressif ESP-IDF Sleep ModesLast Minute Engineers)。

ただし注意したいのは、この数値はチップ/モジュール単体の話だという点です。市販の開発ボードには電源レギュレータ、USB-シリアル変換IC、電源LEDなどが載っており、これらがディープスリープ中も電流を消費します。そのため実際のボードでは数十〜数百µAに増えることが珍しくありません。「データシート通りの数µA」を狙うなら、余分な周辺回路の少ない基板を選ぶか、それらを取り外す/給電を工夫する必要があります。まず何より、後述するUSB電力計で自分のボードの実測値を知ることが出発点です。

用意するもの

  • ESP32開発ボード(技適マーク付き)
  • 電池(モバイルバッテリー、単3×数本、または18650リチウムイオン電池など)
  • 消費電流を測るUSB電力計またはテスター
  • ブレッドボードとジャンパーワイヤ、必要に応じてセンサー

開発環境の作り方はESP32でWi-Fi温湿度モニターを作る実践入門で詳しく解説しています。まだESP32を触ったことがなければ、そちらで一度「動くセンサー機器」を作ってから本記事の省電力化に進むのがおすすめです。

タイマーウェイクアップの実装

もっとも使われるのが、一定時間ごとに起きる「タイマーウェイクアップ」です。esp_sleep_enable_timer_wakeup()に起床までの時間をマイクロ秒で渡し、esp_deep_sleep_start()を呼ぶだけです。

// タイマーウェイクアップ+RTCメモリで起動回数を保持する最小例(Arduino / ESP32)
#define uS_TO_S 1000000ULL   // マイクロ秒→秒
#define SLEEP_SEC 30         // 30秒ごとに起きる

RTC_DATA_ATTR int bootCount = 0;  // ディープスリープ中も保持される変数

void setup() {
  Serial.begin(115200);
  delay(500);
  bootCount++;
  Serial.printf("起動回数: %d\n", bootCount);

  // ここでセンサ計測やWi-Fi送信などの実処理を行う

  esp_sleep_enable_timer_wakeup(SLEEP_SEC * uS_TO_S); // タイマーを起床要因に設定
  Serial.println("ディープスリープに入ります");
  Serial.flush();
  esp_deep_sleep_start();  // ここで電流が数µAまで落ちる
}

void loop() {}  // ディープスリープ運用ではloopは使わない

ポイントは、ディープスリープからの復帰がリセットに近い動作で、毎回setup()から実行される点です。loop()を回し続ける一般的なスケッチとは設計思想が違います。起動回数のように値を保持したいときは、RTC_DATA_ATTRを付けてRTCメモリに置きます。

外部割り込み(ボタン・センサー)で起こす

時間だけでなく、ボタンやセンサーの信号でも起こせます。単一ピンで起こすext0、複数ピンをまとめて扱うext1のほか、タッチ、ULP(超低消費コプロセッサ)も起床要因に使えます。

// ボタン(GPIO33をLOW)で起こす外部割り込みウェイクアップ
#define WAKE_PIN GPIO_NUM_33

void setup() {
  Serial.begin(115200);
  // ext0:単一ピンの状態で起床(0=LOWで起床)
  esp_sleep_enable_ext0_wakeup(WAKE_PIN, 0);
  esp_deep_sleep_start();
}

void loop() {}

「普段は寝ていて、人が来たときだけ動く」ような人感センサー連動の機器は、この外部割り込みとタイマーを組み合わせて作ります。

電池寿命の見積もり方

電池がどのくらいもつかは「平均電流」で概算できます。例として、5分に1回だけ起きて3秒間Wi-Fi送信(120mA)し、残りはディープスリープ(0.05mA=50µA)する構成を考えます。

  • 1周期=300秒。うち起動3秒+待機297秒。
  • 平均電流 ≒ (120mA×3秒 + 0.05mA×297秒) ÷ 300秒 ≒ 約1.25mA
  • 2000mAhの電池なら 2000 ÷ 1.25 ≒ 約1600時間=およそ66日(自己放電や変換効率を無視した理論値)

同じ機器をディープスリープなしでWi-Fi常時接続にすると平均100mA前後になり、2000mAhでは20時間ほどで切れてしまいます。ディープスリープの有無で寿命が数十倍変わることが分かります。送信間隔を10分に一度に伸ばせば、さらに寿命は延びます。

消費電流をさらに下げる実践ポイント

  • 起きている時間を削る:測って送ったらすぐ寝る。無駄なdelay()を減らす。
  • Wi-Fi接続の回数を減らす:毎回つなぐと接続に電力と時間を使う。複数回分をまとめて送るのも有効。
  • 周辺回路を見直す:電源LEDの撤去、使わないGPIOの固定、外部センサー電源のトランジスタ制御で待機電流を下げる。
  • 送信データ・処理を軽くする:エッジ側で処理を済ませて送信量を減らす。オンデバイスAIを使う場合はTinyML実践入門マイコンボードの選び方も参考になります。

Wi-Fiではなく低消費電力の無線を使いたい場合は、Raspberry Pi Pico 2 WでWi-Fi・MQTTを使う実践入門のようにMQTTで送信を軽量化するアプローチも検討できます。

この記事で使う機材(Amazonで探す)

電池駆動の実験には、消費電流を「見える化」するUSB電力計があると理解が一気に進みます。以下はAmazonの検索リンクです(各自で技適マーク付きの製品を選んでください)。

さらに深く学ぶための書籍

よくある質問(FAQ)

ESP32のディープスリープ中の消費電流はどのくらいですか?

チップ単体のデータシート上はおおむね7µA前後、モジュール(ESP32-S3-WROOM-1)でも実測8µA程度とされています。ただし市販の開発ボードは電源レギュレータやUSB-シリアル変換IC、電源LEDなどが常時電流を消費するため、実際には数十〜数百µAになることが一般的です。低消費を突き詰めるなら、これらの周辺回路が省かれた基板や、外部から直接給電する構成を検討します。

タイマーで起きるときの時間はどのくらい正確ですか?

esp_sleep_enable_timer_wakeup()はマイクロ秒単位で指定できますが、実際の分解能はディープスリープ中に動くRTC_SLOW_CLKの精度に依存します。内蔵RC発振器は温度で誤差が出るため、長期間の正確な周期が必要な場合は外部の32.768kHz水晶を使う構成が向いています。

ディープスリープから復帰するとプログラムはどこから動きますか?

ディープスリープからの復帰はリセットに近い動作で、setup()から再実行されます。loop()を回し続ける通常のスケッチとは設計が異なります。復帰後も値を保持したい場合は、RTCメモリに置かれるRTC_DATA_ATTR付きの変数を使います。

電池をなるべく長持ちさせるコツは何ですか?

起きている時間を短くすること、Wi-Fi接続の回数と時間を減らすこと、送信間隔を必要最小限にすることが効果的です。加えて、開発ボードの電源LEDを外す、使わないGPIOを固定する、外部センサーの電源をトランジスタで切るといった工夫で待機電流をさらに下げられます。

まとめ

ESP32を電池で長く動かす鍵は、待機時間の大半をディープスリープで過ごし、必要なときだけ起きて素早く処理して再び眠る設計にあります。まずはUSB電力計で自分のボードの実測値を把握し、タイマーや外部割り込みで起床する構成に置き換え、Wi-Fi接続と起動時間を削っていく——この順番で取り組めば、数時間しかもたなかった機器を数週間〜数ヶ月動かせるようになります。

※本記事にはアフィリエイト広告(PR)を含みます。掲載製品の購入は各自の判断でお願いします。

シェアはこちらからお願いします
  • URLをコピーしました!

この記事を書いた人

組み込みエンジニア・IoTエンジニア向け情報メディア「エンジニアGO」の運営者。エンジニアのキャリア・転職・スキルアップに役立つ情報を発信しています。

目次