- Vaatimukset
- ESP32-lepotilan piirikaavio
- ESP32: n lepotilojen yleiskatsaus
- ESP32: n ohjelmointi syvälle lepotilaan
- ESP32: n testaaminen syvässä lepotilassa
ESP32 on yksi suosituimmista Wi-Fi-pohjaisista mikrokontrollerimoduuleista, ja se on suosittu valinta monissa kannettavissa IoT-sovelluksissa. Se on tehokas ohjain, joka tukee kaksoisydinohjelmointia ja jolla on myös sisäänrakennettu Bluetooth Low Energy (BLE) -tuki, joten se on hyvä valinta kannettaville sovelluksille, kuten iBeacon-laitteille, GPS-paikannimille jne. Kuitenkin tällaisissa akkukäyttöisissä sovelluksissa, suurin huolenaihe on akun varmuuskopiointi. Tätä akun varmuuskopiota voidaan lisätä älykkäämmällä mikrokontrolleriyksikön hallinnalla, kuten voidaan ohjelmoida ESP32 lepotilassa ihanteellisessa tilassa laitteen akun varmuuskopion lisäämiseksi.
Tässä projektissa tarkistamme laajasti suositun Wi-Fi- ja Bluetooth-yhteensopivan ESP32-mikrokontrolleriyksikön nykyisen kulutuksen normaalissa käyttötilassa ja syvässä lepotilassa. Testataan myös ero ja tarkistetaan, kuinka ESP32 laitetaan syvään lepotilaan. Voit myös lukea artikkelin siitä, kuinka minimoida mikro-ohjainten virrankulutus, ja saada muita vinkkejä, joita voidaan käyttää tekemään suunnittelustasi paljon energiatehokkaampi. Lisäksi, jos olet kiinnostunut muiden mikrokontrollerien lepotilasta, voit myös tarkistaa Arduino-lepotilan ja ESP8266 NodeMCU-lepotilan.
Vaatimukset
Tätä varten käytämme Espressifin ESP32-pohjaista Devkit V4.0: ta, jolla on USB-UART-silta, sekä muita ESP32-liitäntöjä helpon yhteyden muodostamiseksi. Ohjelmointi tehdään Arduino IDE: llä. Jos olet täysin uusi, lue linkitetty artikkeli ennen kuin jatkat, jotta pääset alkuun ESP32: n käyttämisestä Arduinolla.
Tämän projektin vaatimukset ovat seuraavat:
- Se siirtyy syvään lepotilaan napin painalluksella.
- Se herää syvästä lepotilasta painamalla toista painiketta.
- ESP32: n tilan havaitsemiseksi LED vilkkuu, kun käynnistysaika on 1000 millisekuntia. Lepotilan aikana se kytketään pois päältä.
Siksi tarvitaan lisää komponentteja -
- LED - 1 kpl
- Painike (kosketuskytkin) - 2 kpl
- 4.7k vastukset - 2 kpl
- 680R-vastus - 1 kpl
- Leipälauta
- Kiinnitä johto
- 5 V: n sovitin tai virtalähde
- Mikro-USB-kaapeli
- Arduino IDE ESP32-ohjelmointirajapinnalla PC: ssä tai kannettavassa tietokoneessa.
ESP32-lepotilan piirikaavio
Alla on kaavio ESP32: n nukkumisesta painikkeella.
Kaavio on melko yksinkertainen. Siinä on kaksi painiketta. Nukkumispainike siirtää ESP32: n syvään lepotilaan ja toista kytkintä käytetään ESP32: n herättämiseen lepotilasta. Molemmat painikkeet on kytketty PIN 16: een ja PIN 33: een. Molemmat painikkeet on määritetty aktiiviseksi mataliksi, kun niitä painetaan. Kuitenkin sen havaitsemiseksi, onko ESP 32 lepotilassa vai normaalissa toimintatilassa, LED on kytketty IO-nastaan 4.
ESP32: n lepotilojen yleiskatsaus
ESP32: lla on monia erilaisia virtatiloja, nimittäin aktiivinen tila, modeemin lepotila, kevyt lepotila, syvä lepotila ja horrostila.
Normaalissa työskentelyolosuhteissa ESP32 toimii aktiivisessa tilassa. Aikana ESP32 aktiivinen tila, CPU, WiFi / BT-laitteet, RTC muisti ja RTC oheislaitteet, ULP apuprosessoreita, kaikki aktivoidaan ja työ työtilanteesta riippuen. Eri virtatiloissa yksi tai useampi oheislaite on kuitenkin kytketty pois päältä. Voit tarkistaa eri virtatilan toiminnot noudattamalla seuraavaa taulukkoa -
Laitteisto |
Aktiivinen tila |
Modeemi-lepotila |
Kevyt lepotila |
Syvä lepotila |
Lepotila |
prosessori |
PÄÄLLÄ |
PÄÄLLÄ |
TAUKO |
VINOSSA |
VINOSSA |
WiFi / BT |
PÄÄLLÄ |
VINOSSA |
VINOSSA |
VINOSSA |
VINOSSA |
RTC ja RTC-oheislaitteet |
PÄÄLLÄ |
PÄÄLLÄ |
PÄÄLLÄ |
PÄÄLLÄ |
VINOSSA |
ULP-Co-prosessori |
PÄÄLLÄ |
PÄÄLLÄ |
PÄÄLLÄ |
PÄÄLLE / POIS |
VINOSSA |
Kuten yllä olevasta taulukosta voidaan nähdä, ESP32-syvä lepotilassa, jota kutsutaan usein ULP-anturivalvotuksi malliksi - CPU, WiFi / BT, RTC-muisti ja oheislaitteet, ULP-rinnakkaisprosessorit ovat pois päältä. Vain RTC-muisti ja RTC-oheislaitteet ovat päällä.
Herätystilanteessa ESP32: lle on ilmoitettava herätyslähteestä, joka herättää ESP32: n syvän lepotilasta. Koska RTC-oheislaitteet on kytketty päälle, ESP32 voidaan herätä RTC-yhteensopivien GPIO-laitteiden kautta. On myös muita vaihtoehtoja. Se voi herätä ulkoisen herätyksen keskeytysnastan kautta tai ajastimen avulla ESP32: n herättämiseen. Tässä projektissa käytämme ext0-herätystä nastassa 33.
ESP32: n ohjelmointi syvälle lepotilaan
Koko ohjelma löytyy tämän sivun alaosasta. Se on kirjoitettu Arduino IDE: lle ja voidaan siten helposti mukauttaa tarpeisiisi. Koodi selitetään seuraavasti.
Koodin alussa
// Luo PushButton- muuttuja PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // määritä led-tappi uint8_t led_pin = GPIO_NUM_4; // määritä herätystappi uint8_t wakeUp_pin = GPIO_NUM_33;
Yllä olevat kolme riviä määrittävät herätystapin, LED-nastan ja lepotilan nastan.
void setup () { // laita asetuskoodisi tähän, jotta se voidaan suorittaa kerran: // aseta sarjaportti 115200 Serial.begin (115200); viive (1000); // aseta pushButton-nasta tuloksi sisäisellä PullUp pinMode -toiminnolla (pushBtn.pin, INPUT_PULLUP); // aseta keskeytyskäsittelijä pushButton-nastalla putoamistilaan attachInterrupt (pushBtn.pin, isr_handle, FALLING); // aseta Led-tappi muotoon pinMode (led_pin, OUTPUT); // luo tehtävä, joka suoritetaan blinkLed () -toiminnossa, prioriteetti 1 ja suoritetaan ytimellä 0 xTaskCreate ( blinkLed, / * Tehtävätoiminto. * / "blinkLed", / * tehtävän nimi. * / 1024 * 2, / * Tehtävän pinon koko * / NULL, / * tehtävän parametri * / 5, / * tehtävän prioriteetti * / & taskBlinkled); / * Tehtävän kahva seurata luotua tehtävää * / delay (500); // Määritä nasta 33 ext0-herätyslähteeksi LOW-logiikkatasolla esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0); }
Edellä on keskeytys asetettu pudotustilaan koodinpätkällä
attachInterrupt (pushBtn.pin, isr_handle, FALLING);
Siksi aina kytkintä painettaessa logiikkataso muuttuu logiikasta 1 (3,3 V) logiikaksi 0 (0 V). Napinastan jännite laskee ja ESP32 tunnistaa kytkimen painamisen. On myös luotu tehtävä, joka vilkuttaa LEDiä.
xTaskCreate ( blinkLed, / * Tehtävätoiminto. * / "blinkLed", / * tehtävän nimi. * / 1024 * 2, / * Tehtävän pinon koko * / NULL, / * tehtävän parametri * / 5, / * prioriteetti tehtävän * / & taskBlinkled); / * Tehtävän kahva seurata luotua tehtävää * / delay (500);
Tappi 33 on myös konfiguroitu käyttämällä alla olevaa koodinpätkää ulkoisena herätyslähteenä, joka tunnistetaan ext0: ksi.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
Seuraavaksi silmukassa
void loop () { // laita pääkoodisi tähän toistettavaksi: if (pushBtn.pressed) { Serial.printf ("PushButton (% d) Pressed \ n", pushBtn.pin); Serial.printf ("Keskeytä 'blinkLed' -tehtävä \ n"); // Keskeytä blinkLed Task vTaskSuspend (taskBlinkled); digitalWrite (led_pin, LOW); Serial.printf ("Mene nukkumaan….. \ n", pushBtn.pin); pushBtn.pressed = false; // Siirry nukkumaan nyt esp_deep_sleep_start (); } esp_sleep_wakeup_cause_t wakeupReason; wakeupReason = esp_sleep_get_wakeup_cause (); switch (wakeupReason) { tapaus ESP_SLEEP_WAKEUP_EXT0: Serial.println ("ulkoisen signaalin ext0 käyttäminen WakeUp From lepotilassa"); tauko; tapaus ESP_SLEEP_WAKEUP_EXT1: Serial.println ("ulkoisen signaalin ext1 käyttö WakeUp From lepotilasta"); tauko; tapaus ESP_SLEEP_WAKEUP_TIMER: Serial.println ("Ajastinsignaalin käyttäminen WakeUp From sleep -tilaan"); tauko; tapaus ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("Kosketusalustan signaalin käyttäminen WakeUp From lepotilasta"); tauko; tapaus ESP_SLEEP_WAKEUP_ULP: Serial.println ("käyttää ULP-signaalia WakeUp From sleep -tilassa"); tauko; oletus: tauko; Serial.printf ("Jatka 'blinkLed' -tehtävää \ n"); // Käynnistä blinkLed Task vTaskResume (taskBlinkled) uudelleen; } }
While-silmukka tarkistaa jatkuvasti, painetaanko lepopainiketta vai ei. Jos painiketta painetaan, se pysäyttää tai keskeyttää LED-vilkkumistehtävän ja suorittaa esp-syvän lepotilan käynnistystoiminnon -
esp_deep_sleep_start ();
Tässä tilanteessa, jos ulkoisen ext0-keskeytyspainiketta painetaan, se herää välittömästi syväunetilasta ja jatkaa led-vilkkumistehtävää.
Lopuksi LED-vilkkumistoiminto näkyy alla olevissa katkelmissa, se vilkkuu LEDiä 1000 ms sekunnissa.
void blinkLed (void * param) { while (1) { staattinen uint32_t pin_val = 0; // vaihda pin-arvo pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led -----------------% s \ n", pin_val? "Päällä": "Pois"); / * Vaihda LED vain 1000 ms: n tai 1 sekunnin välein * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
ESP32: n testaaminen syvässä lepotilassa
Piiri on rakennettu leipälautaan ja Metravi XB Edition -yleismittaria käytetään virran mittaamiseen. Piirin ottama virta aktiivisessa tilassa on melkein 58 mA, mutta syvässä lepotilassa virta on melkein 4,10 mA. Kuvan alapuolella näkyy ESP32-virran kulutus -
Syvä lepotilassa virrankulutus kirjataan noin 3,95 mA: een, alla olevassa kuvassa näkyy ESP32-syvän lepotilan virrankulutus -
Syvä lepotilassa ESP32: n nykyinen kulutus on kuitenkin lähes 150 uA. Tämän ESP32 Devkit -levyn kirjattu virrankulutus on kuitenkin lähes 4,10 mA. Tämä johtuu CP2102: sta ja lineaarisesta säätimestä. Nämä kaksi on kytketty 5 V: n sähköjohtoon. Voimajohtoon on kytketty myös virran LED, joka kuluttaa lähes 2mA virtaa.
Siksi voidaan helposti tunnistaa, että ESP32 kuluttaa hyvin vähän energiaa syvässä lepotilassa, mikä on erittäin hyödyllistä akkukäyttöisissä toiminnoissa. Lisätietoja alla olevasta videosta saat siitä, miten se toimi. Jos sinulla on kysyttävää, jätä ne alla olevaan kommenttiosioon tai käytä foorumeitamme muihin teknisiin kysymyksiin.