- Захтеви
- Шема круга режима спавања ЕСП32
- Преглед режима спавања у ЕСП32
- Програмирање ЕСП32 за режим дубоког спавања
- Тестирање ЕСП32 у режиму дубоког спавања
ЕСП32 је један од најпопуларнијих модула микроконтролера заснован на Ви-Фи-у и популаран је избор у многим преносним ИоТ апликацијама. Моћан је контролер који подржава двојезгрено програмирање, а такође има уграђену подршку за Блуетоотх са ниском потрошњом енергије (БЛЕ) што га чини добрим избором за преносиве апликације као што су иБеацон уређаји, ГПС трекери итд. Међутим, у апликацијама на батеријски погон попут ових, главна брига је резервна батерија. Ова резервна батерија може се повећати паметнијом контролом над јединицом микроконтролера као што се може програмирати ЕСП32 у режиму спавања током идеалног стања да се повећа резервна батерија уређаја.
У овом пројекту ћемо проверити тренутну потрошњу широко популарне микроконтролерске јединице ЕСП32 са омогућеним Ви-Фи-јем и Блуетоотх-ом у нормалном режиму рада и режиму дубоког спавања. Такође ћемо тестирати разлику и проверити како ЕСП32 ставити у режим дубоког спавања. Такође можете погледати чланак о томе како минимизирати потрошњу енергије у микроконтролерима и потражити друге савете који могу да се користе да ваш дизајн учине много енергетски ефикаснијим. Даље, ако сте заинтересовани за режим спавања других микроконтролера, можете да проверите и режим спавања Ардуино и режим спавања ЕСП8266 НодеМЦУ.
Захтеви
Да бисмо то урадили, користићемо Девкит В4.0 заснован на ЕСП32 из компаније Еспрессиф који има УСБ на УАРТ мост као и друге ЕСП32 пиноуте за лако повезивање. Програмирање ће се вршити помоћу Ардуино ИДЕ-а. Ако сте потпуно нови, за почетак рада са ЕСП32 помоћу Ардуина прочитајте повезани чланак пре него што наставите.
Захтеви овог пројекта су следећи:
- Притиском на дугме прелази у режим дубоког спавања.
- Пробудит ће се из режима дубоког спавања притиском другог дугмета.
- Да би открио стање ЕСП32, ЛЕД ће трептати са временом укључивања од 1000 милисекунди. У режиму спавања биће искључен.
Стога су потребне додатне компоненте -
- ЛЕД - 1 ком
- Тастер (тактилни прекидач) - 2 ком
- Отпорници 4.7к - 2 ком
- Отпорник 680Р - 1 ком
- Бреадбоард
- Прикључи жицу
- 5В адаптер или јединица за напајање
- Микро-УСБ кабл
- Ардуино ИДЕ са програмским интерфејсом ЕСП32 на рачунару или преносном рачунару.
Шема круга режима спавања ЕСП32
Шема за успављивање ЕСП32 помоћу дугмета приказана је испод.
Шема је прилично једноставна. Има два тастера. Тастер за спавање ће ставити ЕСП32 у режим дубоког спавања, а други прекидач се користи за буђење ЕСП32 из режима спавања. Оба тастера су повезана ПИН-ом 16 и ПИН-ом 33. Оба тастера су конфигурисана као активна ниска када се притисну, па је дато додатно повлачење. Међутим, да би се утврдило да ли је ЕСП 32 у режиму спавања или у нормалном радном стању, ЛЕД је повезан на ИО пин 4.
Преглед режима спавања у ЕСП32
Постоји много различитих режима напајања за ЕСП32, наиме активни режим, модемски режим спавања, лагани режим спавања, режим дубоког спавања и режим хибернације.
Током нормалног радног стања, ЕСП32 ради у активном режиму. Током активног режима ЕСП32, ЦПУ, ВиФи / БТ хардвер, РТЦ меморија и РТЦ периферне јединице, УЛП копроцесори, сви се активирају и раде у зависности од радног оптерећења. Међутим, на различитим режимима напајања једна или више периферних уређаја су искључене. Да бисте проверили различите начине рада напајања, следите доњу табелу -
Хардвер |
Ацтиве Моде |
Модем мировања |
Лагани режим спавања |
Режим дубоког спавања |
Хибернација |
Процесори |
НА |
НА |
ПАУЗИ |
ВАН |
ВАН |
ВиФи / БТ |
НА |
ВАН |
ВАН |
ВАН |
ВАН |
РТЦ и РТЦ периферне јединице |
НА |
НА |
НА |
НА |
ВАН |
УЛП-Цо процесор |
НА |
НА |
НА |
ОН / ОФФ |
ВАН |
Као што можемо видети у горњој табели да су у режиму дубоког спавања ЕСП32, који се често назива узорком надгледаног УЛП сензором - искључени ЦПУ, ВиФи / БТ, РТЦ меморија и периферне јединице. Укључене су само РТЦ меморија и РТЦ периферне јединице.
Током ситуације буђења, ЕСП32 треба да буде обавештен од извора буђења који ће пробудити ЕСП32 из режима дубоког спавања. Међутим, пошто су РТЦ периферне јединице укључене, ЕСП32 се може пробудити путем РИО омогућених ГПИО-а. Постоје и друге опције. Може се пробудити путем спољних пинова за прекид буђења или помоћу тајмера за буђење ЕСП32. У овом пројекту користимо ект0 буђење на пину 33.
Програмирање ЕСП32 за режим дубоког спавања
Комплетан програм можете пронаћи на дну ове странице. Написан је за Ардуино ИДЕ и стога се лако може прилагодити вашим захтевима. Објашњење кода је следеће.
На почетку кода, // Креирамо ПусхБуттон променљиву ПусхБнт пусхБтн = {ГПИО_НУМ_16, 0, фалсе}; // дефинишемо Лед Пин уинт8_т лед_пин = ГПИО_НУМ_4; // дефинишемо пин за буђење уинт8_т вакеУп_пин = ГПИО_НУМ_33;
Горње три линије дефинишу пин за буђење, ЛЕД пин и пин за режим спавања.
воид сетуп () { // овде ставите свој код за подешавање да бисте га покренули једном: // поставите серијски порт на 115200 Сериал.бегин (115200); кашњење (1000); // подесимо пин пусхБуттон као улаз са унутрашњим ПуллУп пинМоде (пусхБтн.пин, ИНПУТ_ПУЛЛУП); // постављамо руковаоца прекидима помоћу пин-а пусхБуттон у падајућем режиму аттацхИнтеррупт (пусхБтн.пин, иср_хандле, ФАЛЛИНГ); // поставимо Лед пин као оупут пинМоде (лед_пин, ОУТПУТ); // креирамо задатак који ће се извршити у функцији блинкЛед (), са приоритетом 1 и извршити на језгру 0 кТаскЦреате ( блинкЛед, / * функција задатка. * / "блинкЛед", / * назив задатка. * / 1024 * 2, / * Величина стека задатка * / НУЛЛ, / * параметар задатка * / 5, / * приоритет задатка * / & таскБлинклед); / * Ручица задатка за праћење креираног задатка * / делаи (500); // Конфигуришите Пин 33 као ект0 извор за буђење са ЛОВ логичким нивоом есп_слееп_енабле_ект0_вакеуп ((гпио_нум_т) вакеУп_пин, 0); }
У претходном делу, исечак кода прекид поставља у падајући режим
аттацхИнтеррупт (пусхБтн.пин, иср_хандле, ФАЛЛИНГ);
Стога, кад год се притисне прекидач, ниво логике ће се променити из логике 1 (3.3В) у логику 0 (0В). Напон клина тастера ће пасти и ЕСП32 ће препознати да је прекидач притиснут. Такође је креиран задатак да трепће ЛЕД.
кТаскЦреате ( блинкЛед, / * функција задатка. * / "блинкЛед", / * назив задатка. * / 1024 * 2, / * величина слога задатка * / НУЛЛ, / * параметар задатка * / 5, / * приоритет задатка * / & таскБлинклед); / * Ручица задатка за праћење креираног задатка * / делаи (500);
Пин 33 је такође конфигурисан помоћу доњег исечка кода као спољни извор буђења идентификован као ект0.
есп_слееп_енабле_ект0_вакеуп ((гпио_нум_т) вакеУп_пин, 0);
Даље, у вхиле петљи-
воид лооп () { // овде ставите свој главни код, да се изводи више пута: иф (пусхБтн.прессед) { Сериал.принтф ("ПусхБуттон (% д) Притиснуто \ н", пусхБтн.пин); Сериал.принтф ("Обустави задатак 'блинкЛед' \ н"); // Суспендирање блинкЛед Таск вТаскСуспенд (таскБлинклед); дигиталВрите (лед_пин, ЛОВ); Сериал.принтф ("Спавање….. \ н", пусхБтн.пин); пусхБтн.прессед = фалсе; // Идите у стање спавања есп_дееп_слееп_старт (); } есп_слееп_вакеуп_цаусе_т вакеупРеасон; вакеупРеасон = есп_слееп_гет_вакеуп_цаусе (); прекидач (вакеупРеасон) { случај ЕСП_СЛЕЕП_ВАКЕУП_ЕКСТ0: Сериал.принтлн ("коришћење спољног сигнала ект0 за ВакеУп Фром слееп"); пауза; случај ЕСП_СЛЕЕП_ВАКЕУП_ЕКСТ1: Сериал.принтлн („коришћење спољног сигнала ект1 за ВакеУп Фром слееп“); пауза; случај ЕСП_СЛЕЕП_ВАКЕУП_ТИМЕР: Сериал.принтлн („коришћење тајмер сигнала за ВакеУп Фром слееп“); пауза; случај ЕСП_СЛЕЕП_ВАКЕУП_ТОУЦХПАД: Сериал.принтлн („коришћење ТоуцхПад сигнала за ВакеУп Фром слееп“); пауза; случај ЕСП_СЛЕЕП_ВАКЕУП_УЛП: Сериал.принтлн ("коришћење УЛП сигнала за ВакеУп Фром слееп"); пауза; подразумевано: бреак; Сериал.принтф ("Настави задатак 'блинкЛед' \ н"); // поново покренимо блинкЛед Таск вТаскРесуме (таскБлинклед); } }
Петља вхиле стално проверава да ли је дугме за спавање притиснуто или не. Ако се притисне дугме, зауставиће или обуставити задатак ЛЕД трептања и покренути есп функцију дубоког спавања-
есп_дееп_слееп_старт ();
У овој ситуацији, ако се притисне дугме екстерног прекида ект0, одмах ће се пробудити из режима дубоког спавања и наставити са задатком лед трептања.
На крају, функција трептања ЛЕД-а може се видети у доњим исечцима, она ће трептати ЛЕД 1000 мс секунди.
воид блинкЛед (воид * парам) {вхиле ( 1) { статиц уинт32_т пин_вал = 0; // пребацивање пин вредности пин_вал ^ = 1; дигиталВрите (лед_пин, пин_вал); Сериал.принтф ("Лед -----------------% с \ н", пин_вал? "Укључено": "Искључено"); / * Једноставно пребаците ЛЕД на сваких 1000мс или 1сец * / вТаскДелаи (1000 / портТИЦК_ПЕРИОД_МС); } таскБлинклед = НУЛЛ; вТаскДелете (НУЛЛ); }
Тестирање ЕСП32 у режиму дубоког спавања
Коло је конструисано у плочи, а за мерење струје користи се мултиметар Метрави КСБ издања. Струја коју круг вуче у активном режиму је скоро 58 мА, али у режиму дубоког спавања струја је скоро 4,10 мА. Испод је слика потрошње струје активног режима ЕСП32 -
У режиму дубоког спавања, тренутна потрошња је забележена на око 3,95мА, доња слика приказује тренутну потрошњу ЕСП32 режима дубоког спавања-
Међутим, у режиму дубоког спавања, тренутна потрошња ЕСП32 је скоро 150 уА. Али забележена тренутна потрошња за ову ЕСП32 Девкит плочу је скоро 4,10 мА. То је због ЦП2102 и линеарног регулатора. Ова два су повезана на линију напајања од 5В. Такође је повезан и ЛЕД напајања у далековод који троши скоро 2мА струје.
Стога се лако може утврдити да ЕСП32 троши врло малу количину енергије у режиму дубоког спавања, што је врло корисно за рад на батерије. За више информација о томе како је функционисало погледајте видео доле повезан. Ако имате питања, оставите их у одељку за коментаре испод или користите наша форума за друга техничка питања.