- Krav
- ESP32 kredsløbsdiagram for dvaletilstand
- Oversigt over dvaletilstande i ESP32
- Programmering ESP32 til Deep Sleep Mode
- Test af ESP32 i dyb dvaletilstand
ESP32 er et af de mest populære Wi-Fi-baserede mikrocontroller-moduler, og det er et populært valg i mange bærbare IoT-applikationer. Det er en kraftfuld controller, der understøtter Dual Core-programmering og har også indbygget Bluetooth Low Energy (BLE) understøttelse, hvilket gør det til et godt valg til bærbare applikationer som i iBeacon-enheder, GPS-trackere osv. I batteridrevne applikationer som disse., den største bekymring er backup af batteri. Denne sikkerhedskopiering af batteriet kan øges ved mere intelligent kontrol over mikrocontrollerenheden, ligesom man kan programmere ESP32 i dvaletilstand under den ideelle tilstand for at øge batteriets backup af enheden.
I dette projekt vil vi kontrollere det nuværende forbrug af meget populær Wi-Fi og Bluetooth-aktiveret mikrokontroller enhed ESP32 i normal arbejdstilstand og dyb søvntilstand. Vi vil også teste forskellen og kontrollere, hvordan du sætter ESP32 i dyb søvntilstand. Du kan også tjekke artiklen om, hvordan du minimerer strømforbruget i mikrocontrollere for andre tip, der kan bruges til at gøre dit design meget mere energieffektivt. Desuden, hvis du er interesseret i andre mikrokontrollers dvaletilstand, kan du også chekke ud Arduino-dvaletilstand og ESP8266 NodeMCU-dvaletilstand.
Krav
For at gøre dette bruger vi ESP32-baseret Devkit V4.0 fra Espressif, der har USB til UART bridge samt andre ESP32 pinouts for nem forbindelse. Programmeringen foretages med Arduino IDE. Hvis du er helt ny, skal du læse den linkede artikel for at komme i gang med ESP32 ved hjælp af Arduino, før du fortsætter.
Kravene i dette projekt er følgende:
- Det går i dyb søvntilstand ved et tryk på en knap.
- Det vågner op fra dyb søvntilstand ved at trykke på en anden knap.
- For at registrere ESP32-tilstanden blinker en LED med en tændtid på 1000 millisekunder. Under dvaletilstand slukkes den.
Derfor kræves yderligere komponenter-
- LED - 1 stk
- Trykknap (taktil kontakt) - 2 stk
- 4,7 k modstande - 2 stk
- 680R modstand - 1 stk
- Brødbræt
- Tilslut ledningen
- 5V adapter eller strømforsyning
- Et mikro-USB-kabel
- Arduino IDE med ESP32 programmeringsgrænseflade i en pc eller bærbar computer.
ESP32 kredsløbsdiagram for dvaletilstand
Skematisk at sætte ESP32 i dvale med trykknap er vist nedenfor.
Skematisk er ret simpelt. Den har to knapper. Sleep-knappen sætter ESP32 i dyb dvaletilstand, og en anden switch bruges til at vække ESP32 fra dvaletilstand. Begge knapper er tilsluttet i PIN 16 og PIN 33. Begge knapper er konfigureret som aktive lave, når der trykkes på dem, og der gives derfor en ekstra pull-up. For at registrere, om ESP 32 er i dvaletilstand eller normal driftstilstand, er LED imidlertid forbundet til IO Pin 4.
Oversigt over dvaletilstande i ESP32
Der er mange forskellige strømtilstande til ESP32, nemlig aktiv tilstand, modemmetilstand, let dvaletilstand, dyb dvaletilstand og dvaletilstand.
Under den normale arbejdstilstand kører ESP32 i aktiv tilstand. I ESP32-aktiv tilstand er CPU, WiFi / BT-hardware, RTC-hukommelse og RTC-periferiudstyr, ULP-co-processorer, alle aktiveret og fungerer afhængigt af arbejdsbyrden. På forskellige strømtilstande er en eller flere eksterne enheder dog slukket. Følg nedenstående tabel for at kontrollere forskellige strømtilstandsfunktioner -
Hardware |
Aktiv tilstand |
Modem-dvaletilstand |
Let dvaletilstand |
Deep-sleep Mode |
Dvaletilstand |
CPU |
PÅ |
PÅ |
PAUSE |
AF |
AF |
WiFi / BT |
PÅ |
AF |
AF |
AF |
AF |
RTC- og RTC-periferiudstyr |
PÅ |
PÅ |
PÅ |
PÅ |
AF |
ULP-Co-processor |
PÅ |
PÅ |
PÅ |
TÆND SLUK |
AF |
Som vi kan se i ovenstående tabel, er det i ESP32 dyb dvaletilstand, der ofte kaldes ULP-sensorovervåget mønster - CPU, WiFi / BT, RTC-hukommelse og perifert udstyr, ULP-co-processorer alle er slået fra. Kun RTC-hukommelsen og RTC-periferiudstyr er tændt.
Under vækningssituationen skal ESP32 underrettes af en vækkekilde, der vil vække ESP32 fra dyb søvntilstand. Da RTC-periferiudstyr er tændt, kan ESP32 imidlertid vågnes gennem RTC-aktiverede GPIO'er. Der er også andre muligheder. Det kan være vågne op ved hjælp af en ekstern vågne afbryderstifter eller bruge en timer til at vække ESP32. I dette projekt bruger vi ext0 wakeup på pin 33.
Programmering ESP32 til Deep Sleep Mode
Det komplette program findes nederst på denne side. Den er skrevet til Arduino IDE og kan derfor let tilpasses dine behov. Forklaringen på koden er som følger.
I begyndelsen af koden, // Opret en PushButton-variabel PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // definer Led Pin uint8_t led_pin = GPIO_NUM_4; // definer wake up pin uint8_t wakeUp_pin = GPIO_NUM_33;
Ovenstående tre linjer definerer wake-up pin, LED pin og sleep mode pin.
ugyldig opsætning () { // sæt din opsætningskode her for at køre en gang: // indstil den serielle port til 115200 Serial.begin (115200); forsinkelse (1000); // indstil pushButton-stiften som input med intern PullUp pinMode (pushBtn.pin, INPUT_PULLUP); // sæt Interrupt-håndtereren med trykknappen i faldende tilstand attachInterrupt (pushBtn.pin, isr_handle, FALLING); // indstil Led pin som ouput pinMode (led_pin, OUTPUT); // Opret en opgave, der udføres i blinkLed () -funktionen, med prioritet 1 og udføres på kerne 0 xTaskCreate ( blinkLed, / * Task-funktion. * / "blinkLed", / * opgavens navn. * / 1024 * 2, / * Stakkestørrelse for opgave * / NULL, / * parameter for opgaven * / 5, / * prioritet for opgaven * / & taskBlinkled); / * Opgavehåndtag for at holde styr på den oprettede opgave * / forsinkelse (500); // Konfigurer pin 33 som ekst0 vækkekilde med LOW logikniveau esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0); }
I ovenstående er afbrydelsen indstillet til en faldende tilstand ved hjælp af kodestykket
attachInterrupt (pushBtn.pin, isr_handle, FALLING);
Derfor ændres logikniveauet, når der trykkes på kontakten, fra logik 1 (3.3V) til logisk 0 (0V). Spændingen på knapstiften falder, og ESP32 identificerer, at der trykkes på kontakten. Der er også en opgave oprettet for at blinke LED.
xTaskCreate ( blinkLed, / * Opgavefunktion. * / "blinkLed", / * opgavens navn. * / 1024 * 2, / * Stakestørrelse for opgave * / NULL, / * parameter for opgaven * / 5, / * prioritet af opgaven * / & taskBlinkled); / * Opgavehåndtag for at holde styr på den oprettede opgave * / forsinkelse (500);
Stiften 33 er også konfigureret ved hjælp af nedenstående kodestykke som en ekstern vækningskilde identificeret som ext0.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
Dernæst i mens løkken
void loop () { // sæt din hovedkode her for at køre gentagne gange: hvis (pushBtn.pressed) { Serial.printf ("PushButton (% d) Pressed \ n", pushBtn.pin); Serial.printf ("Suspender" blinkLed "-opgaven \ n"); // Suspender blinkLed Task vTaskSuspend (taskBlinkled); digitalWrite (led_pin, LOW); Serial.printf ("Sove….. \ n", pushBtn.pin); pushBtn.pressed = false; // Gå i dvale nu esp_deep_sleep_start (); } esp_sleep_wakeup_cause_t wakeupReason; wakeupReason = esp_sleep_get_wakeup_cause (); switch (wakeupReason) { case ESP_SLEEP_WAKEUP_EXT0: Serial.println ("ved hjælp af eksternt signal ext0 til WakeUp From sleep"); pause; sag ESP_SLEEP_WAKEUP_EXT1: Serial.println ("ved hjælp af eksternt signal ekst1 til WakeUp Fra søvn"); pause; sag ESP_SLEEP_WAKEUP_TIMER: Serial.println ("ved hjælp af timersignal til WakeUp From sleep"); pause; sag ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("ved hjælp af TouchPad-signal til WakeUp Fra søvn"); pause; sag ESP_SLEEP_WAKEUP_ULP: Serial.println ("ved hjælp af ULP-signal til WakeUp From sleep"); pause; standard: pause; Serial.printf ("Genoptag 'blinkLed' opgaven \ n"); // genstart blinkLed Task vTaskResume (taskBlinkled); } }
Mens loop løbende kontrollerer, om søvnknappen trykkes eller ej. Hvis der trykkes på knappen, vil den stoppe eller suspendere LED-blinkopgaven og køre esp deep sleep start-funktionen -
esp_deep_sleep_start ();
I denne situation, hvis der trykkes på ekstern ekstern afbryderknap, vågner den straks op fra dyb dvaletilstand og genoptager led-blink-opgaven.
Endelig kan LED-blinkfunktionen ses i nedenstående uddrag, den blinker LED 1000 ms sekunder.
ugyldigt blinkLed (ugyldigt * param) { mens (1) { statisk uint32_t pin_val = 0; // skift pinværdien pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led -----------------% s \ n", pin_val? "Til": "Fra"); / * Skift blot LED hver 1000 ms eller 1 sek. * / VTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
Test af ESP32 i dyb dvaletilstand
Kredsløbet er konstrueret i et brødbræt, og et Metravi XB-udgave multimeter bruges til at måle strømmen. Strømmen trukket af kredsløbet i aktiv tilstand er næsten 58 mA, men i dyb søvntilstand er strømmen næsten 4,10 mA. Billedet nedenfor viser det aktuelle forbrug af ESP32 aktiv tilstand -
I dyb dvaletilstand registreres det aktuelle forbrug faldet til ca. 3,95 mA, nedenstående billede viser ESP32 dyb dvaletilstand Strømforbrug-
I dyb søvntilstand er ESP32's nuværende forbrug imidlertid næsten 150 uA. Men det registrerede strømforbrug for dette ESP32 Devkit-kort er næsten 4,10 mA. Dette skyldes CP2102 og den lineære regulator. Disse to er forbundet til 5V-strømledningen. Der er også en strøm-LED tilsluttet i strømledningen, der bruger næsten 2 mA strøm.
Derfor kan det let identificeres, at ESP32 bruger en meget lav mængde energi i tilstanden dyb dvaletilstand, hvilket er meget nyttigt til batteridrevne operationer. For mere information om, hvordan det fungerede, se videoen, der er linket nedenfor. Hvis du har spørgsmål, skal du lade dem være i kommentarfeltet nedenfor eller bruge vores fora til andre tekniske spørgsmål.