Si predstavljate, da bi vaš projekt na običajnih baterijah AA deloval skoraj 5 let? To je mogoče s čipom ESP32.
Hackster Inc.
2021-297-54
Kaj smo uporabili v tem projektu
Dragi prijatelji, dobrodošli v branju tega članka! Tokrat se bomo naučili, kako preklopiti čip ESP32 v način globokega spanja, da prihranimo energijo in naredimo naše projekte prijazne do baterije. Si predstavljate, da načrtujete projekt, ki bo deloval na običajnih baterijah AA skoraj 5 let? To je mogoče s čipom ESP32.
Čip ESP32 je fantastičen čip z odličnimi lastnostmi. Ponuja veliko procesorske moči, dve 32-bitni jedri, veliko pomnilnika, Bluetooth in WiFi v majhnem in enostavnem čipu. Ena najbolj zanimivih stvari pri čipu ESP32 je ta, da ponuja način globokega spanja z nizko porabo energije, ki je zelo enostaven za uporabo. Poglejmo, kako ga uporabiti.
Ta vsebina je samo za naročnike
1. korak: kaj potrebujemo?
V tem članku bom uporabil nekatere komponente. Zato, če želite ta projekt preizkusiti sami, potrebujete naslednje:
- Katero koli ESP32 ploščo – http://educ8s.tv/part/ESP32
- Firebeetle ESP32 ploščo – http://educ8s.tv/part/FireBeetle
- Razvojno ploščo – http://educ8s.tv/part/LargeBreadboard
- Povezovalne žice – http://educ8s.tv/part/Wires
- LEDice – http://educ8s.tv/part/LEDs
- Multimeter – http://educ8s.tv/part/Multimeter
2. korak: sestava ESP32 plošče
Znotraj ESP32 čipa lahko najdemo dve procesorski jedri, RAM in ROM pomnilnik, WiFi modul, Bluetooth modul, modul za pospeševanje strojne opreme za kriptografske aplikacije, RTC modul in veliko periferije. Znotraj RTC modula lahko najdemo PMU (Phasor merilno enoto) majhen 32-bitni koprocesor in 8 KB pomnilnika RAM, ki porabi malo energije. Ta majhna količina pomnilnika je zelo koristna, saj boste to ugotovili v trenutku. Upoštevajte tudi, da je celo pomnilnik RTC modula znotraj čipa ESP32 4-krat večji od pomnilnika Arduino Uno.
WiFi moduli, procesorska jedra in Bluetooth modul potrebujejo za delovanje veliko toka. Če želimo varčevati z energijo, jih moramo onemogočiti, kadar jih ne uporabljamo. To bomo storili zdaj. ESP32 bomo postavili v način globokega spanja, kjer se onemogoči vse, razen RTC modula.
Obstajata način spanja in način globokega spanja. V načinu globokega spanja ESP32 ponuja najnižjo porabo energije. V načinu globokega spanja potrebuje le 0,01 mAs energije in zato bomo to poskusili realizirati.
3. korak: ESP32 v režimu globokega spanja
V tem načinu, kot sem že rekel, je vse onemogočeno. Vsa CPU jedra, WiFI in Bluetooth modula, periferija in tako naprej. Skupaj s CPU je onemogočen tudi glavni pomnilnik čipa, zato je vse, kar je shranjeno v pomnilniku, za vedno izgubljeno.
Edini modul, ki še vedno deluje v načinu globokega spanja, je RTC modul, soprocesor z izjemno nizko porabo in njegov pomnilnik! Torej, če podatke, ki jih želimo shraniti v načinu globokega spanja, shranimo v RTC pomnilnik, bodo podatki, ko čip spet zbudimo, nedotaknjeni.
Obstajajo trije načini za prebujanje čipa. Uporabimo lahko časovnik, GPIO pin ali soprocesor.
Tokrat se bomo naučili, kako s pomočjo časovnika prebuditi čip po določenem času. Poglejmo primer.
4. korak: primer globokega spanja
Na ESP32 ploščo sem priključil dve LED-ici. Ko se ESP32 zažene, za tri sekunde zasveti rumena LED-ica, nato pa za 3 sekunde preide v način globokega spanja. Ko se zbudi, za 3 sekunde prižge zeleno LED-ico in spet zaspi.
Odslej bo utripala le zelena LED-ica, zato se čip spomni, da se ob zagonu ne vklopi, ker uporabljamo RTC pomnilnik za shranjevanje celoštevilčne vrednosti.
Na hitro si oglejmo kodo tega projekta. Kot lahko vidite, je koda zelo preprosta. Za preklop ESP32 v način globokega spanja potrebujemo le dve vrstici kode.
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); esp_deep_sleep_start();
Časovnik omogočimo s funkcijo esp_sleep_enable_timer_wakeup, čas spanja vnesemo v sekundah, nato pa pokličemo funkcijo esp_deep_sleep_start. To je to!
#define uS_TO_S_FACTOR 1000000 /* Conversion factor for micro seconds to seconds */ #define TIME_TO_SLEEP 3 /* Time ESP32 will go to sleep (in seconds) */ RTC_DATA_ATTR int bootCount = 0;
Vendar obstaja pri izvajanju kode majhna razlika. Ko uporabimo funkcijo globokega spanja vsakič, ko se ESP32 zbudi, znova izvede nastavitveno funkcijo. Funkcija zanke se nikoli ne pokliče. Vse vrednosti spremenljivk so izgubljene, razen če jih s to predpono shranimo v RTC pomnilnik.
V tem primeru shranimo spremenljivko bootCount int v RTC pomnilnik da program ve, ali se prvič zažene, in vklopim pravilno LED-ico. Kot vedno najdete kodo tega primera na spletni strani.
5. korak: poraba energije
Poglejmo zdaj porabo energije ESP32. Ko je ESP32 v aktivnem načinu, iz baterije črpa približno 60 mA toka. Ko je ESP32 v načinu globokega spanja, porabi približno 19 mAs energije! To je veliko zmanjšanje trenutne porabe, vendar ustvarjalci čipa trdijo, da potrebuje 0,01 mA toka v načinu globokega spanja. Kaj je narobe z našo nastavitvijo?
Krivec je razvojna plošča. Uporabljam DOIT ESP32 ploščo, prvo ESP32 ploščo, ki se je pojavila na trgu pred približno enim letom. Zasnova te plošče ni optimizirana za porabo energije, zato tudi v načinu globokega spanja potrebuje veliko toka. Na srečo obstajajo bolje načrtovane ESP32 plošče.
Na primer, plošča Firebeetle ESP32 podjetja DFrobot je bolje zasnovana in lahko doseže porabo energije v globokem spanju le 0,01 mΑs, če jo napaja 3,3 V napajalnik. Če ploščo napajamo z istim akumulatorjem, ki smo ga uporabljali prej in ima približno 4,8 V, lahko vidimo, da je trenutna poraba energije 48 mAs v aktivnem načinu in le 0,05 mAs v načinu globokega spanja!
Impresivno kajne! Porabo energije plošče lahko še dodatno zmanjšamo, če uporabimo 3,3 V baterijo ali napajalnik. 0,05 mΑs energije, ki jo plošča potrebuje v načinu globokega spanja, je najnižje, kar sem kdaj videl na popolnoma opremljeni ESP32 plošči s pretvornikom iz USB na serijska vrata, z napetostnim regulatorjem in vezjem akumulatorja.
Če ste odkrili katero koli ploščo, ki lahko doseže podobne ali boljše rezultate kot plošča Firebeetle, mi to sporočite, rad bi jo preizkusil.
Poraba energije Firebeetle ESP32 plošče v režimu globokega spanja je izredno nizka. Če jo napajajo 4 AA polnilne baterije, porabi približno 1,44 mΑhs na dan. Torej teoretično lahko ta napajalna enota z zmogljivostjo 2.500 mAhs napaja ploščo skoraj 5 let, če jo postavimo v način globokega spanja! Seveda bomo ploščo občasno prebudili, da bomo opravili nalogo, ki bo zahtevala več energije, zato se bo življenjska doba baterije močno zmanjšala.
6. korak: hrošč v režimu globokega spanja
Na žalost programska in strojna oprema ESP32 še nista zrela. Na obeh ESP32 ploščah, ki sem ju poskusil v režimu globokega spanja, se pojavi napaka v programski ali strojni opremi. Po naključnem številu bujenj ESP32 preide v stanje spanja in se ne bo več zbudil. Ta napaka se lahko zgodi po nekaj zbujanjih ali po 100 zbujanjih in je naključna.
Enostavna rešitev, ki sem jo odkril, je dodati majhno zakasnitev 500 ms po prebujanju in pred branjem iz RTC pomnilnika. Na ta način je projekt dobro deloval, seveda pa kazen, ki jo plačamo, zmanjša življenjsko dobo baterije, ker je čip v vsakem prebujanju v aktivnem načinu še 500 ms več. Mislim, da bo ta napaka v bližnji prihodnosti odpravljena z novim popravkom programske ali strojne opreme.
void setup(){ pinMode(GREEN_LED_PIN,OUTPUT); pinMode(YELLOW_LED_PIN,OUTPUT); delay(500); if(bootCount == 0) //Run this only the first time { digitalWrite(YELLOW_LED_PIN,HIGH); bootCount = bootCount+1; }else { digitalWrite(GREEN_LED_PIN,HIGH); }
delay(3000); digitalWrite(GREEN_LED_PIN,LOW);
digitalWrite(YELLOW_LED_PIN,LOW); esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
esp_deep_sleep_start();
}
7. korak: zaključne misli
Funkcijo globokega spanja sem že uporabil v projektu termometra E-Paper. Za posodabljanje je potreboval tok 60 mA. Zdaj sem z uporabo funkcije globokega spanja čipa uspel zmanjšati porabo energije na 0,43 mA. Torej, s to napajalno banko imamo zdaj približno 3 mesece delovanja baterije. Super, kajne?
Mislim pa, da je še veliko prostora za izboljšave; nekje v mojem vezju odteka majhen neželen tok. Če ga lahko zmanjšamo, lahko ta projekt na baterije napajamo več kot eno leto! Mislim, da je to neverjetno! Zdaj imamo izjemno zmogljivo ploščo z zelo majhno porabo energije. Najboljše od vsega je, da vse, kar moramo storiti, da to izkoristimo je to, da uporabimo le dve vrstici kode! To funkcijo bom začel uporabljati v svojih prihodnjih projektih.
void setup(){ pinMode(GREEN_LED_PIN,OUTPUT); pinMode(YELLOW_LED_PIN,OUTPUT); delay(500); if(bootCount == 0) //Run this only the first time { digitalWrite(YELLOW_LED_PIN,HIGH); bootCount = bootCount+1; }else { digitalWrite(GREEN_LED_PIN,HIGH); } delay(3000); digitalWrite(GREEN_LED_PIN,LOW); digitalWrite(YELLOW_LED_PIN,LOW); esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); esp_deep_sleep_start(); }
Viri:
1: https://bit.ly/3nXkQko
Povzeto po:
https://www.hackster.io/nickthegreek82/esp32-deep-sleep-tutorial-4398a7