اگر تابحال در حوزه تکنولوژی فعالیت داشته اید، ممکن است نام ESP32 به گوشتان خوردهباشد. ESP32 یک میکروکنترلر قدرتمند و چندمنظوره است که توسط شرکت Espressif Systems طراحی و تولید میشود. این بورد به دلیل ویژگیهای منحصربهفرد در زمینه پروژههای اینترنت اشیاء(IoT)، ساخت ربات و دستگاههای هوشمند، توسعه برنامههای بلوتوث و WiFi و غیره استفاده میشود.
از ویژگیهای این بورد میتوان به قدرت محاسباتی بالا، اتصالات بیسیم (شامل ماژولهای WiFi و بلوتوث) و توانایی در رمزگذاری و رمزنگاری اطلاعات اشاره نمود. اما یکی از مهمترین خصوصیتهای این بورد دارا بودن حالت خواب یا همان sleep mode هست که به دستگاه این قابلیت را میدهد تا در مصرف انرژی و باتری صرفهجویی کند. درادامه این پست آموزشی به معرفی sleep mode ، الگوهای مختلف آن، قابلیتهای آنها و همچنین نحوه اجرایشان در کد میپردازیم.
Sleep mode و حالات مختلف آن:
همانطور که پیشتر در این پست آموزشی گفته شد، حالت sleep mode یکی از ویژگیهای بورد ESP32 میباشد که توانایی ذخیرهسازی باتری را با قراردادن دستگاه در حالت کممصرف فراهم میکند. Sleep mode دارای الگوهای مختلفی است که به کاربر این امکان را میدهد تا با توجه به نوع مصرف دستگاه از هریک از این الگوها استفاده کند؛ که عبارتند از:- Modem Sleep Mode
- Light Sleep Mode
- Deep Sleep Mode
- Hibernation Mode
Modem Sleep :
در این الگو با غیرفعال شدن ماژولهای بلوتوث و WiFi ، دستگاه وارد فاز ذخیره باتری میشود. در مقایسه با حالت Active که در آن تمامی ماژولها فعال هستند و دستگاه 160 تا 260 میلیآمپر انرژی مصرف میکند، Modem sleep مصرف انرژی را به 20 الی 3 میلیآمپر کاهش میدهد. این الگوی خواب، بورد ESP32 را بین دو حالت Active و Modem sleep سوئیچ میکند و برای تغییر حالت بین این دو الگو، ESP32 از مکانیزم DTIM beacon استفاده میکند. مکانیزم DTIM beacon چیست؟ این مکانیزم، دادهها را به صورت چندگانه و با سیگنالهایی با دوره متناوب یکسان برای تمامی ایستگاههای متصل به شبکه (AP/Router) میفرستد و امکان دریافت دادههای به تعویقافتاده را فراهم میکند تا این ایستگاهها بتوانند در بازههای خودکار از حالت صرفهجویی بیدار شده و دادهها را دریافت کنند.Light Sleep :
این الگوی خواب شبیه به Modem sleep هست و از الگوی خواب منسجم پیروی میکند. در این الگو، علاوه بر ماژولهای WiFi و بلوتوث، CPU و بخشهایی از RAM متوقف میشوند و دستگاه باتری بیشتری ذخیره میکند و مصرف باتری را به 0.8 میلیآمپر میرساند. هرچند که ماژولهای WiFi و بلوتوث را میتوان در حالت Light sleep با توجه به نیاز دستگاه فعال نگه داشت؛ اما این کار باعث مصرف بیشتر باتری میشود. در طول این الگو، درحالی که CPU متوقف میشود، ماژولهای RTC(Real-Time Clock) و پردازنده ULP(Ultra-Low Power) فعال باقی میمانند تا بتوانند زمان دقیق را اندازه گیری و تسکهای کوچک و ساده را انجام دهند.Deep Sleep :
الگوی Deep sleep یا همان خواب عمیق، CPU و RAM را به همراه ماژولهای WiFi و بلوتوث و دیگر اجزای دیجیتال غیرفعال میکند و مصرف دستگاه را تا 10 میکروآمپر کاهش میدهد و فقط ماژولهای ULP و RTC فعال باقی میمانند. وظیفه پردازنده ULP ، خواندن داده از سنسورها و فعال کردن CPU در صورت نیاز است. از آنجایی که RAM به همراه CPU غیرفعال میشود، تمام دادههای ذخیرهشده در آن از بین رفته و غیرقابلدسترس میشوند. هرچند که با فعال باقی ماندن ماژول RTC، حافظه RTC نیز فعال باقی مانده و میتواند دادههای WiFi و بلوتوث را پیش از ورود به حالت Deep Sleep در خود ذخیره کند و پس از بیدار شدن بورد، این دادهها را بازیابی و مورد استفاده قرار دهد.Hibernation :
این الگو که بسیار شبیه به حالت Deep sleep است و به خواب زمستانی شناخته میشود، علاوه بر CPU و RAM ، پردازنده ULP را نیز غیرفعال میکند و تنها ماژول RTC فعال میماند و موجب میشود تا مصرف باتری به حدود 2.5 میکروآمپر برسد. درحالت خواب زمستانی، بر خلاف Deep sleep، حافظه RTC نیز غیرفعال میشود؛ در نتیجه در طول این الگوی خواب دادهها را نمیتوان ذخیره و بازیابی کرد.نحوه استفاده از Sleep Mode ها در کد:
حال که با هریک از الگوهای خواب آشنا شدیم، لازم است تا چگونگی استفاده از هریک از آنها را در قالب کد نیز بررسی کنیم. در ادامه به بررسی syntax ها و Header file های لازم جهت فعال کردن Sleep Mode ها و غیرفعال کردنشان به کمک تایمر و همچنین ذکر مثال میپردازیم.Modem Sleep Mode :
برای فعالسازی این حالت خواب، از فایل Header زیر استفاده میشود:- `esp_sleep.h`
- `WIFI_PS_MIN_MODEM`
- `WIFI_PS_MAX_MODEM`

Light Sleep Mode :
Header file های استفاده شده در این الگو همانند الگوی خواب پیشین است. برای فعالسازی آن نیز از تابع `()esp_light_sleep_start` استفاده میشود. حال نحوه فعالسازی در قالب کد را بررسی میکنیم:
همانطور که میبینید تابع فعالسازی الگوی Light sleep در قسمت ()loop به کار رفته است. کد از ابتدا اجرا میشود تا به تابع `()esp_light_sleep_start` برسد؛ سپس به خواب میرود و پس از 10 ثانیه بیدار میشود. بعد از بیدار شدن، کد دوباره از ابتدا اجرا میشود؛ بنابراین بعد از تابع `()esp_light_sleep_start`نباید کد دیگری نوشت زیرا انجام نخواهد شد.
Deep Sleep Mode :

Hibernation Mode :
بسیاری از موارد این حالت خواب شبیه به حالت Deep sleep هست؛ بنابراین با ذکر مثال نحوه استفاده از این حالت را در بستر کد بررسی میکنیم.
- ESP_PD_DOMAIN_RTC_SLOW_MEM
- ESP_PD_DOMAIN_RTC_FAST_MEM
- ESP_PD_DOMAIN_RTC_PERIPH
- ESP_PD_DOMAIN_RTC_IO
- ESP_PD_DOMAIN_RTC_FAST_CLK
- ESP_PD_OPTION_ON
- ESP_PD_OPTION_OFF
- ESP_PD_OPTION_AUTO
- متغیرهای ssid, password: دریافت IP address و password روتر(Router)
- متغیر sleepDuration: طول دوره خواب دستگاه.
- متغیر measurementInterval: دوره تناوب اندازه گیری داده توسط سنسورها (هر 60 ثانیه یکبار داده اندازه گیری میکند)
- تابع sendDataToServer: مقداردهی به شاخصهای اندازهگیری و فرستادن دیتا به سرور مرکزی به صورت JSON
- فراخوانی تابع sendDataToServer
- ست کردن تایمر برای خاتمه Sleep mode
- وارد شدن دستگاه به الگوی Deep sleep
Homehttps://m1cr0lab-esp32.github.io/sleep-modes
