Мазмуну:

Батарея өмүрүн үнөмдөө: 20 кадам
Батарея өмүрүн үнөмдөө: 20 кадам

Video: Батарея өмүрүн үнөмдөө: 20 кадам

Video: Батарея өмүрүн үнөмдөө: 20 кадам
Video: Brand TWS Terbaik di Dunia tapi Murah!! Soundpeats Truengine 3 SE 2024, Ноябрь
Anonim
Image
Image
ESP32ди ойготуунун жолдору
ESP32ди ойготуунун жолдору

Сиз батарейканы ESP32 менен колдонууга кызыгасызбы? Андай болсо, мен бүгүн бул темага байланыштуу кээ бир маанилүү техникалык маалыматтарды талкуулайм. Биз билебиз, бул микроконтроллер маалыматты өткөрүп жатканда көп энергия сарптайт. Бул 190 миллиамперге жакын керектейт. Бул видеодо мен "Терең уйку" функциясы менен ESP32ден энергияны кантип үнөмдөөнү көрсөтөм. Биз чипти ушул режимге киргизебиз, бул режимден чыгуунун жолдорун үйрөнөбүз жана ESP32ди ойготуунун үч түрдүү жолун көрсөткөн мисал түзөбүз.

Бул радио процессорго караганда, көп энергия сарптай турганын эстен чыгарбоо керек. Энергияны үнөмдөө абдан маанилүү. Себеби, акыркы чекиттер (маалыматты жөнөтүүчү схемалар) көбүнчө батарея менен иштейт жана беш жылга чейин созулушу керек. Он жылга чейин созулган кээ бир өндүрүүчүлөр бар жана бул акыркы чекиттерди көп колдонбогон жогорку сапаттагы батареялар үчүн жарактуу. Башка бардык учурларда, мен сиздин схемаңыздан энергияны үнөмдөө үчүн Deep Sleepти колдонууну кеңеш берем.

1 -кадам: Киришүү

ESP32де "Deep Sleep" деп аталган энергияны үнөмдөөчү режим бар. Бул режимде, CPU, көпчүлүк RAM жана бардык санариптик сааттык перифериялык түзүлүштөр өчүрүлгөн. Чиптин дагы эле туташа турган бөлүктөрү RTC контроллери, RTC перифериялык түзүлүштөрү (анын ичинде ULP сопроцессору) жана RTC эс тутумдары.

Биз уктап жатканда ESP32ди ойготуунун бир нече жолу бар. Ойгонуу булактарын Deep Sleep режимине кирүүдөн мурун каалаган убакта орнотсо болот.

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 перифериалдары Deep Sleep учурунда тирүү калат.

esp_deep_sleep_enable_ext0_wakeup (gpio_num_t gpio_num, int деңгээл)

gpio_num> GPIO номери жандандыруу булагы катары колдонулат. Бир гана RTC-функционалдуу GPIO колдонулушу мүмкүн: 0, 2, 4, 12-15, 25-27, 32-39.

деңгээл> ойготкучту иштете турган киргизүү деңгээли (0 = LOW, 1 = HIGH)

5 -кадам: Тышкы ойгонуу (ext1)

RTC контроллери бир нече RTC GPIOдорун колдонуп, будильникти иштетүү үчүн логиканы камтыйт.

esp_deep_sleep_enable_ext1_wakeup (uint64_t маскасы, esp_ext1_wakeup_mode_t режими)

маска> жандантууга алып келүүчү GPIO номерлеринин бит маскасы. Бул битмартта RTC иштетилген GPIOдор гана колдонулушу мүмкүн: 0, 2, 4, 12-15, 25-27, 32-39.

режим> жандандыруу шарттарын аныктоо үчүн колдонулган логикалык функцияны тандаңыз:

• ESP_EXT1_WAKEUP_ALL_LOW: бардык тандалган GPIO LOW абалында болгондо ойгонот

• ESP_EXT1_WAKEUP_ANY_HIGH: тандалган GPIO'лордун бири ЖОГОРУ болгондо ойгонот

6 -кадам: ULP копроцессорунун ойгонуусу

ULP сопроцессору чип Deep Sleep режиминде иштеп, сенсорлорду издөө, ADC же сыйымдуу сенсордук баалуулуктарды көзөмөлдөө жана белгилүү бир окуя аныкталганда чипти иштетүү үчүн колдонулушу мүмкүн.

ULP сопроцессору RTC перифериялык түзүлүштөрүнүн күч доменинин бир бөлүгү болуп саналат жана жай эстутум RTCде сакталган программаны иштетет. Ошондуктан, RTC перифериялык түзүлүштөрү жана RTC жай эс тутуму Deep Sleep учурунда иштетилет, эгерде бул активация режими суралса.

7 -кадам: Сенсордук такта

RTC контроллери сыйымдуу сенсорлорду колдонуп ойготкучту иштетүү үчүн логиканы камтыйт. Тийүү пин аныктамасы, бирок, башкача. Биз каалаган казык үчүн тийүү үзгүлтүгүн колдонушубуз керек.

Үзгүлтүктөрдү койгондон кийин, сенсорлорду колдонуу үчүн ойготуу режимин иштеттик.

// Touchpadти ойготуу булагы катары конфигурациялоо esp_sleep_enable_touchpad_wakeup ();

8 -кадам: Терең уйку режимине кирүү

Ойготуу режимин орноткондон кийин, ESP32ди Deep Sleep режимине коюу үчүн бир буйрук (2,5 мкА же андан аз сарптоо) жетиштүү. Мен бул жерде бул чыгым ESP чипинен эмес, пластинкадан экенин баса белгилейм, анткени экинчиси көбүрөөк сарптайт.

esp_deep_sleep_start ();

Бул буйруктан ESP32 уктап калат жана мисалы коддун кийинки саптарын аткарбайт.

Маанилүү: Бардык ойгонуу орнотуулары жогорудагы буйрукту аткаруудан мурун жасалышы керек.

9 -кадам: Бул жерде дагы маанилүү маалыматтар бар

Бул жерде дагы маанилүү маалыматтар бар
Бул жерде дагы маанилүү маалыматтар бар

Төмөндөгү чалуу ESP32 ойгонуу себебин кайтарат.

1: EXT0 2: EXT1 3: TIMER 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;

10 -кадам: Демонстрация

Демонстрация
Демонстрация

Видеодо программанын сүрөткө ылайык иштегени көрсөтүлгөн.

11-кадам: WiFi NodeMCU-32S ESP-WROOM-32

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

12 -кадам: Ассамблея

Ассамблея
Ассамблея

13 -кадам: Программа

Эми биз ESP32ди терең уйку режимине кирүү үчүн конфигурациялай турган программа жасайбыз. Бул үч башка жол менен ойготулат: бири Тышкы ойготуу үчүн (ext0), бири Таймер үчүн, бири Touchpad үчүн. Алар чогуу иштей алышпайт, ошондуктан биз ESP32 жүктөөчүгө ойгонуу жолун конфигурациялоо үчүн эсептегич боло турган өзгөрмөнү колдонобуз.

14 -кадам: Китепкана керек

Китепкана керек
Китепкана керек

OLED дисплейин көзөмөлдөө үчүн бизге тышкы китепкана керек. Бул үчүн биз U8g2 китепканасын жүктөп алабыз.

Arduino IDEде эскиз менюсуна өтүңүз >> Китепкананы кошуу >> Китепканаларды башкаруу….

15 -кадам: Китепканалар жана өзгөрмөлөр

Биз OLED дисплейин көзөмөлдөө үчүн китепкананы, ошондой эле дисплей контролерунун мисалынын конструкторун коштук. Ошондой эле, биз өзгөрмөнү RTC эсинде бөлүштүрөбүз. Биз сенсордук кабыл алуу үчүн сезимталдыкты, микросекунддук конверсиялык факторду жана ESP32 уктоо режимине (секундада) кеткен убакытты койдук.

#include // biblioteca para controle do display Олед

// дисплейдин көзөмөлдөөчүсү // SDA = 21 e SCL = 22 U8X8_SSD1306_128X64_NONAME_SW_I2C дисплейи (SCL, SDA, U8X8_PIN_NONE); // RTC_DATA_ATTR, RTC_DATA_ATTR int bootCount = 0; // sensibilidade para aceitação do toque #define Threshold 40 // fgg de microsegundos for segundos #define uS_TO_S_FACTOR 1000000 // темптин ылдамдыгы ESP32 ficará em modo sleep (emgundos) #define TIME_TO_SLEEP 3

16 -кадам: Орнотуу

Орнотууда, биз жүктөө учурларынын санын көбөйтөбүз. Биз функцияны Boot мотивин басып чыгаруу деп атайбыз. Эгерде жүктөө номери PAR болсо, биз ESP32ди (EXT0) баскычы аркылуу ойгонууга койдук. Эгерде бул 3кө эсе болсо, биз ESP32ди белгиленген убакыттан кийин ойгонууга койдук. Болбосо, биз ESP32ди ойготуу үчүн сыйымдуу тийүү казыктарын орноттук. Акыр -аягы, биз сенсордук панелди ойгонуу булагы катары коюп, ESP32ди уйку режимине кирүүгө мажбур кылабыз.

void setup () {Serial.begin (115200); кечигүү (1000); // баскычтарды жүктөө же жүктөө BOO ocorreu ++ bootCount; configureDisplay (); // чоо -жайын жүктөө BOOT print_wakeup_reason (); // жүктөө PAR конфигурациясы үчүн ESP32 үчүн жүктөө (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); } // ESP32 же башка контактты орнотуу конфигурациясы { /Touch Pad 5 (GPIO12) touchAttachInterrupt боюнча үзгүлтүккө учуратуу (T5, кайра чалуу, босого); // Touchpadти ойготуу булагы катары конфигурациялоо esp_sleep_enable_touchpad_wakeup (); } Serial.println ("modo sleep"); esp_deep_sleep_start (); // ESP32 режимине киргизүү SLEEP}

17 -кадам: Loop, Callback & ConfigureDisplay

Циклда бизде эч нерсе жок. Андан кийин, эгерде үзгүлтүккө учураганда эмне кылыш керек болсо, биз кайра чалууну токтото баштайбыз. ConfigureDisplayге келсек, биз дисплейди баштайбыз жана кээ бир параметрлерди конфигурациялайбыз. Биз экранда Бут канча жолу болгонун басып чыгарабыз.

// жок болсо, эч кандай loopvoid loop () {} // кайра чалуу жокко чыгарылбайт () {// caso queira fazer algo ao ocorrer a interrupção} void configureDisplay () {// дисплей же конфигурация параметрлери дисплейлери. баштоо (); display.setPowerSave (0); // modo powerSave (0-Өчүрүү? 1-Күйгүзүү) display.setFont (u8x8_font_torussansbold8_u); // fonte utilizada // unpime no display no BOO display.drawString (0, 0, "BOOT NUM:"); display.drawString (0, 2, String (bootCount).c_str ()); display.drawString (0, 4, "MOTIVO:"); }

18 -кадам: Print_wakeup_reason (Ойгонуунун себебин билүү)

Бул жерде бизде ESP32 ойгонуу себебин басып чыгаруу функциясы бар. Пинди текшериңиз жана дисплейде басып чыгарыңыз.

// funcão para impimir a causea to 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) {1 -жагдай: reason = "EXT0 RTC_IO BTN"; тыныгуу; 2 -жагдай: себеп = "EXT1 RTC_CNTL"; тыныгуу; 3 -жагдай: себеп = "TIMER"; тыныгуу; case 4: reason = "TOUCHPAD"; тыныгуу; case 5: reason = "ULP PROGRAM"; тыныгуу; default: reason = "NO DS CAUSE"; тыныгуу; } Serial.println (себеби); display.clearLine (6); // дисплейде дисплей.drawString (0, 6, reason.c_str ()) көрсөтүлөт; // unpime a causa do despertar no display // TOUCHPAD, десек, эгер сиз (ойготуу_себеби == 4) {print_wakeup_touchpad (); // верифика же импримей дисплей жок}}

19 -кадам: Print_wakeup_touchpad (GPIO Touch билүү)

Эми, бул кадамда, биз тийген пинди басып чыгаруу функциясына ээбиз. Биз ESP32ди ойготкон GPIOду калыбына келтирдик жана аны дисплейге басып чыгардык.

// funcão para impirir to printad of print print_wakeup_touchpad () {touch_pad_t touchPin; touchPin = esp_sleep_get_touchpad_wakeup_status (); // GPIO тизмеси же 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); // дисплей Display.drawString (0, 7, "GPIO:"); display.drawString (6, 7, GPIO.c_str ()); // GPIO}

20 -кадам: Файлдарды жүктөп алыңыз

PDF

МЕН ЖОК

Сунушталууда: