Cuprins:

Economisirea duratei de viață a bateriei cu somn profund: 20 de pași
Economisirea duratei de viață a bateriei cu somn profund: 20 de pași

Video: Economisirea duratei de viață a bateriei cu somn profund: 20 de pași

Video: Economisirea duratei de viață a bateriei cu somn profund: 20 de pași
Video: 20 De LUCRURI UIMITOARE, Pe Care Nu Le Stiai Acum 5 Minute 2024, Noiembrie
Anonim
Image
Image
Modalități de a trezi ESP32
Modalități de a trezi ESP32

Ești interesat să folosești o baterie cu ESP32-ul tău? Dacă da, voi discuta astăzi câteva informații tehnice importante referitoare la acest subiect. Știm că acest microcontroler cheltuie multă energie atunci când transmite informații. Consumă aproape 190 de miliamperi. În acest videoclip, voi arăta cum să economisiți energia de la ESP32 cu așa-numita funcție „DEEP SLEEP”. Vom seta cipul pentru a intra în acest mod, vom învăța modalitățile de ieșire din acest mod și vom crea un exemplu care arată trei moduri diferite de a activa ESP32.

Este important să ne amintim că radioul cheltuiește multă energie, mai degrabă decât procesorul. Economisirea de energie este foarte importantă. Acest lucru se datorează faptului că punctele finale (circuitele care trimit informații) sunt adesea alimentate cu baterii și ar trebui să dureze până la cinci ani. Există unii producători care promit o durată de până la zece ani, iar acest lucru este valabil pentru bateriile de înaltă calitate care nu utilizează atât de mult Endpoints. În toate celelalte cazuri, vă sfătuiesc să utilizați Deep Sleep pentru a economisi energie din circuit.

Pasul 1: Introducere

ESP32 are un mod de economisire a energiei, numit „Deep Sleep”. În acest mod, CPU-urile, majoritatea memoriei RAM și toate perifericele cu ceas digital sunt oprite. Singurele părți ale cipului care pot fi încă conectate sunt controlerul RTC, perifericele RTC (inclusiv coprocesorul ULP) și memoria RTC.

Avem mai multe moduri de a trezi ESP32 când dormim. Sursele de trezire pot fi configurate în orice moment înainte de a intra în modul Deep Sleep.

Pasul 2: Moduri de a trezi ESP32

Există cinci moduri de a trezi ESP32:

• Temporizator

• Trezire externă (ext0)

• Trezire externă (ext1)

• Trezirea coprocesorului ULP

• Touchpad

Pasul 3: Cronometru

Controlerul RTC are un temporizator încorporat care poate fi utilizat pentru a activa cipul după o perioadă de timp predefinită. Ora este specificată cu precizie de microsecundă.

esp_deep_sleep_enable_timer_wakeup (uint64_t time_in_us)

time_in_us> este timpul în microsecunde

Pasul 4: Trezire externă (ext0)

Modulul RTC IO conține logică pentru a declanșa alarma atunci când unul dintre GPIO-urile RTC intră într-un nivel logic predefinit. RTC IO face parte din domeniul de alimentare al perifericelor RTC, astfel încât perifericele RTC vor fi menținute în viață în timpul Deep Sleep dacă se solicită această sursă de activare.

esp_deep_sleep_enable_ext0_wakeup (gpio_num_t gpio_num, nivel int)

gpio_num> Număr GPIO utilizat ca sursă de activare. Se pot utiliza numai GPIO-uri funcționale RTC: 0, 2, 4, 12-15, 25-27, 32-39.

nivel> nivel de intrare care va declanșa alarma (0 = LOW, 1 = HIGH)

Pasul 5: Trezire externă (ext1)

Controlerul RTC conține logică pentru a declanșa ceasul deșteptător utilizând mai multe GPIO-uri RTC.

esp_deep_sleep_enable_ext1_wakeup (masca uint64_t, modul esp_ext1_wakeup_mode_t)

mască> mască de biți a numerelor GPIO care vor provoca activarea. Numai GPIO-urile cu RTC pot fi utilizate în această bitmap: 0, 2, 4, 12-15, 25-27, 32-39.

mod> selectați funcția logică utilizată pentru a determina condiția de activare:

• ESP_EXT1_WAKEUP_ALL_LOW: se trezește când toate GPIO-urile selectate sunt în LOW

• ESP_EXT1_WAKEUP_ANY_HIGH: se trezește când oricare dintre GPIO-urile selectate sunt HIGH

Pasul 6: Trezirea coprocesorului ULP

Coprocesorul ULP poate funcționa în timp ce cipul se află în Deep Sleep și poate fi utilizat pentru a căuta senzori, pentru a monitoriza valorile senzorilor ADC sau senzori tactili capacitivi și pentru a activa cipul atunci când este detectat un anumit eveniment.

Coprocesorul ULP face parte din domeniul de alimentare al perifericelor RTC și rulează programul stocat în RTC cu memorie lentă. Prin urmare, perifericele RTC și memoria lentă RTC vor fi activate în timpul Deep Sleep dacă este solicitat acest mod de activare.

Pasul 7: Touchpad

Controlerul RTC conține logică pentru a declanșa alarma utilizând senzorii tactili capacitivi. Cu toate acestea, definiția pinului tactil este diferită. Trebuie să folosim întreruperea tactilă pentru fiecare dintre pinii doriti.

După setarea întreruperilor, am activat modul de trezire pentru a utiliza senzorii.

// Configurați touchpadul ca sursă de trezire esp_sleep_enable_touchpad_wakeup ();

Pasul 8: intrarea în modul Deep Sleep

După setarea unui mod de trezire, este suficientă o singură comandă pentru a pune ESP32 în modul Deep Sleep (cheltuind 2,5 μA sau mai puțin). Subliniez aici că această cheltuială provine din cipul ESP și nu din placă, întrucât acesta din urmă cheltuie mai mult.

esp_deep_sleep_start ();

Din această comandă, ESP32 adoarme și nu execută, de exemplu, următoarele linii de cod.

Important: Toate setările de trezire trebuie făcute înainte de a executa comanda de mai sus.

Pasul 9: Iată câteva informații mai importante

Iată câteva informații mai importante
Iată câteva informații mai importante

Apelul de mai jos returnează cauza trezirii ESP32.

1: EXT0 2: EXT1 3: TIMER 4: TOUCHPAD 5: ULP

esp_sleep_get_wakeup_cause ();

Dacă setăm trezirea prin touchpad, putem recupera ce GPIO a avut loc prin atingere prin comandă

esp_sleep_get_touchpad_wakeup_status ();

De fiecare dată când ESP32 se trezește, va reveni la configurare. Astfel, toate variabilele care nu sunt definite în memoria RTC vor reveni la starea lor de origine.

Pentru a păstra variabilele în memorie chiar și după ce ați adormit, utilizați declarația variabilei din exemplul de mai jos:

// RTC_DATA_ATTR aloca a variável na memória RTCRTC_DATA_ATTR int bootCount = 0;

Pasul 10: demonstrație

Demonstrație
Demonstrație

Videoclipul arată programul funcționând, în conformitate cu imaginea.

Pasul 11: WiFi NodeMCU-32S ESP-WROOM-32

Node WiFi MCU-32S ESP-WROOM-32
Node WiFi MCU-32S ESP-WROOM-32

Pasul 12: Asamblare

Asamblare
Asamblare

Pasul 13: Program

Vom crea acum un program în care vom configura ESP32 pentru a intra în modul Deep Sleep. Acest lucru va fi trezit în trei moduri diferite: unul pentru trezire externă (ext0), unul pentru temporizator și unul pentru touchpad. Nu pot funcționa împreună, așa că vom folosi o variabilă care va fi un contor de câte ori ESP32 a dat Boot pentru a configura modul de trezire.

Pasul 14: Bibliotecă obligatorie

Bibliotecă obligatorie
Bibliotecă obligatorie

Pentru a controla afișajul OLED, avem nevoie de o bibliotecă externă. Pentru aceasta, vom descărca biblioteca U8g2.

În IDE-ul Arduino, accesați meniul Sketch >> Includeți biblioteca >> Gestionați bibliotecile….

Pasul 15: Biblioteci și variabile

Am inclus biblioteca pentru a controla afișajul OLED, precum și un constructor al instanței controlerului de afișare. De asemenea, alocăm variabila în memoria RTC. Am setat sensibilitatea pentru acceptarea la atingere, factorul de conversie microsecundă pentru secunde și timpul în care ESP32 trece în modul de repaus (în secunde).

#include // biblioteca pentru control do display oled

// construtor da instancia do controlador do display // SDA = 21 e SCL = 22 U8X8_SSD1306_128X64_NONAME_SW_I2C display (SCL, SDA, U8X8_PIN_NONE); // RTC_DATA_ATTR aloca a variável na memoria RTC RTC_DATA_ATTR int bootCount = 0; // sensibilitate pentru acțiune 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) #define TIME_TO_SLEEP 3

Pasul 16: Configurare

În Setup, incrementăm numărul de ocazii de boot. Apelăm la funcția de a imprima motivul Boot. Dacă numărul de pornire este PAR, setăm ESP32 să se trezească prin butonul (EXT0). Dacă este multiplu de 3, setăm ESP32 să se trezească după un timp stabilit. În caz contrar, am configurat pinii tactili capacitivi pentru a trezi ESP32. În cele din urmă, setăm touchpadul ca sursă de trezire și forțăm ESP32 să intre în modul de repaus.

void setup () {Serial.begin (115200); întârziere (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 o number de boot for PAR configuramos o ESP32 pentru despertar através do botão (EXT0) if (bootCount% 2 == 0) {esp_sleep_enable_ext0_wakeup (GPIO_NUM_39, 1); // 1 = High, 0 = Low} // se for multiplo de 3 configuramos o ESP32 pentru despertar depois de um tempo definit else if (bootCount% 3 == 0) {esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); } // caz contrar configurăm os pinos de touch capacitivo pentru despertar o ESP32 else {// Setup interrupt on Touch Pad 5 (GPIO12) touchAttachInterrupt (T5, callback, Threshold); // Configurați touchpadul ca sursă de trezire esp_sleep_enable_touchpad_wakeup (); } Serial.println („intrând în mod somn”); esp_deep_sleep_start (); // força o ESP32 intră în mod SLEEP}

Pasul 17: Buclă, apel invers și configurare Afișare

În Buclă, nu avem nimic de făcut. Apoi procedăm la întreruperea apelului de apel dacă avem ceva de făcut atunci când are loc întreruperea. În ceea ce privește configureDisplay, inițializăm afișajul și configurăm unii parametri. Imprimăm pe ecran de câte ori s-a produs Boot-ul.

// nada a se fazer no loopvoid loop () {} // callback das interrupções void callback () {// caz că se va face ceva până la o întrerupere} void configureDisplay () {// initializa o display și configura unele parametros display. începe(); display.setPowerSave (0); // modo powerSave (0-Off? 1-On) display.setFont (u8x8_font_torussansbold8_u); // fonte utilizada // imprime no display os number de vezes that aconteceu o BOOT display.drawString (0, 0, "BOOT NUM:"); display.drawString (0, 2, String (bootCount).c_str ()); display.drawString (0, 4, "MOTIVO:"); }

Pasul 18: Print_wakeup_reason (cunoașterea cauzei trezirii)

Aici avem funcția de a imprima cauza trezirii ESP32. Verificați pinul și imprimați pe afișaj.

// função para imprimir a causa do ESP32 despertarvoid print_wakeup_reason () {esp_sleep_wakeup_cause_t wakeup_reason; String reason = ""; wakeup_reason = esp_sleep_get_wakeup_cause (); // recupera a causa do despertar switch (wakeup_reason) {case 1: reason = "EXT0 RTC_IO BTN"; pauză; caz 2: motiv = "EXT1 RTC_CNTL"; pauză; caz 3: motiv = "TIMER"; pauză; caz 4: motiv = "TOUCHPAD"; pauză; caz 5: motiv = "PROGRAM ULP"; pauză; implicit: reason = "NO DS CAUSE"; pauză; } Serial.println (motiv); display.clearLine (6); // apaga a linha 6 do display 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}}

Pasul 19: Print_wakeup_touchpad (cunoașteți GPIO Touch)

Acum, în acest pas, avem funcția de a imprima pinul care a fost atins. Am recuperat GPIO care a trezit ESP32 și l-am imprimat pe ecran.

// funcție pentru imprimir o pino care a fost tocadovoid print_wakeup_touchpad () {touch_pad_t touchPin; touchPin = esp_sleep_get_touchpad_wakeup_status (); // recuperează o GPIO care vă despertou o ESP32 String GPIO = ""; switch (touchPin) {caz 0: GPIO = "4"; pauză; cazul 1: GPIO = "0"; pauză; cazul 2: GPIO = "2"; pauză; caz 3: GPIO = "15"; pauză; cazul 4: GPIO = "13"; pauză; cazul 5: GPIO = "12"; pauză; cazul 6: GPIO = "14"; pauză; caz 7: GPIO = "27"; pauză; caz 8: GPIO = "33"; pauză; caz 9: GPIO = "32"; pauză; implicit: Serial.println („Wakeup not by touchpad”); pauză; } Serial.println ("GPIO:" + GPIO); display.clearLine (7); // apaga a linha 7 do display display.drawString (0, 7, "GPIO:"); display.drawString (6, 7, GPIO.c_str ()); // imprime o GPIO}

Pasul 20: Descărcați fișierele

PDF

EU NU

Recomandat: