Repository: mamezou-tech/mamezou-tech-site
Pull request #1868: IoT を使ってみる（その１９：ESP32の LightSleep 機能で省電力運転に挑戦する）
Author: login: shuichi-takatsu
Created: 2025-05-10T14:06:49Z | Merged: 2025-05-11T09:19:02Z



Diff:
diff --git a/src/pages/iot.md b/src/pages/iot.md
index 1519148f3..866ec15b4 100644
--- a/src/pages/iot.md
+++ b/src/pages/iot.md
@@ -50,6 +50,7 @@ IoTデバイスに接続して使用するセンサモジュールなどにつ
 IoTデバイスを省電力で駆動させるときのTipsについて紹介します。
 
 - [IoT を使ってみる（その１５：ESP32のディープスリープで長時間バッテリー駆動に挑戦）](/iot/internet-of-things-15/)
+- [IoT を使ってみる（その１９：ESP32の LightSleep 機能で省電力運転に挑戦する）](/iot/internet-of-things-19/)
 
 ## OTA編
 
diff --git a/src/posts/iot/internet-of-things-15.md b/src/posts/iot/internet-of-things-15.md
index 5f11dda29..c11b6311a 100644
--- a/src/posts/iot/internet-of-things-15.md
+++ b/src/posts/iot/internet-of-things-15.md
@@ -212,3 +212,6 @@ DeepSleep中に淡く電源LEDが点灯し、動作していることがわか
 [IoTに関するチュートリアルや実践テクニックをまとめています。](/iot/)
 
 IoT活用の参考になれば幸いです。
+
+★追記：ESP32省電力関連記事を別記事でアップしました。
+- [IoT を使ってみる（その１９：ESP32の LightSleep 機能で省電力運転に挑戦する）](/iot/internet-of-things-19/)
diff --git a/src/posts/iot/internet-of-things-19.md b/src/posts/iot/internet-of-things-19.md
new file mode 100644
index 000000000..b7cf770be
--- /dev/null
+++ b/src/posts/iot/internet-of-things-19.md
@@ -0,0 +1,343 @@
+---
+title: IoT を使ってみる（その１９：ESP32の LightSleep 機能で省電力運転に挑戦する）
+author: shuichi-takatsu
+date: 2025-05-11
+tags: [esp32, lightsleep, esp-idf, vscode]
+image: true
+---
+
+## はじめに
+
+[以前の記事](/iot/internet-of-things-15/)では ESP32 の DeepSleep 機能を活用して、長時間のバッテリー駆動を実現する方法を紹介しました。  
+今回はその発展として、**LightSleep（ライトスリープ）機能**に挑戦します。
+
+LightSleep は DeepSleep ほどの電力削減はできないものの、システムの状態やメモリを保持したまま短時間で復帰できるのが特徴です。たとえば、外部入力にすばやく反応しながら電力も節約したい、というようなユースケースに向いています。
+
+この記事では、VSCodeとESP-IDF (Ver 5.4.1) を使用した開発環境で、ESP32のLightSleep機能を活用する方法を、具体的なサンプルコードとともに解説します。
+
+---
+
+## 開発環境
+
+開発環境は以下の通りです。
+- OS: Ubuntu 24.04（WSL2）
+- IDE: Visual Studio Code
+- ESP-IDF 拡張機能「Espressif IDF」: 1.10.0
+- ESP-IDF バージョン: **v5.4.1**
+- ターゲット: ESP32 開発ボード（ESP-WROOM-32等）
+
+---
+
+## ESP32の動作モード
+
+ESP32には、動作モードに応じて複数の省電力モードが用意されています。
+
+* アクティブモード: 通常動作時。全ての機能が利用可能ですが、消費電力は最も大きくなります。
+* Modem Sleep: Wi-Fi/Bluetoothモデムの電源をOFFにし、CPUは動作し続けるモード。消費電力を抑えつつ、CPU処理は継続したい場合に利用します。
+* **Light Sleep**: CPU、RAM、一部ペリフェラルの状態を保持したまま、多くのデジタルペリフェラルとRFモジュールのクロックをゲート（停止）または電源をOFFにします。CPUは一時停止しますが、RAMの内容は保持されるため、ウェイクアップ（復帰）が非常に高速です。アクティブモードより大幅に消費電力を削減しつつ、DeepSleepより速く処理を再開できます。
+* Deep Sleep: CPUやほとんどのRAM、デジタルペリフェラルの電源をOFFにします。RTC（リアルタイムクロック）コントローラとULP（超低電力）コプロセッサのみ動作可能です。消費電力は最も小さくなりますが、ウェイクアップ後はリセットシーケンスからプログラムが開始されるため、状態の復元に工夫が必要です。
+
+---
+
+## LightSleep とは
+
+LightSleepモードは、ESP32がCPUを一時停止させ、主要なクロックを停止することで消費電力を削減する省電力モードです。  
+重要なのは、CPUのレジスタやRAMの内容が保持される点で、ウェイクアップ時にはスリープ直前の状態から処理を再開できます。  
+これにより、DeepSleepのように起動シーケンス全体を実行する必要がなく、非常に高速な復帰が可能です。
+
+### LightSleepのメリット
+
+* 高速なウェイクアップ： マイクロ秒オーダーでの復帰が可能で、イベントへの応答性が求められる用途に適しています。
+* 状態保持： RAMの内容やCPUのコンテキストが保持されるため、スリープ前の変数の値などをそのまま利用できます。
+* 多様なウェイクアップ要因： GPIO、タイマー、UART、Wi-Fi、Bluetooth LE、タッチパッドなど、多彩な要因でウェイクアップできます。
+* 中程度の省電力効果： アクティブモードと比較して大幅な電力削減が見込めます。
+
+### LightSleepのデメリット・考慮点
+
+* DeepSleepよりは消費電力が大きい： 超低消費電力を追求する用途ではDeepSleepが有利です。
+* ペリフェラルの状態： LightSleep中も一部ペリフェラルは電力を消費する可能性があり、システム全体の消費電力は周辺回路にも依存します。
+
+## DeepSleep との比較
+
+以前使用した「[DeepSleep](/iot/internet-of-things-15/)」との比較表は以下のようになります。  
+| モード | 消費電力 | 復帰速度 | メモリ保持 | 外部割り込み対応 |
+|--------|------------|------------|-------------|-------------------|
+| LightSleep | 中程度     | 非常に高速 | ○           | ○                 |
+| DeepSleep  | 非常に低い | 数ms〜数百ms | ×         | ○（GPIO/タイマ） |
+
+LightSleepは以下のような、適度な省電力と迅速な応答性が求められるアプリケーションに適しています。  
+- 普段はスリープし、センサー値の変化やユーザー入力があった場合、即座に処理を開始するデバイス。  
+- 定期的に短時間のデータ処理や通信をして、それ以外の時間はスリープするシステム。  
+- バッテリー駆動でありながら、ユーザー操作への即時反応が求められるリモコンやウェアラブルデバイスの一部機能。
+  
+---
+
+## サンプル回路図
+
+LightSleep 動作を目視で確認できるように 赤色LED を ESP32 に接続した回路を作りました。  
+
+以下の回路は、GPIO23 から出力される信号で LED を点灯させる構成です。  
+GPIO出力が HIGH のときに LED が点灯する シンプルな **プッシュプル（電源とGNDの間に負荷を接続する）構成**です。
+
+```text
+ESP32
+GPIO23 o────┐
+            │ 
+         [330Ω]（抵抗）
+            │  
+           |>| （赤色LED）
+            │
+           GND
+```
+- `|>|` は赤色LEDを表しています（アノードが上、カソードが下）
+- GPIO23 を `HIGH` にすると、電流が GND に流れて LED が点灯します
+- GPIO23 を `LOW` にすると、電流が流れず LED は消灯します
+
+## サンプルプログラム（C言語）
+
+さっそくプログラムを作って、LightSleepを体験してみましょう。
+
+### プロジェクトの構造
+
+ESP32のLightSleep機能プロジェクトのディレクトリ構造（VSCode＋ESP-IDF拡張機能）を以下に示します。
+```text
+esp32_light_sleep/
+├── CMakeLists.txt
+├── sdkconfig.defaults
+├── main/
+│   ├── CMakeLists.txt
+│   └── main.c
+```
+- `CMakeLists.txt`: プロジェクト全体のビルド設定
+- `sdkconfig.defaults`: 初期設定のKconfig（省電力設定含む）
+- `main/`: アプリケーション本体
+  - `main.c`: GPIOやLightSleep制御を記述したメインコード
+  - `CMakeLists.txt`: `main.c` をビルド対象に登録
+
+必要に応じて `components/` ディレクトリや `Kconfig` を追加して拡張も可能です。
+
+### 定義ファイル
+
+`sdkconfig.defaults` の定義を以下に示します。
+```ini
+CONFIG_PM_ENABLE=y
+CONFIG_PM_DFS_INIT_AUTO=y
+CONFIG_PM_LIGHTSLEEP_RTC_OSC_CAL_INTERVAL=1
+```
+- `CONFIG_PM_ENABLE`: 電源管理機能を有効化。
+- `DFS_INIT_AUTO`: 周波数スケーリングを自動初期化。
+- `RTC_OSC_CAL_INTERVAL`: RTCクロックの補正間隔（1秒ごと）を設定。
+
+CMakeLists.txt については内容のみ記載し、同様の解説は[こちら](/blogs/2025/05/03/esp-idf-vsc-extension-2/)で詳しくしているので、ここでは割愛します。  
+
+`CMakeLists.txt`
+```cmake
+cmake_minimum_required(VERSION 3.5)
+include($ENV{IDF_PATH}/tools/cmake/project.cmake)
+project(esp32_light_sleep)
+```
+
+`main/CMakeLists.txt`
+```cmake
+idf_component_register(SRCS "main.c"
+                    INCLUDE_DIRS ".")
+```
+
+### プログラムファイル
+
+メインプログラムを以下に示します。  
+
+`main/main.c`
+```c
+#include <stdio.h>
+#include "freertos/FreeRTOS.h"
+#include "freertos/task.h"
+#include "driver/gpio.h"
+#include "esp_sleep.h"
+#include "esp_log.h"
+#include "esp_rom_gpio.h"
+
+#define TAG "LightSleep"
+
+#define WAKEUP_GPIO GPIO_NUM_0        // BOOTボタン
+#define LED_GPIO    GPIO_NUM_23       // LEDピン
+
+void configure_gpio()
+{
+    // LED設定
+    esp_rom_gpio_pad_select_gpio(LED_GPIO);
+    gpio_set_direction(LED_GPIO, GPIO_MODE_OUTPUT);
+
+    // Wakeupピン設定
+    esp_rom_gpio_pad_select_gpio(WAKEUP_GPIO);
+    gpio_set_direction(WAKEUP_GPIO, GPIO_MODE_INPUT);
+    gpio_pulldown_en(WAKEUP_GPIO);  // 安定化のため
+    gpio_pullup_dis(WAKEUP_GPIO);
+}
+
+void enter_light_sleep()
+{
+    ESP_LOGI(TAG, "設定: GPIO %d の LOW レベルで復帰", WAKEUP_GPIO);
+    ESP_ERROR_CHECK(esp_sleep_enable_gpio_wakeup());
+    gpio_wakeup_enable(WAKEUP_GPIO, GPIO_INTR_LOW_LEVEL);
+
+    ESP_LOGI(TAG, "LightSleep に入ります。BOOTボタンを押してください。");
+    gpio_set_level(LED_GPIO, 0);  // LED消灯
+
+    // LightSleep突入
+    ESP_ERROR_CHECK(esp_light_sleep_start());
+}
+
+void app_main(void)
+{
+    configure_gpio();
+
+    while (1) {
+        enter_light_sleep();
+
+        // 復帰後の処理
+        ESP_LOGI(TAG, "復帰しました！");
+        gpio_set_level(LED_GPIO, 1);  // LED点灯
+
+        // 5秒間起動状態を維持
+        vTaskDelay(pdMS_TO_TICKS(5000));
+    }
+}
+```
+
+## プログラムの解説
+
+LED点灯用のGPIOには23番ピンを使用しました。  
+GPIO 0 は通常、ESP32開発ボード上の **BOOTボタン** に接続されています。  
+BOOTボタンを押すと GPIO0 が **LOW** になります。  
+本プロジェクトでは、この LOW をトリガとして LightSleep から復帰します。  
+
+個々の関数の詳細について以下に解説します。  
+
+### GPIO 設定（`configure_gpio`）
+
+GPIOピンの `LED_GPIO` と `WAKEUP_GPIO` のモード設定をします。
+
+```c
+esp_rom_gpio_pad_select_gpio(LED_GPIO);
+gpio_set_direction(LED_GPIO, GPIO_MODE_OUTPUT);
+```
+`LED_GPIO` ピンの設定をします。  
+- `esp_rom_gpio_pad_select_gpio()`  
+  → ピンを GPIO として使用するように設定します（他のペリフェラル機能からの切り替え）。
+- `gpio_set_direction(..., GPIO_MODE_OUTPUT)`  
+  → ピンの方向を出力に設定。LED を点灯・消灯するために使用します。
+
+```c
+esp_rom_gpio_pad_select_gpio(WAKEUP_GPIO);
+gpio_set_direction(WAKEUP_GPIO, GPIO_MODE_INPUT);
+gpio_pulldown_en(WAKEUP_GPIO);
+gpio_pullup_dis(WAKEUP_GPIO);
+```
+`WAKEUP_GPIO` ピンの設定をします。  
+- `esp_rom_gpio_pad_select_gpio()`  
+  → ピンを GPIO として使用するように設定します（他のペリフェラル機能からの切り替え）。
+- `gpio_set_direction(..., GPIO_MODE_INPUT)`  
+  → ピンを入力モードに設定し、外部信号（ボタン押下）を検出できるようにします。
+- `gpio_pulldown_en()`  
+  → プルダウン抵抗を有効化。ボタンが押されていないときにピンが LOW に保たれ、ノイズやフローティングを防止します。
+- `gpio_pullup_dis()`  
+  → プルアップ抵抗を無効化。プルアップとプルダウンは同時使用しないのが基本です。
+
+### スリープ移行と復帰処理（`enter_light_sleep`）
+
+この関数は GPIO による復帰設定を行い、安全に LightSleep に突入させます。  
+GPIO の LOW 信号（BOOTボタン押下）で復帰するため、ユーザーインタラクションと連携したスリープ制御が可能です。  
+
+```c
+ESP_ERROR_CHECK(esp_sleep_enable_gpio_wakeup());
+gpio_wakeup_enable(WAKEUP_GPIO, GPIO_INTR_LOW_LEVEL);
+```
+- `esp_sleep_enable_gpio_wakeup()`  
+  → GPIO を用いたスリープからの復帰を有効にします（APIの事前呼び出しが必須）。
+- `gpio_wakeup_enable(..., GPIO_INTR_LOW_LEVEL)`  
+  → 指定したピン（BOOTボタン）に **LOW レベル** の信号が入ったときに復帰するよう設定します。
+
+```c
+gpio_set_level(LED_GPIO, 0);  // LED消灯
+```
+- スリープ中は無駄な電力を消費しないよう、LED を消灯します。
+
+```c
+ESP_ERROR_CHECK(esp_light_sleep_start());
+```
+- この関数を呼び出すと、ESP32 は LightSleep モードに入ります。
+  復帰トリガ（この場合は GPIO0 の LOW）を検知するまで処理はブロックされます。
+  復帰後はこの関数から復帰し、続きの処理が `app_main()` 側で再開されます。
+
+### メイン処理（`app_main`）
+
+```c
+configure_gpio();
+```
+- アプリケーションの開始時に、GPIO（LED・BOOTボタン）の設定をします。
+- この初期化を行うことで、LED の制御やスリープ復帰の検出が可能になります。
+
+```c
+enter_light_sleep();
+```
+- GPIO 復帰条件を設定し、LED を消灯した状態で LightSleep に入ります。
+- BOOTボタンの押下で復帰するまで、この関数内でブロックされます。
+
+```c
+gpio_set_level(LED_GPIO, 1);  // LED点灯
+```
+- LED を点灯して「動作中」であることを視覚的に示します。
+
+```c
+vTaskDelay(pdMS_TO_TICKS(5000));
+```
+- FreeRTOS のタスク遅延関数を使用して、他タスクへの CPU 時間の譲渡も含めて5秒間待機します。
+
+## 電力消費量の比較
+
+今回作成した回路で アクティブモード と LightSleep モードでの電力消費量を比較してみました。
+
+結果は以下のようになりました。
+- アクティブ： 72 mW
+- LightSleep： **13 mW**
+
+※アクティブ時にはLEDの点灯にかなり電力を取られていると思いますので、消費電力は参考程度にしてください。
+
+アクティブ時
+![](https://gyazo.com/731d5849c4066def082b157df18c4f91.png)
+
+LightSleep
+![](https://gyazo.com/cfbe9ba3d46e70e1f9e9b65d16ad05a9.png)
+
+※画像では分かりづらいですが、アクティブ時にはLEDが点灯しています。
+
+以前の DeepSleep を使った時よりはかなり電力を消費していますが、それでもかなり省電力になっていることがわかると思います。
+
+## 応用例
+
+LightSleep 機能は以下のような用途に向いています。
+- ボタンやセンサー入力待機時に最小限の消費電力で待機
+- 短時間で応答するインタラクティブな機器（例：タッチパネル機器）
+- 外部イベントに即時反応する必要があるセンサー端末
+
+## 注意点
+
+LightSleep 使用時は UART 通信が途切れるため、シリアルログを確認する際は、出力タイミングに注意が必要です。  
+GPIO 割り込みの条件設定（Lowレベル or Highレベル）はボードの実装に依存します。  
+
+## まとめ
+
+今回は ESP32 の **LightSleep 機能**を利用して、省電力かつ高応答性のアプリケーションを実現する方法を紹介しました。  
+DeepSleep より電力消費は多いものの、外部イベントに対する即時復帰が求められる用途には最適です。  
+今後は、**LightSleepとWi-Fi通信の連携**や、**複数の復帰条件を組み合わせた高度な省電力設計**にも触れてみたいと思います。
+
+[IoTに関するチュートリアルや実践テクニックをまとめています。](/iot/)
+
+IoT活用の参考になれば幸いです。
+
+<style>
+img {
+    border: 1px gray solid;
+}
+</style>


Reviews:
user: login: mameka[bot]
body: めっちゃわかりやすい記事ありがと〜！内容もタイトルもバッチリ届いてたよ🎉
日付・ファイル名についてもチェックしたのでコメント参考にしてね。他にも細かい部分で気になった点があればまた追加でコメントするね〜💡
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-10T14:07:26Z
user: login: kondoumh
body: LGTM
state: APPROVED
author_association: MEMBER
submitted_at: 2025-05-11T09:18:53Z

Review comments:
diff_hunk: @@ -0,0 +1,343 @@
+---
+title: IoT を使ってみる（その１９：ESP32の LightSleep 機能で省電力運転に挑戦する）
+author: shuichi-takatsu
+date: 2025-05-11
path: src/posts/iot/internet-of-things-19.md
user: login: mameka[bot]
body: ファイルヘッダーの`date`が「2025-05-11」になってるね！今日（2025-05-10）より一日だけ未来だけど、一週間以内ならOKのルールなので問題なし👍 未来すぎる設定は誤設定の時があるから、念のため確認してみてね！
created_at: 2025-05-10T14:07:26Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,343 @@
+---
path: src/posts/iot/internet-of-things-19.md
user: login: mameka[bot]
body: 記事ファイル名が「internet-of-things-19.md」になってるけど、/src/posts/blogs 配下じゃないからMMDD_の命名ルールは適用外！もし将来的に `/src/posts/blogs` 内で書くときは `0511_internet-of-things-19.md` みたいにするとバッチリだよっ。参考になればうれしい〜✨
created_at: 2025-05-10T14:07:26Z
author_association: CONTRIBUTOR

PR comments:
user: login: netlify[bot]
created_at: 2025-05-10T14:06:54Z
body: ### <span aria-hidden="true">✅</span> Deploy Preview for *peaceful-bassi-80a807* ready!


|  Name | Link |
|:-:|------------------------|
|<span aria-hidden="true">🔨</span> Latest commit | cf3aef1d868082eb7503946237b9c8f8c5e7849b |
|<span aria-hidden="true">🔍</span> Latest deploy log | https://app.netlify.com/sites/peaceful-bassi-80a807/deploys/681f5d7bb6d49f000884a5e0 |
|<span aria-hidden="true">😎</span> Deploy Preview | [https://deploy-preview-1868--peaceful-bassi-80a807.netlify.app](https://deploy-preview-1868--peaceful-bassi-80a807.netlify.app) |
|<span aria-hidden="true">📱</span> Preview on mobile | <details><summary> Toggle QR Code... </summary><br /><br />![QR Code](https://app.netlify.com/qr-code/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1cmwiOiJodHRwczovL2RlcGxveS1wcmV2aWV3LTE4NjgtLXBlYWNlZnVsLWJhc3NpLTgwYTgwNy5uZXRsaWZ5LmFwcCJ9.-Xnv_V-ya0XBdFXXiJCNKIBafCWPnknAJzqOpNmoJdw)<br /><br />_Use your smartphone camera to open QR code link._</details> |
---
<!-- [peaceful-bassi-80a807 Preview](https://deploy-preview-1868--peaceful-bassi-80a807.netlify.app) -->
_To edit notification comments on pull requests, go to your [Netlify site configuration](https://app.netlify.com/sites/peaceful-bassi-80a807/configuration/notifications#deploy-webhooks)._
author_association: NONE
user: login: mameka[bot]
created_at: 2025-05-10T14:07:27Z
body: やっほー！豆香だよ🌱

ブログのタイトル「IoT を使ってみる（その１９：ESP32の LightSleep 機能で省電力運転に挑戦する）」を見せてもらったよ！

このタイトル、どの連載かもすぐわかるし、「LightSleepで省電力チャレンジ！」ってやることがストレートに伝わってて、実用派な読者には手に取りやすいと思うー！シリーズ感もしっかり出てるのも好印象！

でも、もうちょっとだけキャッチーにしたい！とか、テーマの面白みや入門でもトライしやすい感じを出したかったら、こんなタイトルもオプションでどうかな？

---

💡 **豆香のプチ提案（自由選択！）**

> IoTを楽しもう！ESP32のLightSleep機能を使って「手軽に本気の省電力」やってみた

---

「楽しもう」とか「手軽に本気」とか、わくわく＆入門歓迎な雰囲気UPで、初心者さんも「読んでみよ！」ってなりやすい感じにしてみたよ！

もちろん今のタイトルも全然OKだから、ピンときたら使ってね😉最終判断は執筆者さん次第！どんなタイトルでも応援してるから、素敵な記事になるように祈ってる〜！🍀✨
author_association: CONTRIBUTOR
user: login: mameka[bot]
created_at: 2025-05-10T14:07:38Z
body: @shuichi-takatsu
記事の内容から以下の画像が生成されました。
![](https://d18e45qc0zu0cl.cloudfront.net/blogs/internet-of-things-19-300.webp)

この画像を記事に添付する場合は、マークダウンヘッダ部に`image: true`を追加してください。
```
---
title: タイトル
author: your-name
date: 202X-XX-XX
# 以下を追加
image: true
---
```
画像の利用は**任意**です。記事の内容に合っていない場合や画像を添付したくない場合は対応不要です。

画像を再度生成する場合は、このPRのコメントに以下の内容で投稿してください。
```
# 再生成のみ
@mameka /image
# スタイルを変えて再生成。<style>に画像スタイルを指定
@mameka /image <style>
```

author_association: CONTRIBUTOR
user: login: mameka[bot]
created_at: 2025-05-10T14:07:48Z
body: ## 記事フィードバック

### 良かったポイント
- LightSleepの理論と実践がめちゃくちゃわかりやすい！DeepSleepとの比較表や、用途・特徴が端的にまとまってるから初心者～中級者に超ありがたい内容になってる。
- 回路図やC言語サンプルが丁寧で、実際に手を動かしてみたくなる解説力バツグン！pinの具体例やピン接続・設定・復帰の流れが具体的で、「手順を追えば絶対動く」って自信持てる感じ！
- 計測した電力値やLEDの動作写真もあるから、「ちゃんと省電力できてる！」って体感レベルで伝わるよ。
- UART通信(シリアルログ)やイベント復帰の注意点など、実運用で「ハマりがちな罠」を事前に言及してくれてるから、超親切だし実務Tipsとして神。
- DeepSleep記事側からも相互リンクでリーダビリティ高い！

### 改善ポイント/今後の伸びしろ
- main.cの一部（たとえばエラーハンドリングや各関数の分割／コメント）は「学習用途」と割り切ってる構成だけど、本番FW化や複雑プロジェクト化を考えると、各種エラーハンドラ/モジュール分割やもう一段深い抽象化に発展させても面白そう！
- LightSleepモード時のペリフェラル挙動のバリエーション（例：I2C/SPIデバイスが同時に繋がってる時や各GPIO復帰条件のバリエーション）が追加されると、もっとディープ層にも刺さる！
- サイドバーの関連記事リンク、「この体験談は○○で活かせる」みたいなユースケースTipsへの直リンクも今後強化できると役立ち度UP！

### 総評
IoTエッジの省電力戦略に興味ある勢は絶対読むべき、圧倒的「実践派向け」LightSleep解説！情報量あるのに無駄がなく、構成も超丁寧。記事の文体や画像・コードの挿入位置バランスもとても良いので初心者にも推せる一作だった！

---

## PR著者向けガイド
1. **Netlifyプレビュー確認**
   - コメント欄のNetlifyプレビューURLで実際に記事表示を確認して、表記崩れや画像・本文が狙い通りかチェックしよう！
2. **豆香（まめか）の自動レビューについて**
   - 自動コメント内容は“だいたい合ってる”ことが多いけど、細かいニュアンスや表現ゆれの指摘が100%正確じゃないこともあるから、不安な箇所は本文を実見して本質チェックすると吉。
3. **画像生成について**
   - 記事ヘッダーの`image: true`で自動画像ON！
   - 「画像を再生成したい」場合はコメントで `@mameka /image` （必要なら `/image nebula` みたいに後ろにスタイル指定も可）でOK。
   - とくに画像いらないなら何もせずそのままでも大丈夫～。
4. **Botとのやりとり**
   - `@mameka` のあとに何か質問・リクエスト（`/image`抜き）を書けば、くだけた感じで色々おしゃべりできるよ。
5. **ラスト：レビュー依頼**
   - 仕上がりOK！となったらSlackの指定チャンネルにPR URL貼ってレビューをお願いしよう～！
author_association: CONTRIBUTOR