اینترنت اشیا IOT برد Esp32 برد Nodemcu

بررسی Sleep Mode در تراشه ESP32

نوشته شده توسط CiferTech

شاید تابحال برای شما پیش آمده باشد در پروژه‌ای که اجرا کرده باشید مشکل مصرف انرژی داشته باشید. حتی با استفاده از تراشه هایی مانند ESP32 که از کم مصرف ترین میکروکنترلر ها است، در این موارد ما از قابلیت های deep sleep یا sleep mode استفاده می کنیم. هر کدام موارد مختلفی را پوشش می‌دهند که در ادامه به آن ها خواهیم پرداخت. وقتی پروژه اینترنت اشیا شما از طریق برق تغذیه می شود، تمایل زیاد به مصرف برق دارد که اهمیتی ندارد. اما اگر می خواهید پروژه خود را با باتری تغذیه کنید، هر میلی آمپر برای ما مهم است. در اینجا راه حل این است که با استفاده از حالت خواب sleep mode یا خواب عمیق یا Deep sleep مصرف برق ESP32 را کاهش دهیم. که واقعا یک استراتژی عالی برای افزایش چشمگیر عمر باتری برای پروژه ای است که نیازی به فعال بودن مداوم ندارد. در ادامه این آموزش با مرجع تخصصی ESP32 به زبان فارسی، دیجی اسپارک همراه باشید.


شناخت حالت خواب ESP32


حالت sleep mode یا همان حالت خواب ESP32 حالت کم مصرفی است که در صورت عدم استفاده مدام از ESP32 می تواند مورد استفاده قرار بگیرد. موارد مورد نیاز ESP32 در RAM حفظ می شوند. وقتی ESP32 وارد حالت خواب می شود، تغذیه سایر وسایل جانبی دیجیتال غیر ضروری قطع می شود، در حالی که RAM فقط انرژی کافی را دریافت می کند تا بتواند داده های خود را حفظ کند. در قلب تراشه ESP32 یک ریز پردازنده ۳۲ بیتی Dual-Core به همراه ۴۴۸ کیلوبایت ROM ، ۵۲۰ کیلوبایت SRAM و ۴ مگابایت حافظه Flash وجود دارد. که همچنین شامل ماژول WiFi، ماژول بلوتوث، شتاب دهنده، ماژول RTC و بسیاری از تجهیزات جانبی است. که این موارد در حالت عادی معمولا ۷۵ میلی آمپر را مصرف و هنگام انتقال داده از طریق WiFi به حدود ۲۴۰ میلی آمپر می رسد.

 


بردNodemcu با تراشه ESP32


وقتی از ESP32 صحبت می‌کنیم، از مصرف انرژی کمتر، قدرت پردازش بهتر، تکنولوژی بروز صحبت می‌کنیم، یعنی نسل جدیدی از تراشه های WIFI که در ادامه نسل قبل یعنی ESP8266 به بازار معرفی شدند، که علاوه بر WIFI از بلوتوث نیز پشتیبانی می‌کنند. از برد های کمکی که برای این تراشه عرضه شده می‌توان به NodeMCU و ESP32-CAM اشاره کرد. این تراشه در سه نوع wroom , wrover و solo تولید می‌شود.

برد Nodemcu با تراشه ESP32 - دیجی اسپارک

 


حالات مختلف ESP32


حالت های تغذیه ESP32 به ۵ دسته مختلف تقسیم بندی می‌شود که عبارت هستند از، Active Mode، Modem Sleep Mode، Light Sleep Mode، Deep Sleep Mode، Hibernation Mode که هر حالت ویژگی های متمایز و قابلیت های صرفه جویی در مصرف انرژی خود را دارد. در تعدادی از این موارد را بررسی خواهیم کرد.

حالت Active Mode

حالت عادی با نام Active Mode نیز شناخته می شود. در این حالت تمام ویژگی های تراشه فعال است. از آنجا که حالت فعال همه ویژگی ها به خصوص ماژول WiFi، هسته های پردازش و ماژول بلوتوث را همیشه روشن نگه می دارد، تراشه برای کار به بیش از ۲۴۰ میلی آمپر جریان نیاز دارد. همچنین مشاهده کردیم که اگر از هر دو عملکرد WiFi و بلوتوث با هم استفاده کنید، گاهی اوقات اسپایک های قدرت بالا ظاهر می شوند که بزرگترین آنها تا ۷۹۰ میلی آمپر نیز می‌تواند باشد. بدیهی است که این ناکارآمدترین حالت است و بیشترین جریان را تخلیه خواهد کرد.

حالت Modem Sleep

در این حالت همه چیز فعال است در حالی که فقط WiFi، بلوتوث و رادیو غیرفعال هستند. CPU نیز عملیاتی است و ساعت نیز قابل تنظیم خواهد بود. در این حالت تراشه با سرعت پردازش پایین و حدود ۳ میلی آمپر و با سرعت پردازش زیاد ۲۰ میلی آمپر مصرف می کند. برای فعال نگه داشتن اتصالات WiFi / Bluetooth  CPU  Wi-Fi  Bluetooth و رادیو در فواصل از پیش تعیین شده بیدار می شوند. این به عنوان الگوی خواب انجمن شناخته می شود.

 


وسایل مورد نیاز


برد ESP برپایه تراشه ESP32

 


راه‌اندازی حالت خواب


برای برگشت از حالت خواب روش هایی وجود دارد که به تعدادی از آن ها اشاره می‌کنیم، بیدار شدن از حالت خواب عمیق را می توان با استفاده از چندین منبع انجام داد. این منابع عبارتند از تایمر، پین های لمسی، تریگ خارجی. این منابع برای بیدار کردن ESP را می‌توان ترکیب کرد، که در این حالت تراشه با فعال شدن هر یک از منابع بیدار می شود. توجه داشته باشید قبل از ورود به حالت خواب، این منابع می توانند هر لحظه پیکربندی شوند و به کد ما اعمال شوند. همچنین بدون پیکربندی منابع برای بیدار شدن ESP، می توانید به خواب عمیق بروید، در این حالت تراشه به طور نامحدود در حالت خواب عمیق خواهد بود، تا زمانی که تنظیم مجدد خارجی اعمال شود. در اولین قسمت حالت ESP32 Wake-up با تایمر را بررسی خواهیم کرد. کنترلر RTC در تراشه دارای تایمر داخلی است که می تواند بعد از مدت زمان از پیش تعیین شده تراشه را بیدار کند. زمان با دقت میکرو ثانیه مشخص شده است، اما دقت واقعی به منبع اصلی ساعت انتخاب شده بستگی دارد.

 

از تابع ()esp_sleep_enable_timer_wakeup می توان برای فعال کردن خواب عمیق با استفاده از تایمر استفاده کرد.

#define uS_TO_S_FACTOR 1000000  //ضریب تبدیل برای میکرو ثانیه به ثانیه
#define TIME_TO_SLEEP  5        //در این مدت به ثانیه esp به خواب خواهد رفت

RTC_DATA_ATTR int bootCount = 0;

void setup(){
  Serial.begin(115200);
  delay(1000); //ایجاد تاخیر زمانی کوچک برای دسترسی به سریال مانیتور

  //شماره بوت را افزایش می دهد و هر بار راه اندازی مجدد آن را چاپ کنید
  ++bootCount;
  Serial.println("Boot number: " + String(bootCount));

  //فراخوانی تابع
  print_wakeup_reason();

  //تنظیم تایمر برای ۵ ثانیه
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
  Serial.println("Setup ESP32 to sleep for every " + String(TIME_TO_SLEEP) +
  " Seconds");

  //ورود به حالت خواب
  esp_deep_sleep_start();
}

void loop(){}

//در این قسمت تابع دلیل بیدار شدن تراشه را اعلام میکند
void print_wakeup_reason(){
  esp_sleep_wakeup_cause_t wakeup_reason;
  wakeup_reason = esp_sleep_get_wakeup_cause();
  switch(wakeup_reason)
  {
    case 1  : Serial.println("Wakeup caused by external signal using RTC_IO"); break;
    case 2  : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break;
    case 3  : Serial.println("Wakeup caused by timer"); break;
    case 4  : Serial.println("Wakeup caused by touchpad"); break;
    case 5  : Serial.println("Wakeup caused by ULP program"); break;
    default : Serial.println("Wakeup was not caused by deep sleep"); break;
  }
}

 

خروج از حالت خواب با استفاده از پین های تاچ در ESP32T، ماژول RTC IO موجود در تراشه esp32 دارای سطح منطقی برای ایجاد بیدار شدن در هنگام وقفه سنسور لمسی است.البته دقت داشته باشد قبل از شروع حالت خواب عمیق، باید وقفه پین های لمسی را تایید کنید. از تابع ()esp_sleep_enable_touchpad_wakeup برای فعال کردن این منبع تریگ می‌توان استفاده کرد. در قسمت کدی وجود دارد که به شکل ابتدایی یک نمونه خواب عمیق را با لمس به عنوان منبع بیدارباش و نحوه ذخیره داده ها در حافظه RTC برای استفاده از آنها در هنگام راه‌اندازی مجدد را نشان می دهد.

#define Threshold 40 //تعریف میزان حساسیت لمسی

RTC_DATA_ATTR int bootCount = 0;
touch_pad_t touchPin;

void callback(){  //فراخوانی تابع callback

}

void setup(){
  Serial.begin(115200);
  delay(1000);

  //شماره بوت را افزایش می دهد و هر بار راه اندازی مجدد آن را چاپ کنید
  ++bootCount;
  Serial.println("Boot number: " + String(bootCount));

  //چاپ دلیل بیدار شدن esp  و وضعیت تاچ
  print_wakeup_reason();
  print_wakeup_touchpad();

  //تعریف وقفه زمانی
  touchAttachInterrupt(T3, callback, Threshold);

  //تنظیم پین تاچ برای بیداری
  esp_sleep_enable_touchpad_wakeup();

  //رفتن به حالت خواب
  esp_deep_sleep_start();
}

void loop(){}

//در این قسمت تابع دلیل بیدار شدن تراشه را اعلام میکند
void print_wakeup_reason(){
  esp_sleep_wakeup_cause_t wakeup_reason;
  wakeup_reason = esp_sleep_get_wakeup_cause();
  switch(wakeup_reason)
  {
    case 1  : Serial.println("Wakeup caused by external signal using RTC_IO"); break;
    case 2  : Serial.println("Wakeup caused by external signal using RTC_CNTL"); break;
    case 3  : Serial.println("Wakeup caused by timer"); break;
    case 4  : Serial.println("Wakeup caused by touchpad"); break;
    case 5  : Serial.println("Wakeup caused by ULP program"); break;
    default : Serial.println("Wakeup was not caused by deep sleep"); break;
  }
}


//پرینت پین تاچی که باعث بیداری شده
void print_wakeup_touchpad(){
  touch_pad_t pin;
  touchPin = esp_sleep_get_touchpad_wakeup_status();
  switch(touchPin)
  {
    case 0  : Serial.println("Touch detected on GPIO 4"); break;
    case 1  : Serial.println("Touch detected on GPIO 0"); break;
    case 2  : Serial.println("Touch detected on GPIO 2"); break;
    case 3  : Serial.println("Touch detected on GPIO 15"); break;
    case 4  : Serial.println("Touch detected on GPIO 13"); break;
    case 5  : Serial.println("Touch detected on GPIO 12"); break;
    case 6  : Serial.println("Touch detected on GPIO 14"); break;
    case 7  : Serial.println("Touch detected on GPIO 27"); break;
    case 8  : Serial.println("Touch detected on GPIO 33"); break;
    case 9  : Serial.println("Touch detected on GPIO 32"); break;
    default : Serial.println("Wakeup not by touchpad"); break;
  }
}

 


 جمع بندی


در این آموزش به مواردی از حالات خواب در برد ESP32 پرداختیم و دو نمونه از این موارد در نوع Deep Sleep را مورد آزمایش قرار دادیم. در مجموع استفاده از قابلیت برد های ESP یعنی حالت خواب برای پروژه های شما بسیار کارای دارد و باعث ذخیره حجم بسیاری انرژی در پروژه های اینترنت اشیایی شما خواهد شد. همچنین با استفاده از قابلیت هایی مختلفی که قبل تر ذکر شد شما کنترل کامل بر این مود در تراشه خواهید داشت.

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

درباره نویسنده

CiferTech

تبادل نظر و رفع عیب با ثبت دیدگاه

۷ دیدگاه

  • سلام مهندس اگرمی شود مثل esp32 را مثل esp8266 بخش به بخش تفکیک کنید اگر یک فیلم آموزشی مثل سایت فرادرس برای هر بخش درست می کردید خیلی هم بهتر می شد

  • سلام.وقت شما بخیر. مرسی از مطالب خوبتون. یه سوال داشتم. من ماژول esp32 رو به چهارتا رله بابت پنکه اتاق وصل کردم و وقتی که برق خونه می ره اول باید جامپر ۵ ولت رو بکشم و بعد دکمه بوت رو بزنم تا برنامه ران بشه. می خواستم بپرسم چه راهکاری برای حل این مسئله هست که بعد از قطعی برق بوت درست انجام بشه و نیازی به جدا کردن جامپر تباشه.

    • با سلام، به نظرم با استفاده از تغذیه جداگانه برای رله ها این مشکل حل بشه. برد ESP32 به تنهایی جریان زیادی مصرف میکنه، بهتره که از تغذیه جداگانه استفاده کنید.

  • سلام
    من میخوام ه esp32 باطری وصل کنم تا بتونم ساعت esp32 رو روشن نگه دارم ولی چیزی درمورد نهوه اتصال باطری پیدا نکردم
    و دیگه اینکه از RTC داخلی esp332 چجوری میشه استفاده کرد
    ممنون ازاطلاعات خوبی که منتشر کردیید
    ممنون میشم راهنمایی کنید

    • با سلام
      برای اتصال باتری بایستی به دیتاشیت تراشه مراجعه کنید. چنین موردی توضیح داده شده است. اگر هم طراحی PCB انجام داده‌اید، بایستی بخش تغذیه را به این مورد متصل کنید.

  • سلام
    ممنون از سایت خوبتون
    تابع millis در واحد RTC ماژول esp8266 ذخیره میشه؟
    در حالت deep sleep میشه ساعت رو در esp8266 ذخیره کرد؟

    • با سلام
      ماژول ESP8266 دارای تابع millis معمولی که در Arduino استفاده می‌شود، نیست. اما ESP8266 دارای RTC (Real-Time Clock) داخلی است که می‌توانید از آن برای ذخیره زمان استفاده کنید. RTC این ماژول با استفاده از یک کریستال دقیق به عنوان منبع زمانی کار می‌کند. برای استفاده از RTC در ESP8266، می‌توانید از کتابخانه‌های مختلفی مانند RTClib استفاده کنید. این کتابخانه‌ها به شما این امکان را می‌دهند که زمان را از RTC بخوانید و به آن دسترسی پیدا کنید.

      در مورد deep sleep، بله، می‌توانید زمان را قبل از ورود به حالت deep sleep ذخیره کنید و بعد از بیدار شدن مجدداً از آن استفاده کنید. برای این کار، می‌توانید زمان را از RTC خوانده و آن را در یک متغیر یا EEPROM ذخیره کنید. سپس قبل از ورود به حالت deep sleep، مقدار زمان ذخیره شده را با زمان فعلی جمع کرده و آن را در EEPROM یا یک متغیر ذخیره کنید. بعد از بیدار شدن، می‌توانید از این زمان برای هر منظوری که نیاز دارید استفاده کنید.

      در کل، از RTC برای ذخیره و بازیابی زمان در ESP8266 استفاده کنید تا دقت بهتری در انجام وظایف زمانی داشته باشید.
      شاد و پیروز باشید.