پیشرفته⏱ 17 دقیقه مطالعه

در پروژه‌های باتری‌خور (مثل سنسورهای بی‌سیم)، مصرف انرژی حیاتی است. ESP32 چند حالت کم‌مصرف دارد که مهم‌ترین آن‌ها Deep Sleep است؛ در این حالت تقریباً همهٔ بخش‌های تراشه خاموش می‌شوند و مصرف جریان از چند ده میلی‌آمپر به چند میکروآمپر می‌رسد. این API مستقیماً از ESP-IDF (نه یک کتابخانهٔ اضافه) در دسترس اسکچ‌های Arduino است.

ورود به حالت Deep Sleep با تایمر بیدارباش

CPP
#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

CPP
#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 (درس‌های ۱۱ و ۱۳)، و بازگشت به خواب عمیق. این الگو می‌تواند عمر باتری یک سنسور بی‌سیم را از چند روز به چند ماه برساند.

شبیه‌سازی زندهٔ Deep Sleep — دقیقاً همین کد؛ در سریال مانیتور Wokwi، شمارندهٔ bootCount را بعد از هر بیداری ببینید باز کردن در Wokwi ↗
در حال بارگذاری شبیه‌ساز… (ممکن است چند ثانیه طول بکشد)

این یک شبیه‌سازی واقعی و قابل اجراست؛ روی دکمه پخش (▶) در Wokwi بزنید تا کد روی برد مجازی ESP32 اجرا شود. اگر جعبهٔ بالا بیش از حد سیاه/خالی ماند، صفحه را رفرش کنید یا از دکمهٔ «باز کردن در Wokwi» بالا استفاده کنید.

🛠️ کارگاه عملی

کارگاه عملی: از متغیر bootCount در حافظهٔ RTC (با RTC_DATA_ATTR) استفاده کنید تا هر بار پس از بیدار شدن، شمارنده افزایش یابد و چاپ شود.

❓ کدام ویژگی به یک متغیر اجازه می‌دهد حتی پس از Deep Sleep مقدارش حفظ شود؟
طراحی و توسعه: امین شیخ نجدیglcd.ir | نسخهٔ افزونه: 1.21.0