- Krav
- ESP32 Kretsdiagram for hvilemodus
- Oversikt over hvilemodus i ESP32
- Programmering ESP32 for dyp hvilemodus
- Testing av ESP32 i dyp hvilemodus
ESP32 er en av de mest populære Wi-Fi-baserte mikrokontrollermodulene, og det er et populært valg i mange bærbare IoT-applikasjoner. Det er en kraftig kontroller som støtter Dual Core-programmering, og har også innebygd Bluetooth Low Energy (BLE) -støtte, noe som gjør det til et godt valg for bærbare applikasjoner som i iBeacon-enheter, GPS-sporere osv. I batteridrevne applikasjoner som disse., den største bekymringen er backup av batteri. Denne batterisikkerhetskopien kan økes ved smartere kontroll over mikrokontrollerenheten, slik som man kan programmere ESP32 i hvilemodus under den ideelle tilstanden for å øke batteriets sikkerhetskopi av enheten.
I dette prosjektet vil vi sjekke det nåværende forbruket av populær Wi-Fi- og Bluetooth-aktivert mikrokontrollerenhet ESP32 i normal arbeidsmodus og dyp søvnmodus. Vi vil også teste forskjellen og sjekke hvordan du setter ESP32 i dyp søvnmodus. Du kan også sjekke ut artikkelen om hvordan du minimerer strømforbruket i mikrokontrollere for andre tips som kan brukes til å gjøre designet ditt mye mer energieffektivt. Videre, hvis du er interessert i hvilemodus til andre mikrokontrollere, kan du også sjekke ut Arduino-hvilemodus og ESP8266 NodeMCU-hvilemodus.
Krav
For å gjøre dette vil vi bruke ESP32-basert Devkit V4.0 fra Espressif som har USB til UART bridge, samt andre ESP32 pinouts for enkel tilkobling. Programmeringen vil bli gjort med Arduino IDE. Hvis du er helt ny, kan du lese den koblede artikkelen før du fortsetter for å komme i gang med ESP32 ved hjelp av Arduino.
Kravene til dette prosjektet er følgende:
- Det vil gå inn i dyp søvnmodus ved å trykke på en knapp.
- Den våkner fra dyp søvnmodus ved å trykke på en annen knapp.
- For å oppdage tilstanden til ESP32 vil en LED blinke med en påslagstid på 1000 millisekunder. I hvilemodus blir den slått av.
Derfor kreves det flere komponenter -
- LED - 1 stk
- Trykknapp (taktil bryter) - 2 stk
- 4.7k motstander - 2 stk
- 680R motstand - 1 stk
- Brettbrett
- Koble opp ledningen
- 5V adapter eller strømforsyning
- En mikro-USB-kabel
- Arduino IDE med ESP32 programmeringsgrensesnitt på en PC eller bærbar PC.
ESP32 Kretsdiagram for hvilemodus
Skjematisk skjema for å sette ESP32 i dvale med trykknappen er vist nedenfor.
Skjematisk er ganske enkelt. Den har to knapper. Søvnknappen setter ESP32 i dyp hvilemodus, og en annen bryter brukes til å vekke ESP32 fra hvilemodus. Begge knappene er koblet til i PIN 16 og PIN 33. Begge knappene er konfigurert som aktive lave når du trykker på dem, og det gis derfor en ekstra pull-up. For å oppdage om ESP 32 er i hvilemodus eller normal arbeidsforholdsmodus, er LED imidlertid koblet til IO Pin 4.
Oversikt over hvilemodus i ESP32
Det er mange forskjellige strømmoduser for ESP32, nemlig aktiv modus, modem hvilemodus, lett hvilemodus, dyp hvilemodus og dvalemodus.
Under normal arbeidsforhold kjører ESP32 i aktiv modus. I ESP32 aktiv modus er CPU, WiFi / BT-maskinvare, RTC-minne og RTC-periferiutstyr, ULP-prosessorer, alle aktivert og fungerer avhengig av arbeidsmengden. Imidlertid er en eller flere eksterne enheter slått av på forskjellige strømmoduser. For å sjekke forskjellige strømmodusoperasjoner, følg tabellen nedenfor -
Maskinvare |
Aktiv modus |
Modem-hvilemodus |
Lys hvilemodus |
Dyp søvnmodus |
Dvale |
prosessor |
PÅ |
PÅ |
PAUSE |
AV |
AV |
WiFi / BT |
PÅ |
AV |
AV |
AV |
AV |
RTC og RTC periferiutstyr |
PÅ |
PÅ |
PÅ |
PÅ |
AV |
ULP-Co prosessor |
PÅ |
PÅ |
PÅ |
PÅ AV |
AV |
Som vi kan se i tabellen ovenfor, er det i ESP32 dyp søvnmodus som ofte kalles ULP-sensorovervåket mønster - CPU, WiFi / BT, RTC-minne og periferiutstyr, ULP-prosessorer alle er slått av. Bare RTC-minnet og RTC-periferiutstyr er slått på.
Under vekkesituasjonen må ESP32 varsles av en våkne kilde som vil vekke ESP32 fra dyp søvnmodus. Siden RTC-periferiutstyr er slått på, kan ESP32 imidlertid våknes gjennom RTC-aktiverte GPIO-er. Det er andre alternativer også. Det kan være å våkne gjennom en ekstern avbryterpinne eller ved å bruke en tidtaker for å vekke ESP32. I dette prosjektet bruker vi ext0 wakeup på pin 33.
Programmering ESP32 for dyp hvilemodus
Hele programmet finner du nederst på denne siden. Den er skrevet for Arduino IDE og kan derfor enkelt tilpasses dine behov. Forklaringen på koden er som følger.
I begynnelsen av koden, // Opprett en PushButton-variabel PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // definere Led Pin uint8_t led_pin = GPIO_NUM_4; // definere wake up pin uint8_t wakeUp_pin = GPIO_NUM_33;
Ovennevnte tre linjer definerer vekkerpinnen, LED-pinnen og hvilemoduspinnen.
ugyldig oppsett () { // legg oppsettkoden din her, for å kjøre en gang: // sett serieporten til 115200 Serial.begin (115200); forsinkelse (1000); // sett trykknappen som inngang med intern PullUp pinMode (pushBtn.pin, INPUT_PULLUP); // sett Interrupt-håndtereren med trykknappen i fallende modus attachInterrupt (pushBtn.pin, isr_handle, FALLING); // sett Led Pin som ouput pinMode (led_pin, OUTPUT); // opprette en oppgave som vil bli utført i blinkLed () -funksjonen, med prioritet 1 og utført på kjernen 0 xTaskCreate ( blinkLed, / * Oppgavefunksjon. * / "blinkLed", / * navn på oppgaven. * / 1024 * 2, / * Stabelstørrelse for oppgave * / NULL, / * parameter for oppgaven * / 5, / * prioritet for oppgaven * / & taskBlinkled); / * Oppgavehåndtak for å holde oversikt over opprettet oppgave * / forsinkelse (500); // Konfigurer Pin 33 som ext0 wake up source med LOW logic level esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0); }
I ovenstående er avbruddet satt til fallende modus av kodebiten
attachInterrupt (pushBtn.pin, isr_handle, FALLING);
Derfor, når bryteren trykkes, vil logikknivået endres fra logikk 1 (3,3V) til logikk 0 (0V). Spenningen til knappepinnen vil falle, og ESP32 vil identifisere at bryteren trykkes. Det er også laget en oppgave for å blinke LED-lampen.
xTaskCreate ( blinkLed, / * Oppgavefunksjon. * / "blinkLed", / * navn på oppgave. * / 1024 * 2, / * Stabelstørrelse på oppgave * / NULL, / * parameter for oppgaven * / 5, / * prioritet av oppgaven * / & taskBlinkled); / * Oppgavehåndtak for å holde oversikt over opprettet oppgave * / forsinkelse (500);
Pinnen 33 er også konfigurert ved hjelp av kodebiten nedenfor som en ekstern vekkerkilde identifisert som ext0.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
Neste, i løpet av tiden
void loop () { // legg hovedkoden din her for å kjøre gjentatte ganger: hvis (pushBtn.pressed) { Serial.printf ("PushButton (% d) Pressed \ n", pushBtn.pin); Serial.printf ("Suspend 'blinkLed' Task \ n"); // Suspender blinkLed Task vTaskSuspend (taskBlinkled); digitalWrite (led_pin, LOW); Serial.printf ("Sovner….. \ n", pushBtn.pin); pushBtn.pressed = false; // Gå i dvale nå 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 hjelp av eksternt signal ext0 for WakeUp From sleep"); gå i stykker; sak ESP_SLEEP_WAKEUP_EXT1: Serial.println ("ved hjelp av eksternt signal ext1 for WakeUp From sleep"); gå i stykker; sak ESP_SLEEP_WAKEUP_TIMER: Serial.println ("ved hjelp av Timer signal for WakeUp From sleep"); gå i stykker; sak ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("bruker TouchPad-signal for WakeUp From sleep"); gå i stykker; sak ESP_SLEEP_WAKEUP_ULP: Serial.println ("bruker ULP-signal for WakeUp From sleep"); gå i stykker; standard: pause; Serial.printf ("Gjenoppta 'blinkLed' oppgave \ n"); // start blinkLed Task vTaskResume (taskBlinkled) på nytt; } }
Mens loop løpende sjekker om søvnknappen trykkes eller ikke. Hvis du trykker på knappen, vil den stoppe eller avbryte LED-blinkoppgaven og kjøre esp deep sleep start-funksjonen-
esp_deep_sleep_start ();
I denne situasjonen, hvis den eksterne ekstern avbryteknappen trykkes, vil den umiddelbart våkne opp fra dyp søvnmodus og gjenoppta ledet blinkoppgave.
Til slutt kan LED-blinkfunksjonen sees i utdragene nedenfor, den vil blinke LED 1000 ms sekunder.
ugyldig blinkLed (ugyldig * param) { mens (1) { statisk uint32_t pin_val = 0; // bytt pin-verdien pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led -----------------% s \ n", pin_val? "On": "Off"); / * Bare bytt lysdioden hver 1000ms eller 1sec * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
Testing av ESP32 i dyp hvilemodus
Kretsen er konstruert i et brødbrett, og et Metravi XB-utgave multimeter brukes til å måle strømmen. Strømmen som trekkes av kretsen i aktiv modus er nesten 58 mA, men i dyp søvnmodus er strømmen nesten 4,10 mA. Bildet nedenfor viser strømforbruket til ESP32 aktiv modus -
I dyp søvnmodus registreres strømforbruket til rundt 3,95 mA, bildet nedenfor viser ESP32 dyp søvnmodus Strømforbruk-
I dyp søvnmodus er ESP32s nåværende forbruk imidlertid nesten 150 uA. Men det registrerte strømforbruket for dette ESP32 Devkit-kortet er nesten 4,10 mA. Dette skyldes CP2102 og den lineære regulatoren. Disse to er koblet til 5V kraftledningen. Det er også en strøm-LED tilkoblet i kraftledningen som bruker nesten 2 mA strøm.
Derfor kan det lett identifiseres at ESP32 bruker en veldig lav mengde energi i dyp søvnmodus, noe som er veldig nyttig for batteridrevne operasjoner. For mer informasjon om hvordan det fungerte, sjekk ut videoen som er lenket nedenfor. Hvis du har spørsmål, kan du legge dem i kommentarfeltet nedenfor eller bruke forumene våre for andre tekniske spørsmål.