فهرست مطالب:

صرفه جویی در عمر باتری با خواب عمیق: 20 قدم
صرفه جویی در عمر باتری با خواب عمیق: 20 قدم

تصویری: صرفه جویی در عمر باتری با خواب عمیق: 20 قدم

تصویری: صرفه جویی در عمر باتری با خواب عمیق: 20 قدم
تصویری: ضایع ترین و ناجورترین لحظه ها تو برنامه های زنده تلویزیونی 2024, نوامبر
Anonim
Image
Image
راه های بیدار کردن ESP32
راه های بیدار کردن ESP32

آیا به استفاده از باتری با ESP32 علاقه دارید؟ اگر چنین است ، من امروز در مورد برخی از اطلاعات فنی مهم در مورد این موضوع بحث خواهم کرد. ما می دانیم که این میکروکنترلر هنگام انتقال اطلاعات انرژی زیادی مصرف می کند. نزدیک به 190 میلی آمپر مصرف می کند. در این ویدئو ، نحوه صرفه جویی انرژی از ESP32 با عملکرد به اصطلاح "خواب عمیق" را نشان خواهم داد. ما تراشه را طوری تنظیم می کنیم که وارد این حالت شود ، راههای خروج از این حالت را بیاموزیم و مثالی را ایجاد می کنیم که سه روش مختلف برای بیدار کردن ESP32 را نشان می دهد.

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

مرحله 1: مقدمه

ESP32 دارای حالت صرفه جویی در مصرف انرژی است که "خواب عمیق" نامیده می شود. در این حالت ، CPU ها ، اکثر RAM ها و کلیه لوازم جانبی ساعت دار دیجیتال خاموش هستند. تنها قسمت هایی از تراشه که هنوز قابل اتصال هستند کنترلر RTC ، لوازم جانبی RTC (از جمله پردازنده ULP) و حافظه های RTC هستند.

ما چندین روش برای بیدار کردن ESP32 هنگام خواب داریم. منابع بیداری را می توان در هر زمان قبل از ورود به حالت خواب عمیق تنظیم کرد.

مرحله 2: راه های بیدار کردن ESP32

پنج راه برای بیدار کردن ESP32 وجود دارد:

• تایمر

• بیداری خارجی (ext0)

• بیداری خارجی (ext1)

• بیدار شدن از پردازنده ULP

• صفحه لمسی

مرحله 3: تایمر

کنترلر RTC دارای یک تایمر داخلی است که می تواند برای فعال سازی تراشه پس از یک دوره زمانی از پیش تعیین شده استفاده شود. زمان با دقت میکرو ثانیه مشخص می شود.

esp_deep_sleep_enable_timer_wakeup (uint64_t time_in_us)

time_in_us> زمان بر حسب میکرو ثانیه است

مرحله 4: بیدار شدن خارجی (ext0)

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

esp_deep_sleep_enable_ext0_wakeup (gpio_num_t gpio_num ، سطح int)

gpio_num> شماره GPIO به عنوان منبع فعال سازی استفاده می شود. فقط GPIO های کاربردی RTC می توانند استفاده شوند: 0 ، 2 ، 4 ، 12-15 ، 25-27 ، 32-39.

سطح> سطح ورودی که زنگ را فعال می کند (0 = پایین ، 1 = بالا)

مرحله 5: بیدار شدن خارجی (ext1)

کنترلر RTC دارای منطقی است که با استفاده از GPIO های متعدد RTC ساعت زنگ دار را فعال می کند.

esp_deep_sleep_enable_ext1_wakeup (uint64_t mask، esp_ext1_wakeup_mode_t mode)

mask> bit mask از اعداد GPIO که باعث فعال شدن می شود. در این بیت مپ فقط GPIO های فعال شده با RTC قابل استفاده هستند: 0 ، 2 ، 4 ، 12-15 ، 25-27 ، 32-39.

mode> تابع منطقی مورد استفاده برای تعیین شرایط فعال سازی را انتخاب کنید:

• ESP_EXT1_WAKEUP_ALL_LOW: وقتی همه GPIO های انتخابی در LOW قرار دارند بیدار می شود

• ESP_EXT1_WAKEUP_ANY_HIGH: وقتی هریک از GPIO های انتخابی بالا باشند بیدار می شود

مرحله 6: بیدار شدن از پردازنده ULP

پردازنده ULP می تواند در حالی که تراشه در Deep Sleep است کار کند و می تواند برای جستجوی حسگرها ، نظارت بر مقادیر ADC یا حسگرهای لمسی خازنی و فعال سازی تراشه در صورت تشخیص یک رویداد خاص استفاده شود.

پردازنده ULP بخشی از حوزه قدرت تجهیزات جانبی RTC است و برنامه ذخیره شده در RTC با حافظه آهسته را اجرا می کند. بنابراین ، در صورت درخواست این حالت فعالسازی ، لوازم جانبی RTC و حافظه آهسته RTC در طول خواب عمیق فعال می شوند.

مرحله 7: صفحه لمسی

کنترلر RTC دارای منطقی است که با استفاده از سنسورهای لمسی خازنی زنگ را فعال می کند. با این حال ، تعریف پین لمسی متفاوت است. ما باید از وقفه لمسی برای هر یک از پین های مورد نظر استفاده کنیم.

پس از تنظیم وقفه ها ، حالت بیداری را فعال کردیم تا از سنسورها استفاده کند.

// صفحه لمسی را به عنوان منبع بیداری پیکربندی کنید esp_sleep_enable_touchpad_wakeup ()؛

مرحله 8: ورود به حالت خواب عمیق

پس از تنظیم حالت بیداری ، یک فرمان واحد برای قرار دادن ESP32 در حالت خواب عمیق (صرف 2.5 میکرو آمپر یا کمتر) کافی است. در اینجا تأکید می کنم که این هزینه از تراشه ESP است و نه صفحه ، زیرا دومی بیشتر هزینه می کند.

esp_deep_sleep_start ()؛

از این دستور ، ESP32 به خواب می رود و خطوط بعدی کد را اجرا نمی کند.

مهم: همه تنظیمات بیداری باید قبل از اجرای دستور بالا انجام شود.

مرحله 9: در اینجا برخی از اطلاعات مهم تر است

در اینجا برخی از اطلاعات مهم تر است
در اینجا برخی از اطلاعات مهم تر است

تماس زیر علت بیدار شدن ESP32 را برمی گرداند.

1: EXT0 2: EXT1 3: تایمر 4: TOUCHPAD 5: ULP

esp_sleep_get_wakeup_cause ()؛

اگر بیدار شدن را توسط صفحه لمسی تنظیم کنیم ، می توانیم GPIO را که لمس از طریق فرمان رخ داده است بازیابی کنیم

esp_sleep_get_touchpad_wakeup_status ()؛

هر بار که ESP32 از خواب بیدار می شود ، دوباره راه اندازی را طی می کند. بنابراین همه متغیرهایی که در حافظه RTC تعریف نشده اند به حالت اولیه خود باز می گردند.

برای حفظ متغیرها در حافظه حتی پس از خواب ، از اعلان متغیر در مثال زیر استفاده کنید:

// RTC_DATA_ATTR تغییر و یادآوری RTCRTC_DATA_ATTR int bootCount = 0؛

مرحله دهم: تظاهرات

تظاهرات
تظاهرات

ویدئو نشان می دهد که برنامه مطابق تصویر کار می کند.

مرحله 11: WiFi NodeMCU-32S ESP-WROOM-32

WiFi NodeMCU-32S ESP-WROOM-32
WiFi NodeMCU-32S ESP-WROOM-32

مرحله 12: مونتاژ

مونتاژ
مونتاژ

مرحله 13: برنامه

اکنون برنامه ای ایجاد می کنیم که در آن ESP32 را برای ورود به حالت خواب عمیق پیکربندی می کنیم. این به سه روش مختلف بیدار می شود: یکی برای بیدار شدن خارجی (ext0) ، یکی برای تایمر و دیگری برای صفحه لمسی. آنها نمی توانند با هم کار کنند ، بنابراین ما از متغیری استفاده می کنیم که برای تعداد دفعاتی که ESP32 به Boot داده است شمارنده خواهد بود تا راه بیدار شدن را پیکربندی کند.

مرحله 14: کتابخانه مورد نیاز است

کتابخانه مورد نیاز است
کتابخانه مورد نیاز است

برای کنترل صفحه نمایش OLED ، به یک کتابخانه خارجی نیاز داریم. برای این کار ، کتابخانه U8g2 را بارگیری می کنیم.

در Arduino IDE ، به منوی Sketch >> Include Library >> Manage Libraries بروید….

مرحله 15: کتابخانه ها و متغیرها

ما کتابخانه ای را برای کنترل صفحه نمایش OLED و همچنین سازنده ای از نمونه کنترلر صفحه نمایش در اختیار شما قرار داده ایم. همچنین ، ما متغیر را در حافظه RTC اختصاص می دهیم. ما حساسیت را برای پذیرش لمس ، ضریب تبدیل میکروثانیه و ثانیه و زمان رفتن ESP32 به حالت خواب (در ثانیه) تنظیم می کنیم.

#include // biblioteca para controle do oled نمایش داده می شود

// construtor da instancia do controlador برای نمایش // SDA = 21 e SCL = 22 صفحه نمایش U8X8_SSD1306_128X64_NONAME_SW_I2C (SCL ، SDA ، U8X8_PIN_NONE) ؛ // RTC_DATA_ATTR تغییر و یادآوری RTC RTC_DATA_ATTR int bootCount = 0؛ // sensibilidade para aceitação do toque #define Threshold 40 // fator de conversão de microsegundos para segundos #define uS_TO_S_FACTOR 1000000 // tempo que o ESP32 ficará em modo sleep (em segundos) #تعریف TIME_TO_SLEEP

مرحله 16: راه اندازی

در Setup ، تعداد دفعاتی که Boot رخ داده را افزایش می دهیم. ما تابع را برای چاپ Boot motif فراخوانی می کنیم. اگر شماره بوت PAR است ، ESP32 را تنظیم می کنیم تا از طریق دکمه (EXT0) بیدار شود. اگر مضربی از 3 باشد ، ESP32 را طوری تنظیم می کنیم که بعد از زمان تعیین شده بیدار شود. در غیر این صورت ، ما پین های لمسی خازنی را برای بیدار کردن ESP32 تنظیم می کنیم. در نهایت ، صفحه لمسی را به عنوان منبع بیداری تنظیم می کنیم و ESP32 را مجبور می کنیم وارد حالت خواب شود.

void setup () {Serial.begin (115200)؛ تاخیر (1000) ؛ // incrementa o numero de vezes que o BOOT ocorreu ++ bootCount؛ configureDisplay ()؛ // chama a função para imprimir o motivo do BOOT print_wakeup_reason ()؛ // se numero de boot for PAR configuramos o ESP32 para despertar através do botão (EXT0) if (bootCount٪ 2 == 0) {esp_sleep_enable_ext0_wakeup (GPIO_NUM_39، 1) ؛ // 1 = زیاد ، 0 = کم} // برای چند تنظیم 3 پیکربندی یا ESP32 برای تعیین سرعت دیگر اگر (bootCount٪ 3 == 0) {esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR) ؛ } // caso contrario configuramos os pinos de touch capacitivo des despertar o ESP32 else {// وقفه راه اندازی در صفحه لمسی 5 (GPIO12) touchAttachInterrupt (T5 ، پاسخ به تماس ، آستانه) ؛ // صفحه لمسی را به عنوان منبع بیداری پیکربندی کنید esp_sleep_enable_touchpad_wakeup ()؛ } Serial.println ("entrando em modo sleep")؛ esp_deep_sleep_start ()؛ // força o ESP32 entrar em modo SLEEP}

مرحله 17: Loop ، Callback & ConfigureDisplay

در حلقه ، ما کاری نداریم. سپس در صورت وقوع وقفه ، کاری برای انجام تماس انجام می دهیم. در مورد configureDisplay ، ما صفحه را اولیه کرده و برخی پارامترها را پیکربندی می کنیم. تعداد دفعاتی که Boot اتفاق افتاده است را روی صفحه چاپ می کنیم.

// nada a se fazer no loopvoid loop () {} // callback das interrupções void callback () {// caso queira fazer algo ao ocorrer a interrupção} void configureDisplay () {// inicializa o display and configura alguns parametros display. شروع()؛ display.setPowerSave (0) ؛ // modo powerSave (0-Off؟ 1-On) display.setFont (u8x8_font_torussansbold8_u) ؛ // fonte utilizada // imprime no display os numero de vezes que aconteceu o BOOT display.drawString (0 ، 0 ، "BOOT NUM:") ؛ display.drawString (0 ، 2 ، String (bootCount).c_str ()) ؛ display.drawString (0 ، 4 ، "MOTIVO:") ؛ }

مرحله 18: دلیل چاپ_بیداری (دانستن علت بیداری)

در اینجا ، ما عملکردی برای چاپ علت بیدار شدن ESP32 داریم. پین را بررسی کرده و روی صفحه چاپ کنید.

// função para imprimir a causa do ESP32 despertarvoid print_wakeup_reason () {esp_sleep_wakeup_cause_t wakeup_reason؛ دلیل رشته = ""؛ wakeup_reason = esp_sleep_get_wakeup_cause ()؛ // recupera a causa do despertar switch (wakeup_reason) {case 1: reason = "EXT0 RTC_IO BTN"؛ زنگ تفريح؛ مورد 2: دلیل = "EXT1 RTC_CNTL"؛ زنگ تفريح؛ مورد 3: دلیل = "TIMER"؛ زنگ تفريح؛ مورد 4: دلیل = "TOUCHPAD"؛ زنگ تفريح؛ مورد 5: دلیل = "برنامه ULP"؛ زنگ تفريح؛ پیش فرض: reason = "NO DS CAUSE"؛ زنگ تفريح؛ } Serial.println (دلیل) ؛ display.clearLine (6) ؛ // apaga a linha 6 do display.drawString (0، 6، reason.c_str ())؛ // imprime a causa do despertar no display // se despertou por TOUCHPAD، então vamos verificar em qual dos pinos ocorreu if (wakeup_reason == 4) {print_wakeup_touchpad ()؛ // verifica o pino e imprime no display}}

مرحله 19: Print_wakeup_touchpad (GPIO Touch را بشناسید)

در حال حاضر ، در این مرحله ، ما عملکرد چاپ پینی را که لمس شده است ، داریم. ما GPIO را که ESP32 را بیدار کرد بازیابی کردیم و روی صفحه چاپ کردیم.

// função para imprimir o pino que foi tocadovoid print_wakeup_touchpad () {touch_pad_t touchPin؛ touchPin = esp_sleep_get_touchpad_wakeup_status ()؛ // recupera o GPIO que despertou o ESP32 String GPIO = ""؛ switch (touchPin) {case 0: GPIO = "4"؛ زنگ تفريح؛ مورد 1: GPIO = "0"؛ زنگ تفريح؛ مورد 2: GPIO = "2" ؛ زنگ تفريح؛ مورد 3: GPIO = "15"؛ زنگ تفريح؛ مورد 4: GPIO = "13" ؛ زنگ تفريح؛ مورد 5: GPIO = "12"؛ زنگ تفريح؛ مورد 6: GPIO = "14"؛ زنگ تفريح؛ مورد 7: GPIO = "27" ؛ زنگ تفريح؛ مورد 8: GPIO = "33"؛ زنگ تفريح؛ مورد 9: GPIO = "32"؛ زنگ تفريح؛ پیش فرض: Serial.println ("بیدار شدن از طریق صفحه لمسی") ؛ زنگ تفريح؛ } Serial.println ("GPIO:"+GPIO) ؛ display.clearLine (7) ؛ // apaga a linha 7 do display.drawString (0 ، 7 ، "GPIO:") ؛ display.drawString (6 ، 7 ، GPIO.c_str ()) ؛ // imprime o GPIO}

مرحله 20: فایل ها را بارگیری کنید

PDF

من نه

توصیه شده: