Cuprins:
- Pasul 1: Introducere
- Pasul 2: Moduri de a trezi ESP32
- Pasul 3: Cronometru
- Pasul 4: Trezire externă (ext0)
- Pasul 5: Trezire externă (ext1)
- Pasul 6: Trezirea coprocesorului ULP
- Pasul 7: Touchpad
- Pasul 8: intrarea în modul Deep Sleep
- Pasul 9: Iată câteva informații mai importante
- Pasul 10: demonstrație
- Pasul 11: WiFi NodeMCU-32S ESP-WROOM-32
- Pasul 12: Asamblare
- Pasul 13: Program
- Pasul 14: Bibliotecă obligatorie
- Pasul 15: Biblioteci și variabile
- Pasul 16: Configurare
- Pasul 17: Buclă, apel invers și configurare Afișare
- Pasul 18: Print_wakeup_reason (cunoașterea cauzei trezirii)
- Pasul 19: Print_wakeup_touchpad (cunoașteți GPIO Touch)
- Pasul 20: Descărcați fișierele
Video: Economisirea duratei de viață a bateriei cu somn profund: 20 de pași
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:45
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
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
Videoclipul arată programul funcționând, în conformitate cu imaginea.
Pasul 11: WiFi NodeMCU-32S ESP-WROOM-32
Pasul 12: 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
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
EU NU
Recomandat:
Economisirea bateriei Fairy Light: 8 pași (cu imagini)
Economisirea bateriei Fairy Light: bateriile CR2032 sunt grozave, dar nu durează atât de mult pe cât ne-am dori când conducem LED-uri „Fairy Light” Strings.With the Holiday Season here, am decis să modific câteva 20 de șiruri ușoare pentru a rula de pe o bancă de alimentare USB. Am căutat online și
Economisirea bateriei, comutatorul decuplat al protectorului de descărcare cu ATtiny85 pentru bateria cu plumb acid sau bateria Lipo: 6 pași
Economisirea bateriei, comutatorul decuplat pentru protecția de descărcare cu ATtiny85 pentru bateria cu plumb acid sau bateria Lipo: Deoarece am nevoie de mai multe protecții pentru baterii pentru mașinile și sistemele mele solare, le găsisem pe cele comerciale la 49 USD prea scumpe. De asemenea, folosesc prea multă putere cu 6 mA. Nu am găsit nicio instrucțiune cu privire la acest subiect. Așa că mi-am făcut propriul meu care atrage 2mA. Cum se face
Stație meteo: ESP8266 Cu somn profund, SQL, graficare prin balon și complot: 3 pași
Stație meteo: ESP8266 Cu Deep Sleep, SQL, Graphing by Flask & Plotly: Ar fi distractiv să știi temperatura, umiditatea sau intensitatea luminii de pe balconul tău? Știu că aș face-o. Așa că am făcut o stație meteo simplă pentru a colecta astfel de date. Următoarele secțiuni sunt pașii pe care i-am făcut pentru a construi unul. Să începem
Senzor de mișcare ESP-01 cu somn profund: 5 pași
Senzor de mișcare ESP-01 cu somn profund: am lucrat la realizarea unor senzori de mișcare de casă care trimit un mesaj de e-mail la declanșare. Există multe exemple instructabile și alte exemple de a face acest lucru. De curând am avut nevoie să fac asta cu un senzor de mișcare PIR cu baterie și un ESP
Ziua săptămânii, calendar, timp, umiditate / temperatură cu economisirea bateriei: 10 pași (cu imagini)
Ziua săptămânii, calendar, timp, umiditate / temperatură cu economisirea bateriei: modul de economisire a energiei este ceea ce diferențiază acest instructabil de alte exemple care arată ziua săptămânii, luna, ziua lunii, ora, umiditatea și temperatura. Această capacitate permite acest proiect să fie rulat de la o baterie, fără t