در پروژههای باتریخور (مثل سنسورهای بیسیم)، مصرف انرژی حیاتی است. ESP32 چند حالت کممصرف دارد که مهمترین آنها Deep Sleep است؛ در این حالت تقریباً همهٔ بخشهای تراشه خاموش میشوند و مصرف جریان از چند ده میلیآمپر به چند میکروآمپر میرسد. این API مستقیماً از ESP-IDF (نه یک کتابخانهٔ اضافه) در دسترس اسکچهای Arduino است.
ورود به حالت Deep Sleep با تایمر بیدارباش
#include <esp_sleep.h>
void setup() {
Serial.begin(115200);
delay(500);
Serial.println("در حال انجام کار...");
delay(2000);
Serial.println("رفتن به خواب عمیق برای ۱۰ ثانیه");
esp_sleep_enable_timer_wakeup(10 * 1000000ULL); // میکروثانیه
esp_deep_sleep_start();
}
void loop() {
// این تابع هرگز اجرا نمیشود؛ چون بلافاصله بعد از setup وارد خواب عمیق میشویم
}با فراخوانی esp_deep_sleep_start()، برد کاملاً ریست میشود و کل برنامه (از ابتدای setup) دوباره اجرا میشود؛ متغیرهای عادی از بین میروند، مگر با ویژگی RTC_DATA_ATTR در حافظهٔ RTC ذخیره شده باشند.
تشخیص علت بیدار شدن و حفظ داده در RTC Memory
#include <esp_sleep.h>
RTC_DATA_ATTR int bootCount = 0; // این متغیر در Deep Sleep هم حفظ میشود
void setup() {
Serial.begin(115200);
bootCount++;
Serial.print("شمارهٔ بیدار شدن: ");
Serial.println(bootCount);
esp_sleep_wakeup_cause_t reason = esp_sleep_get_wakeup_cause();
if (reason == ESP_SLEEP_WAKEUP_TIMER) {
Serial.println("از خواب عمیق بیدار شدم (تایمر)");
} else {
Serial.println("روشنشدن عادی (پاور یا ریست)");
}
esp_sleep_enable_timer_wakeup(10 * 1000000ULL);
esp_deep_sleep_start();
}
void loop() {}کاربرد عملی
سناریوی رایج: بیدار شدن هر ۱۰ دقیقه، خواندن سنسور، ارسال داده با Wi-Fi/MQTT (درسهای ۱۱ و ۱۳)، و بازگشت به خواب عمیق. این الگو میتواند عمر باتری یک سنسور بیسیم را از چند روز به چند ماه برساند.
کارگاه عملی: از متغیر bootCount در حافظهٔ RTC (با RTC_DATA_ATTR) استفاده کنید تا هر بار پس از بیدار شدن، شمارنده افزایش یابد و چاپ شود.