بررسی مُد های ذخیره انرژی در ESP32 و مصرف آنها

تراشه ESP32 بیتردید یکی از رقبای جدی بسیاری از سیستمهای مبتنی بر WiFi/MCU به شمار میآید که از لحاظ عملکرد و قیمت، از بسیاری از آنها پیشی میگیرد. با این حال، بسته به حالتی که تراشه در آن قرار دارد، ESP32 میتواند دستگاهی نسبتاً پرمصرف از نظر انرژی باشد.
در پروژههای اینترنت اشیا (IoT) که از طریق منبع برق شهری تغذیه میشوند، مصرف انرژی معمولاً مسئله مهمی نیست؛ اما اگر قصد دارید پروژه خود را با باتری تغذیه کنید، حتی هر میلیآمپر ساعت نیز اهمیت پیدا میکند.
راهکار پیشنهادی استفاده از یکی از حالتهای خواب (Sleep Mode) در ESP32 است تا مصرف انرژی را کاهش دهید. این روش، راهبردی عالی برای افزایش عمر باتری در پروژههایی است که نیازی به فعالیت دائمی ندارند.
این مطلب فقط برای معرفی حالت های ذخیره انرژی در برد ESP32 است، اگر میخواهید نحوه عملی کدنویسی و اجرای حالت خواب عمیق را بدانید، مقاله خواب عمیق Deep Sleep در ESP32 (آموزش جامع) را بخوانید.
حالت خواب در ESP32
حالت خواب ESP32 یک وضعیت صرفهجویی در مصرف انرژی است. زمانی که تراشه مورد استفاده قرار نمیگیرد، میتواند به این حالت وارد شود. در این حالت، تمامی دادهها در حافظه RAM ذخیره شده و تنها به اندازهای انرژی دریافت میشود که دادهها حفظ شوند، در حالی که سایر واحدهای جانبی غیرضروری غیرفعال میگردند.
ساختار داخلی تراشه ESP32
آشنایی با اجزای داخلی تراشه ESP32 کمک میکند تا درک بهتری از نحوه مدیریت مصرف انرژی توسط آن داشته باشیم. نمودار بلوکی (Block Diagram) این تراشه اطلاعات مفیدی در این زمینه ارائه میدهد.

تراشه ESP32 دارای یک پردازنده دو هستهای 32 بیتی بوده و به همراه آن، شامل 448 کیلوبایت حافظه ROM و 520 کیلوبایت حافظه SRAM و 4 مگابایت حافظه فلش میباشد.
علاوه بر این، این تراشه دارای ماژول WiFi، ماژول بلوتوث، تسریعکننده رمزنگاری (Crypto Accelerator) بهعنوان یک کمکپردازنده تخصصی برای انجام عملیات رمزنگاری، ماژول RTC (ساعت زمان واقعی) و چندین واحد جانبی مختلف دیگر است.
در ادامه، ترجمه رسمی و کامل این بخش از متن با رعایت اصول سئو و بدون خلاصهسازی ارائه شده است:
حالتهای مصرف انرژی در ESP32
به لطف مدیریت پیشرفته انرژی در تراشه ESP32، این ماژول پنج حالت قابلپیکربندی برای مصرف انرژی در اختیار کاربر قرار میدهد. بر اساس نیاز پروژه، تراشه میتواند میان این حالتها جابهجا شود. این حالتها شامل موارد زیر هستند:
- حالت فعال (Active Mode)
- حالت خواب مودم (Modem Sleep Mode)
- حالت خواب سبک (Light Sleep Mode)
- حالت خواب عمیق (Deep Sleep Mode)
- حالت هایبرنیشن (Hibernation Mode)
هر یک از این حالتها دارای ویژگیها و قابلیتهای خاص در زمینه صرفهجویی در مصرف انرژی هستند. در ادامه به بررسی دقیق هرکدام میپردازیم.
حالت فعال ESP32 (ESP32 Active Mode)
حالت عادی عملکرد ESP32 که به آن Active Mode نیز گفته میشود، حالتی است که در آن تمامی واحدهای جانبی تراشه فعال هستند.
در این حالت، چون تمامی اجزا از جمله ماژول WiFi، هسته پردازنده و ماژول بلوتوث همیشه روشن و در حال کار هستند، مصرف جریان تراشه حدود 240 میلیآمپر است. همچنین، طبق مشاهدات، در مواقعی که همزمان از WiFi و بلوتوث استفاده میشود، مصرف جریان حتی به بیش از 790 میلیآمپر نیز میرسد.

طبق دیتاشیت رسمی ESP32، میزان مصرف انرژی در زمان فعالیتهای RF (موج رادیویی) در حالت فعال به شرح زیر است:
| وضعیت | میزان مصرف انرژی |
|---|---|
| ارسال Wi-Fi با توان 13dBm تا 21dBm | 160 تا 260 میلیآمپر |
| ارسال Wi-Fi یا بلوتوث با توان 0dBm | 120 میلیآمپر |
| دریافت و شنود Wi-Fi/BT | 80 تا 90 میلیآمپر |
این حالت بیشترین مصرف انرژی را دارد و از نظر بهینهسازی مصرف، ضعیفترین حالت است. بنابراین برای صرفهجویی در مصرف باتری، بهتر است ویژگیهای غیرضروری را غیرفعال کرده و به یکی از حالتهای خواب تغییر وضعیت دهید.
حالت خواب مودم ESP32 (ESP32 Modem Sleep)
در حالت Modem Sleep، تمامی بخشهای تراشه بهجز ماژول WiFi، بلوتوث و رادیو فعال هستند. CPU همچنان فعال باقی میماند و کلاک پردازنده نیز قابل تنظیم است.
در این حالت، مصرف انرژی تراشه بسته به سرعت اجرای پردازنده متفاوت است:
- در سرعت پایین: حدود 3 میلیآمپر
- در سرعت بالا: حدود 20 میلیآمپر

برای حفظ اتصال شبکه، ماژول WiFi، بلوتوث و رادیو در فواصل زمانی از پیش تعیینشده بیدار میشوند. این مکانیسم به نام الگوی خواب انجمنی (Association Sleep Pattern) شناخته میشود.
در این الگو، ESP32 بین حالت فعال و حالت خواب مودم به طور خودکار سوئیچ میکند.
برای پیادهسازی این روش، ESP32 در حالت Station Mode به روتر متصل شده و از مکانیسم بیکن DTIM بهره میبرد. ماژول WiFi بین دو بازه زمانی بیکن DTIM غیرفعال میشود و دقیقاً پیش از رسیدن بیکن بعدی، دوباره فعال میگردد. این روش باعث کاهش قابل توجه مصرف انرژی میشود.
مدت زمان خواب ESP32 در این حالت به بازه زمانی ارسال بیکن DTIM توسط روتر وابسته است، که معمولاً بین 100 میلیثانیه تا 1000 میلیثانیه متغیر است.
مکانیسم بیکن DTIM چیست؟
DTIM مخفف عبارت Delivery Traffic Indication Message است.
![]()
در این مکانیسم، اکسسپوینت (Access Point) یا روتر، به صورت دورهای فریمهای بیکن را پخش میکند. هر یک از این فریمها شامل اطلاعات مربوط به شبکه هستند و نقش حیاتی در اعلام وجود شبکه بیسیم و همزمانسازی دستگاههای متصل ایفا میکنند.
حالت خواب سبک در ESP32 (ESP32 Light Sleep)
حالت Light Sleep مشابه حالت Modem Sleep است، زیرا تراشه در هر دو حالت از الگوی خواب انجمنی (Association Sleep Pattern) پیروی میکند. تفاوت اصلی آن است که در حالت خواب سبک، پردازنده (CPU)، بخش عمدهای از حافظه RAM و واحدهای دیجیتال جانبی بهصورت Clock-Gated درمیآیند.
Clock Gating چیست؟
Clock Gating یکی از تکنیکهای محبوب در مدیریت مصرف انرژی است که با غیرفعال کردن سیگنال کلاک (Clock) در زمانهایی که مدار مورد استفاده نیست، باعث کاهش توان دینامیک مصرفی میشود.
این تکنیک با هرس کردن درخت کلاک، مصرف انرژی را کاهش میدهد. این کار باعث غیرفعال شدن بخشهایی از مدار شده و مانع از تغییر وضعیت فلیپفلاپها میگردد. از آنجا که تغییر وضعیت فلیپفلاپها انرژی مصرف میکند، غیرفعال بودن آنها باعث کاهش مصرف انرژی به صفر میشود.
عملکرد ESP32 در حالت Light Sleep
در حالت خواب سبک، کلاک پردازنده غیرفعال شده و به همین دلیل CPU در حالت توقف (Pause) قرار میگیرد. اما در عین حال، RTC و پردازنده کممصرف ULP همچنان فعال باقی میمانند. نتیجه این فرآیند، مصرف انرژی پایینتر نسبت به حالت Modem Sleep است که تقریباً 0.8 میلیآمپر برآورد میشود.

پیش از ورود به حالت خواب سبک، ESP32 وضعیت داخلی خود را در حافظه RAM ذخیره میکند و هنگام بیدار شدن، همان وضعیت را بازیابی مینماید. به این فرآیند نگهداری کامل RAM (Full RAM Retention) گفته میشود.
حالت خواب عمیق در ESP32 (Deep Sleep)
در حالت Deep Sleep، پردازندهها (CPU)، بیشتر بخشهای RAM و تمامی واحدهای جانبی دیجیتال غیرفعال میشوند. تنها بخشهایی از تراشه که فعال باقی میمانند عبارتند از:
- پردازنده کممصرف ULP
- کنترلر RTC
- واحدهای جانبی RTC
- حافظه سریع و کند RTC (RTC Fast/Slow Memory)
مصرف انرژی در این حالت، بسته به پیکربندی تراشه، بین 0.15 میلیآمپر (در صورت فعال بودن ULP) و 10 میکروآمپر متغیر است.

در این حالت، پردازنده اصلی کاملاً خاموش میشود. با این حال، پردازنده ULP میتواند خواندن اطلاعات از سنسورها را انجام داده و در صورت نیاز، پردازنده اصلی را بیدار کند. این الگو با نام ULP Sensor-Monitored Pattern شناخته میشود و برای کاربردهایی مفید است که در آنها بیدار شدن CPU بر اساس یک رویداد خارجی یا تایمر ضروری است، در حالی که باید حداقل مصرف انرژی حفظ شود.
به همراه CPU، حافظه اصلی تراشه نیز غیرفعال میشود، در نتیجه تمامی دادههای ذخیرهشده در آن از بین رفته و قابل بازیابی نخواهد بود.
حفظ اطلاعات در حالت Deep Sleep
از آنجا که حافظه RTC در این حالت فعال باقی میماند، محتویات آن حتی در حالت خواب عمیق نیز حفظ میشود و پس از بیدار شدن تراشه قابل بازیابی است. به همین دلیل است که ESP32 اطلاعات اتصال WiFi و Bluetooth را پیش از ورود به حالت Deep Sleep در حافظه RTC ذخیره میکند.
اگر بخواهید دادهای را پس از ریبوت کردن استفاده کنید، باید آن را در حافظه RTC ذخیره نمایید. برای این کار میتوانید از ویژگی RTC_DATA_ATTR در تعریف متغیر استفاده کنید. بهعنوان مثال:
RTC_DATA_ATTR int myVar = 0;
هنگامیکه تراشه از حالت Deep Sleep بیدار میشود، فرآیند ریست اجرا شده و برنامه از ابتدا آغاز میگردد.
Wake Stub در حالت Deep Sleep
زمانی که ESP32 از حالت خواب عمیق (Deep Sleep) بیدار میشود، میتواند بخشی از کد به نام Deep Sleep Wake Stub را اجرا کند. این یک قطعه کد کوچک است که بلافاصله پس از بیدار شدن تراشه اجرا میشود؛ پیش از آنکه هرگونه مقداردهی اولیه، بوتلودر یا کدهای ESP-IDF اجرا شوند.
پس از اجرای Wake Stub، تراشه میتواند یکی از دو مسیر زیر را طی کند:
- یا دوباره به حالت خواب بازگردد،
- یا فرآیند راهاندازی عادی ESP-IDF را آغاز کند.
اگر علاقهمند هستید درباره حالت Deep Sleep و منابع بیدارباش آن بیشتر بدانید، میتوانید آموزش تخصصی مربوط به منابع Wake-up در ESP32 را مطالعه نمایید.
حالت Hibernate در ESP32 (ESP32 Hibernation Mode)
حالت Hibernate بسیار مشابه حالت Deep Sleep است. با این تفاوت که در این حالت، نوسانساز داخلی 8 مگاهرتز (8 MHz oscillator) و پردازنده فوق کممصرف ULP نیز غیرفعال میشوند. تنها بخشهایی که فعال باقی میمانند عبارتند از:
- یک تایمر RTC که بر اساس کلاک کند (Slow Clock) کار میکند
- تعداد محدودی از پایههای RTC GPIO که امکان بیدار کردن تراشه را دارند
به دلیل خاموش شدن حافظه بازیابی RTC (RTC Recovery Memory) در این حالت، هیچ دادهای در زمان Hibernate قابل ذخیرهسازی نیست.

در نتیجه این غیرفعالسازیهای گسترده، مصرف انرژی تراشه در حالت Hibernate به شدت کاهش یافته و در حدود 2.5 میکروآمپر (µA) میرسد.
کاربرد حالت Hibernate در پروژهها
حالت Hibernate گزینهای فوقالعاده برای پروژههایی است که نیاز به فعالیت مداوم ندارند. اگر پروژه شما قرار است برای مدتهای طولانی در حالت غیرفعال باشد و تنها در بازههایی خاص فعالیت کند، Hibernate میتواند با حفظ انرژی باتری، عملکرد بهینهای برایتان فراهم آورد.








