این راهنما نحوه استفاده از مد خواب عمیق را در ESP8266 با استفاده از Arduino IDE نشان می دهد. خواب عمیق را با بیدار شدن توسط تایمر و خواب عمیق را با بیدار شدن توسط عوامل خارجی با استفاده از پین بازنشانی (RST) پوشش خواهیم داد.

معرفی حالت خواب عمیق در ESP8266
اگر پروژه ای با برد ESP8266 ساخته اید که با باتری کار می کند، یا اگر برد ESP8266 NodeMCU خود را به پاوربانک متصل کرده اید. پس از مدتی، متوجه می شوید که باتری مدت زیادی دوام نمی آورد، به خصوص اگر از Wi-Fi استفاده می کنید.

در این شرایط اگر ESP8266 خود را در حالت خواب عمیق قرار دهید، مصرف برق را کاهش می دهد و باتری های شما بیشتر دوام می آورد.
استفاده از مد خواب عمیق در ESP8266 به معنای قطع کردن فعالیتهایی است که در حین اجر انرژی بیشتری مصرف میکنند (مانند Wi-Fi) اما عملکرد کافی برای بیدار کردن پردازنده در هنگام وقوع اتفاق تعریف شده باقی میماند.
انواع حالت های خواب در ESP8266
سه نوع مختلف حالت خواب وجود دارد: modem sleep, light sleep, deep sleep. جدول زیر تفاوت بین هر حالت (بر اساس دیتاشیت ESP8266) را نشان می دهد.
Item | Modem-sleep | Light-sleep | Deep-sleep |
Wi-Fi | OFF | OFF | OFF |
System clock | ON | OFF | OFF |
RTC | ON | ON | ON |
CPU | ON | Pending | OFF |
Substrate current | 15 mA | 0.4 mA | ~20 uA |
Average current (DTIM = 1) | 16.2 mA | 1.8 mA | – |
Average current (DTIM = 3) | 15.4 mA | 0.9 mA | – |
Average current (DTIM = 10) | 15.2 mA | 0.55 mA | – |
همه آنها کاربردهای متفاوتی دارند و باید در برنامه های متفاوت به نسبت کاربرد مورد استفاده قرار گیرند.
در این مقاله، حالت خواب عمیق را بررسی خواهیم کرد.در این حالت به جز واحد RTC همه چیز خاموش خواهد شد.

این کارآمدترین گزینه است زیرا در این حالت تراشه ESP کمترین میزان جریان، تقریباً 20uA می کشد. با این حال، اگر از یک برد توسعه با ویژگی هایی مانند ال ای دی و غیره استفاده کنید، نمی توانید به چنین حالت کم مصرفی برسید زیرا عناصر دیگر برد مقداری جریان کشی خواهند داشت.
مثالی از یک کاربرد حالت خواب عمیق در ESP8266
شاید برای شما سوال پیش بیاید حالت خواب عمیق در چه کاربردهایی ممکن است مورد استفاده قرار بگیرد. یک مثال از کاربرد حالت خواب عمیق به این شکل میباشد:
- ماژول ESP8266 به وایفای متصل میشود
- یک کار از پیش تعیین شده را انجام میدهد. به طور مثال خواندن دما و ارسال ان روی سرور
- سپس به مدت زمان از پیش تعیین شده به حالت خواب عمیق میرود
- ESP8266 از حالت خواب عمیق بیرون میاید (بیدار میشود)
- این روند دوباره تکرار میشود
منابع Wake up
پس از قرار دادن ESP8266 در حالت خواب عمیق، دو راه برای بیدار کردن آن وجود دارد:
- بیدار شدن توسط تایمر: ESP8266 پس از یک دوره زمانی از پیش تعریف شده بیدار از حالت خواب عمیق خارج میشود.
- بیدار کردن توسط ریست: ESP8266 با فشار دادن دکمه RST بیدار می شود (ESP8266 دوباره راه اندازی می شود)
خارج شدن از خواب عمیق توسط تایمر
برای استفاده از تایمر برای خارج شدن از حالت خواب عمیق در ESP8266، باید پین RST را به GPIO 16 که با لیبل D0 در یک برد NodeMCU مشخص شده است وصل کنید. در دیاگرام شماتیک زیر اماده است:

حتما توجه داشته باشید که فقط پس از آپلود کد، پین RST را به GPIO 16 وصل کنید.
اگر به پینآوت NodeMCU نگاهی بیندازید، میبینید که GPIO 16 یک پین خاص است و دارای ویژگی WAKE است.

جهت اطلاعات بیشتر راجب پین های ESP8266 میتوانید این پست را مطالعه نمایید: راهنمای جامع پین های ESP8266 (کدام پین ها را میتوانیم استفاده کنیم؟)
در حالی که ESP8266 در حال اجرا است، پین ریست ESP8266 همیشه HIGH است. با این حال، هنگامی که پایه RST سیگنال LOW را دریافت می کند، میکروکنترلر را مجددا راه اندازی می کند.
اگر یک تایمر خواب عمیق در ESP8266 تنظیم کنید، پس از پایان تایمر، GPIO 16 یک سیگنال LOW ارسال می کند. این بدان معناست که GPIO 16، هنگامی که به پین RST متصل می شود، می تواند ESP8266 را پس از مدت زمان مشخصی بیدار کند.
کد خارج شدن از خواب عمیق در ESP8266 توسط تایمر
پس از نصب افزونه بردهای ESP8266 برای Arduino IDE (نصب بردهای ESP8266 در آردوینو IDE (ویندوز – مک – لینوکس))، به Tools رفته و NodeMCU (ESP-12E Module) را انتخاب کنید. کدی که باید در ESP خود آپلود کنید در اینجا آمده است:
/*
* ESP8266 Deep sleep mode example
* Rui Santos
* Complete Project Details https://randomnerdtutorials.com
*/
void setup() {
Serial.begin(115200);
Serial.setTimeout(2000);
// Wait for serial to initialize.
while(!Serial) { }
// Deep sleep mode for 30 seconds, the ESP8266 wakes up by itself when GPIO 16 (D0 in NodeMCU board) is connected to the RESET pin
Serial.println("I'm awake, but I'm going into deep sleep mode for 30 seconds");
ESP.deepSleep(30e6);
// Deep sleep mode until RESET pin is connected to a LOW signal (for example pushbutton or magnetic reed switch)
//Serial.println("I'm awake, but I'm going into deep sleep mode until RESET pin is connected to a LOW signal");
//ESP.deepSleep(0);
}
void loop() {
}
در این مثال، پیامی را در مانیتور سریال چاپ می کنیم:
Serial.println("I'm awake, but I'm going into deep sleep mode until RESET pin is connected to a LOW signal");
پس از آن، ESP8266 به مدت 30 ثانیه به حالت خواب می رود.
ESP.deepSleep(30e6);
برای قرار دادن ESP8266 در خواب عمیق، از ESP.deepsleep(uS) استفاده میکنید و زمان خواب را بر حسب میکروثانیه به عنوان آرگومان ارسال میکنید.
در این حالت 30e6 برابر با 30000000 میکروثانیه است که برابر با 30 ثانیه است.
پس از آپلود کد، دکمه RST را فشار دهید تا اجرای کد شروع شود و سپس RST را به GPIO 16 وصل کنید. ESP8266 باید هر 30 ثانیه یکبار بیدار شود و مطابق شکل زیر پیامی را در مانیتور سریال چاپ کند.

این مثال یک پیام را در مانیتور سریال چاپ می کند، اما در یک برنامه اصلی، شما یک کار مفید مانند درخواست دیتا، انتشار یا قرائت سنسور و غیره را انجام خواهید داد.
مدار تایمر خارج شدن از خواب عمیق در ESP-01
اگر می خواهید همین کار را با برد ESP-01 انجام دهید، باید سیمی را مطابق شکل زیر لحیم کنید. آن پین کوچک GPIO 16 است و باید به پین RST متصل شود.

با این حال،این پین ها به قدری ریز هستند که لحیم کردن سیم به آن به GPIO 16 در ESP-01 واقعاً سخت است… بنابراین، برای این حالت بیدار شدن باید از برد NodeMCU یا یک تراشه خالی ESP12-E استفاده کنید.

جهت اطلاعات بیشتر راجب پین های ESP8266 میتوانید این پست را مطالعه نمایید: راهنمای جامع پین های ESP8266 (کدام پین ها را میتوانیم استفاده کنیم؟)
خارج شدن از خواب عمیق در ESP8266 توسط تحریک خارجی
همچنین میتوانید ESP8266 را با تحریک خارجی، مانند فشار دادن یک دکمه یا سوئیچ، بیدار کنید. فقط باید ESP8266 را برای مدت زمان نامحدودی در حالت خواب عمیق قرار دهید و سپس پین RST را روی LOW قرار دهید تا بیدار شود.
برای آزمایش این تنظیمات، همانطور که در دیاگرام شماتیک زیر نشان داده شده است، یک دکمه فشاری به برد ESP8266 خود متصل کنید. وقتی دکمه فشاری را فشار می دهید، پین RST به حالت 0 می رود.

اگر از ESP-01 استفاده می کنید، به جای این، شماتیک بعدی را مشاهده کنید.

کد خارج شدن از خواب عمیق توسط تحریک خارجی
کد زیر را روی برد ESP8266 خود آپلود کنید.
/*
* ESP8266 Deep sleep mode example
* Rui Santos
* Complete Project Details https://randomnerdtutorials.com
*/
void setup() {
Serial.begin(115200);
Serial.setTimeout(2000);
// Wait for serial to initialize.
while(!Serial) { }
// Deep sleep mode for 30 seconds, the ESP8266 wakes up by itself when GPIO 16 (D0 in NodeMCU board) is connected to the RESET pin
//Serial.println("I'm awake, but I'm going into deep sleep mode for 30 seconds");
//ESP.deepSleep(30e6);
// Deep sleep mode until RESET pin is connected to a LOW signal (for example pushbutton or magnetic reed switch)
Serial.println("I'm awake, but I'm going into deep sleep mode until RESET pin is connected to a LOW signal");
ESP.deepSleep(0);
}
void loop() {
}
این کد ESP8266 را برای مدت زمان نامحدودی در حالت خواب عمیق قرار می دهد. برای اینکار، فقط باید 0 را به عنوان آرگومان به تابع deepSleep() ارسال کنید:
ESP.deepSleep(0);
ESP تنها زمانی از حالت خواب عمیق خارج می شود که چیزی برد را ریست کند. در این مثال، فشار دادن یک دکمه است که پین RST را به GND متصل میکند.
وقتی دکمه را فشار میدهید، ESP8266 بیدار میشود، کار برنامهریزی شده را انجام میدهد و تا زمانی که یک مجددا ریست تحریک شود، به حالت خواب برمیگردد.
اندازه گیری جریان
وقتی برد در حالت خواب عمیق است، میزان مصرف جریان را با یک مولتی متر اندازه گیری کنید تا ببینید چقدر برق مصرف می کند.
در اینجا نحوه قرار دادن پروب های مولتی متر آمده است.

هنگامی که ESP-01 در حالت خواب عمیق است، فقط از 0.3 میلی آمپر استفاده می کند که تقریباً 300uA است.

به خاطر داشته باشید که در هنگام استفاده معمولی با Wi-Fi، ESP8266 می تواند بین 50 تا 170 میلی آمپر مصرف کند.
جمع بندی
اکنون که نحوه استفاده از تابع deepSleep() را میدانید، باتری پروژه شما می تواند بیشتر دوام بیاورد.
