Sadržaj:

Štednja trajanja baterije uz duboki san: 20 koraka
Štednja trajanja baterije uz duboki san: 20 koraka

Video: Štednja trajanja baterije uz duboki san: 20 koraka

Video: Štednja trajanja baterije uz duboki san: 20 koraka
Video: Часы G Shock до 100 долларов-15 лучших часов Casio G Shock до 100 дол... 2024, Studeni
Anonim
Image
Image
Načini buđenja ESP32
Načini buđenja ESP32

Jeste li zainteresirani za korištenje baterije sa svojim ESP32? Ako je tako, danas ću raspravljati o nekim važnim tehničkim podacima o ovoj temi. Znamo da ovaj mikrokontroler troši puno energije kada prenosi informacije. Potroši blizu 190 miliampera. U ovom videu pokazat ću kako uštedjeti energiju iz ESP32 pomoću takozvane funkcije "DEEP SLEEP". Postavit ćemo čip za ulazak u ovaj način rada, naučiti načine izlaska iz ovog načina rada i stvoriti primjer koji prikazuje tri različita načina buđenja ESP32.

Važno je zapamtiti da radio troši puno energije, a ne procesor. Ušteda energije je vrlo važna. To je zato što se krajnje točke (sklopovi koji šalju informacije) često napajaju iz baterije i trebale bi trajati do pet godina. Neki proizvođači obećavaju trajanje do deset godina, a to vrijedi za visokokvalitetne baterije koje ne koriste toliko krajnje točke. U svim ostalim slučajevima savjetujem vam da koristite način dubokog sna za uštedu energije iz strujnog kruga.

Korak 1: Uvod

ESP32 ima način rada za uštedu energije, nazvan "Duboki san". U ovom načinu rada CPU -i, većina RAM -a i sve digitalne periferije sa taktom su isključeni. Jedini dijelovi čipa koji se još mogu spojiti su RTC kontroler, RTC periferija (uključujući ULP koprocesor) i RTC memorije.

Imamo nekoliko načina da probudimo ESP32 dok spavamo. Izvori buđenja mogu se postaviti u bilo koje vrijeme prije ulaska u način dubokog mirovanja.

Korak 2: Načini buđenja ESP32

Postoji pet načina za buđenje ESP32:

• Odbrojavanje vremena

• Vanjsko buđenje (ext0)

• Vanjsko buđenje (ext1)

• Buđenje koprocesora ULP -a

• Dodirna podloga

Korak 3: Odbrojavanje vremena

RTC kontroler ima ugrađeni mjerač vremena koji se može koristiti za aktiviranje čipa nakon unaprijed definiranog vremenskog razdoblja. Vrijeme je navedeno s mikrosekundnom preciznošću.

esp_deep_sleep_enable_timer_wakeup (uint64_t time_in_us)

time_in_us> je vrijeme u mikrosekundama

Korak 4: Vanjsko buđenje (ext0)

RTC IO modul sadrži logiku za aktiviranje alarma kada jedan od RTC GPIO uđe na unaprijed definiranu logičku razinu. RTC IO dio je domene napajanja RTC perifernih uređaja, pa će se periferne jedinice RTC -a održavati na životu tijekom dubokog sna ako se zatraži ovaj izvor aktivacije.

esp_deep_sleep_enable_ext0_wakeup (gpio_num_t gpio_num, int level)

gpio_num> GPIO broj koji se koristi kao izvor aktivacije. Mogu se koristiti samo GPIO-i s RTC funkcijom: 0, 2, 4, 12-15, 25-27, 32-39.

razina> ulazna razina koja će aktivirati alarm (0 = NISKA, 1 = VISOKA)

Korak 5: Vanjsko buđenje (ext1)

RTC kontroler sadrži logiku za aktiviranje budilice pomoću više RTC GPIO.

esp_deep_sleep_enable_ext1_wakeup (uint64_t maska, esp_ext1_wakeup_mode_t način)

maska> bitna maska GPIO brojeva koja će uzrokovati aktivaciju. U ovoj se bitmapi mogu koristiti samo GPIO-i s omogućenim RTC-om: 0, 2, 4, 12-15, 25-27, 32-39.

mode> odaberite logičku funkciju koja se koristi za određivanje uvjeta aktivacije:

• ESP_EXT1_WAKEUP_ALL_LOW: budi se kada su svi odabrani GPIO -i u NIZKOM

• ESP_EXT1_WAKEUP_ANY_HIGH: budi se kada je bilo koji od odabranih GPIO -a VISOK

Korak 6: Buđenje koprocesora ULP -a

ULP koprocesor može raditi dok je čip u dubokom mirovanju i može se koristiti za pretraživanje senzora, praćenje vrijednosti ADC -a ili kapacitivnog osjetnika na dodir te aktiviranje čipa kada se detektira određeni događaj.

ULP koprocesor dio je domene napajanja RTC perifernih uređaja i pokreće program pohranjen u RTC sporoj memoriji. Stoga će se periferni uređaji RTC -a i usporena memorija RTC -a aktivirati tijekom dubokog mirovanja ako se zatraži ovaj način aktivacije.

Korak 7: Dodirna podloga

RTC kontroler sadrži logiku za aktiviranje alarma pomoću kapacitivnih senzora dodira. Definicija dodirne iglice je, međutim, drugačija. Moramo koristiti prekid dodira za svaki od željenih pinova.

Nakon postavljanja prekida, omogućili smo način buđenja za korištenje senzora.

// Konfiguriranje dodirne podloge kao izvora buđenja esp_sleep_enable_touchpad_wakeup ();

Korak 8: Ulazak u način dubokog mirovanja

Nakon postavljanja načina buđenja, dovoljna je jedna naredba za prebacivanje ESP32 u način dubokog mirovanja (potrošnja 2,5 μA ili manje). Ovdje naglašavam da je taj trošak iz ESP čipa, a ne iz ploče, jer potonji troši više.

esp_deep_sleep_start ();

Iz ove naredbe ESP32 zaspi i ne izvršava sljedeće redove koda, na primjer.

Važno: Prije izvršavanja gornje naredbe potrebno je izvršiti sve postavke buđenja.

Korak 9: Evo još važnijih informacija

Evo još nekih važnih informacija
Evo još nekih važnih informacija

Donji poziv vraća uzrok buđenja ESP32.

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

esp_sleep_get_wakeup_cause ();

Ako smo postavili buđenje pomoću dodirne podloge, pomoću naredbe možemo oporaviti GPIO do kojeg je došlo do dodira

esp_sleep_get_touchpad_wakeup_status ();

Svaki put kad se ESP32 probudi, ponovno će proći kroz postavku. Tako će se sve varijable koje nisu definirane u RTC memoriji vratiti u početno stanje.

Da biste zadržali varijable u memoriji čak i nakon što zaspite, upotrijebite deklaraciju varijable u donjem primjeru:

// RTC_DATA_ATTR za promjenjivu memoriju RTCRTC_DATA_ATTR int bootCount = 0;

Korak 10: Demonstracija

Demonstracija
Demonstracija

Video prikazuje rad programa, u skladu sa slikom.

11. korak: WiFi NodeMCU-32S ESP-WROOM-32

WiFi čvorMCU-32S ESP-WROOM-32
WiFi čvorMCU-32S ESP-WROOM-32

Korak 12: Montaža

Skupština
Skupština

Korak 13: Program

Sada ćemo napraviti program u kojem ćemo konfigurirati ESP32 za ulazak u način dubokog mirovanja. To će se probuditi na tri različita načina: jedan za vanjsko buđenje (ext0), jedan za mjerač vremena i jedan za dodirnu podlogu. Ne mogu raditi zajedno, pa ćemo koristiti varijablu koja će biti brojač koliko je puta ESP32 dao Boot za konfiguriranje načina buđenja.

Korak 14: Potrebna biblioteka

Knjižnica obavezna
Knjižnica obavezna

Za upravljanje OLED zaslonom potrebna nam je vanjska knjižnica. Za to ćemo preuzeti knjižnicu U8g2.

U Arduino IDE -u idite na izbornik Sketch >> Include Library >> Manage Libraries ….

Korak 15: Knjižnice i varijable

Uključili smo knjižnicu za upravljanje OLED zaslonom, kao i konstruktor instance kontrolera zaslona. Također, varijablu dodjeljujemo u RTC memoriji. Postavili smo osjetljivost za prihvaćanje dodira, faktor pretvorbe u mikrosekundama za sekunde i vrijeme kada ESP32 prelazi u stanje mirovanja (u sekundama).

#include // biblioteca para controle do display oled

// konstruktor za instalaciju kontrolera za prikaz // SDA = 21 e SCL = 22 U8X8_SSD1306_128X64_NONAME_SW_I2C zaslon (SCL, SDA, U8X8_PIN_NONE); // RTC_DATA_ATTR za promjenu memorije RTC RTC_DATA_ATTR int bootCount = 0; // sensibilidade para aceitação do toque #define Threshold 40 // fator de razgovaã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

Korak 16: Postavljanje

U postavkama povećavamo broj pojavljivanja pokretanja. Pozivamo funkciju ispisa motiva čizme. Ako je Boot number PAR, postavili smo ESP32 da se probudi pomoću gumba (EXT0). Ako je višekratnik 3, postavili smo ESP32 da se probudi nakon zadanog vremena. Inače smo postavili kapacitivne dodirne pinove za buđenje ESP32. Konačno, postavili smo dodirnu podlogu kao izvor buđenja i prisilili ESP32 da uđe u način mirovanja.

void setup () {Serial.begin (115200); kašnjenje (1000); // inkrementa o numero de vezes que o BOOT ocorreu ++ bootCount; configureDisplay (); // chama a função para imprimir o motivo do BOOT print_wakeup_reason (); // prikazuje se broj pokretanja za PAR konfiguracije ili ESP32 za despertar através do botão (EXT0) if (bootCount % 2 == 0) {esp_sleep_enable_ext0_wakeup (GPIO_NUM_39, 1); // 1 = Visoko, 0 = Nisko} // se za multiplo de 3 konfiguracije o ESP32 za despertar depois de um tempo definido else if (bootCount % 3 == 0) {esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); } // caso contrario configuramos os pinos de touch kapacitivo para despertar o ESP32 else {// Setup interrupt on Touch Pad 5 (GPIO12) touchAttachInterrupt (T5, povratni poziv, prag); // Konfiguriranje dodirne podloge kao izvora buđenja esp_sleep_enable_touchpad_wakeup (); } Serial.println (“entrando em modo sleep”); esp_deep_sleep_start (); // força o ESP32 ulazak u mod SLEEP}

Korak 17: Petlja, povratni poziv i konfiguriranje prikaza

U Petlji nemamo što raditi. Zatim nastavljamo s prekidom povratnog poziva ako imamo što učiniti kada dođe do prekida. Što se tiče configureDisplay, pokrećemo zaslon i konfiguriramo neke parametre. Na zaslonu ispisujemo koliko se puta dogodilo podizanje sustava.

// nada a se fazer no loopvoid loop () {} // callback das interrupções void callback () {// caso queira fazer algo ao ocorrer a interrupção} void configureDisplay () {// inicializiranje prikaza e konfiguracija alguns parametros display. početi(); 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:"); }

Korak 18: Print_wakeup_reason (znajući uzrok buđenja)

Ovdje imamo funkciju ispisa uzroka buđenja ESP32. Provjerite iglu i ispišite na zaslonu.

// 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) {slučaj 1: razlog = "EXT0 RTC_IO BTN"; pauza; slučaj 2: reason = "EXT1 RTC_CNTL"; pauza; slučaj 3: reason = "TIMER"; pauza; slučaj 4: reason = "TOUCHPAD"; pauza; slučaj 5: reason = "ULP PROGRAM"; pauza; default: reason = "NO DS CAUSE"; pauza; } Serial.println (razlog); 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 bez prikaza}}

Korak 19: Print_wakeup_touchpad (poznajte GPIO Touch)

Sada, u ovom koraku, imamo funkciju ispisivanja dodirnute iglice. Oporavili smo GPIO koji je probudio ESP32 i ispisali ga na zaslonu.

// 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"; pauza; slučaj 1: GPIO = "0"; pauza; slučaj 2: GPIO = "2"; pauza; slučaj 3: GPIO = "15"; pauza; slučaj 4: GPIO = "13"; pauza; slučaj 5: GPIO = "12"; pauza; slučaj 6: GPIO = "14"; pauza; slučaj 7: GPIO = "27"; pauza; slučaj 8: GPIO = "33"; pauza; slučaj 9: GPIO = "32"; pauza; zadano: Serial.println ("Buđenje nije pomoću dodirne podloge"); pauza; } 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}

Korak 20: Preuzmite datoteke

PDF

INO

Preporučeni: