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

منبع :  دیجی اسپارک دسته بندی : اینترنت اشیا IOT کد خبر : 14403 3 سال قبل 713

شاید تابحال برای شما پیش آمده باشد در پروژه‌ای که اجرا کرده باشید مشکل مصرف انرژی داشته باشید. حتی با استفاده از تراشه هایی مانند 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(); //تنظیم تایمر برای 5 ثانیه 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 یعنی حالت خواب برای پروژه های شما بسیار کارای دارد و باعث ذخیره حجم بسیاری انرژی در پروژه های اینترنت اشیایی شما خواهد شد. همچنین با استفاده از قابلیت هایی مختلفی که قبل تر ذکر شد شما کنترل کامل بر این مود در تراشه خواهید داشت.

 

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

 

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

 

نوشته بررسی Sleep Mode در تراشه ESP32 اولین بار در دیجی اسپارک پدیدار شد.

مشاهده این خبر در سایت مرجع