Innehållsförteckning:

Spara batterilivslängd med djup sömn: 20 steg
Spara batterilivslängd med djup sömn: 20 steg

Video: Spara batterilivslängd med djup sömn: 20 steg

Video: Spara batterilivslängd med djup sömn: 20 steg
Video: För bättre sömn - Sov gott - Kroppsskanning - Guidad meditation 2024, November
Anonim
Image
Image
Sätt att väcka ESP32
Sätt att väcka ESP32

Är du intresserad av att använda ett batteri med din ESP32? I så fall kommer jag att diskutera idag viktig teknisk information om detta ämne. Vi vet att denna mikrokontroller spenderar mycket energi när den överför information. Den förbrukar nära 190 miljampar. I den här videon visar jag hur du sparar energi från ESP32 med den så kallade "DEEP SLEEP" -funktionen. Vi kommer att ställa in chippet för att gå in i det här läget, lära oss hur man går ur det här läget och skapa ett exempel som visar tre olika sätt att väcka ESP32.

Det är viktigt att komma ihåg att radion spenderar mycket energi, snarare än processorn. Energibesparing är mycket viktigt. Detta beror på att slutpunkter (kretsarna som skickar information) ofta är batteridrivna och bör vara upp till fem år. Det finns vissa tillverkare som lovar upp till tio år, och detta gäller för högkvalitativa batterier som inte använder slutpunkterna så mycket. I alla andra fall rekommenderar jag dig att använda Deep Sleep för att spara energi från din krets.

Steg 1: Introduktion

ESP32 har ett energisparläge som kallas "Deep Sleep". I det här läget är processorer, det mesta RAM -minnet och alla digitalt klockade kringutrustning avstängda. De enda delarna av chipet som fortfarande kan anslutas är RTC -styrenheten, RTC -kringutrustning (inklusive ULP -samprocessor) och RTC -minnen.

Vi har flera sätt att väcka ESP32 när du sover. Väckningskällor kan ställas in när som helst innan du går in i djupt viloläge.

Steg 2: Sätt att väcka ESP32

Det finns fem sätt att väcka ESP32:

• Timer

• Extern väckning (ext0)

• Extern väckning (ext1)

• ULP coprocessor väckning

• Pekplatta

Steg 3: Timer

RTC-styrenheten har en inbyggd timer som kan användas för att aktivera chipet efter en fördefinierad tid. Tiden anges med mikrosekundprecision.

esp_deep_sleep_enable_timer_wakeup (uint64_t time_in_us)

time_in_us> är tiden i mikrosekunder

Steg 4: Extern väckning (ext0)

RTC IO -modulen innehåller logik för att utlösa larmet när en av RTC GPIO: erna går in på en fördefinierad logiknivå. RTC IO är en del av kraftdomänen för RTC -kringutrustningen, så RTC -kringutrustningen kommer att hållas vid liv under djup sömn om denna aktiveringskälla begärs.

esp_deep_sleep_enable_ext0_wakeup (gpio_num_t gpio_num, int -nivå)

gpio_num> GPIO -nummer som används som aktiveringskälla. Endast RTC-funktionella GPIO: er kan användas: 0, 2, 4, 12-15, 25-27, 32-39.

nivå> ingångsnivå som utlöser larmet (0 = LÅG, 1 = HÖG)

Steg 5: Extern väckning (ext1)

RTC -styrenheten innehåller logik för att utlösa väckarklockan med flera RTC GPIO: er.

esp_deep_sleep_enable_ext1_wakeup (uint64_t mask, esp_ext1_wakeup_mode_t mode)

mask> bitmask av GPIO -nummer som kommer att orsaka aktivering. Endast RTC-aktiverade GPIO: er kan användas i denna bitmapp: 0, 2, 4, 12-15, 25-27, 32-39.

läge> välj den logiska funktion som används för att bestämma aktiveringsvillkoret:

• ESP_EXT1_WAKEUP_ALL_LOW: vaknar när alla valda GPIO: er är låga

• ESP_EXT1_WAKEUP_ANY_HIGH: vaknar när någon av de valda GPIO: erna är HIGH

Steg 6: ULP Coprocessor Wakeup

ULP -coprocessorn kan fungera medan chipet är i djup sömn och kan användas för att söka efter sensorer, övervaka ADC eller kapacitiva beröringssensorvärden och aktivera chipet när en specifik händelse detekteras.

ULP -samprocessorn är en del av effektdomänen för RTC -kringutrustningen och kör programmet som lagras i RTC med långsamt minne. Därför kommer RTC -kringutrustning och RTC -långsamt minne att aktiveras under djup sömn om detta aktiveringsläge begärs.

Steg 7: Pekplatta

RTC -styrenheten innehåller logik för att utlösa larmet med hjälp av kapacitiva beröringssensorer. Definitionen av beröringsstiftet är dock en annan. Vi måste använda touchavbrottet för var och en av de önskade stiften.

Efter att ha ställt in avbrotten aktiverade vi väckningsläget för att använda sensorerna.

// Konfigurera pekplattan som väckarkälla esp_sleep_enable_touchpad_wakeup ();

Steg 8: Öppna djupt viloläge

Efter att ha ställt in ett väckningsläge räcker det med ett enda kommando för att sätta ESP32 i djupt viloläge (spenderar 2,5 μA eller mindre). Jag betonar här att denna kostnad kommer från ESP -chipet och inte plattan, eftersom den senare spenderar mer.

esp_deep_sleep_start ();

Från detta kommando somnar ESP32 och exekverar till exempel inte nästa kodrad.

Viktigt: Alla väckningsinställningar måste göras innan ovanstående kommando utförs.

Steg 9: Här är mer viktig information

Här är mer viktig information
Här är mer viktig information

Samtalet nedan returnerar orsaken till ESP32 -väckning.

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

esp_sleep_get_wakeup_cause ();

Om vi ställer in väckningen med pekplattan kan vi återställa vilken GPIO som beröringen inträffade genom kommandot

esp_sleep_get_touchpad_wakeup_status ();

Varje gång ESP32 vaknar kommer det att gå igenom installationen igen. Således kommer alla variabler som inte är definierade i RTC -minnet att återgå till sitt hemtillstånd.

För att behålla variablerna i minnet även efter att ha somnat, använd variabeldeklarationen i exemplet nedan:

// RTC_DATA_ATTR aloca a variável na memoria RTCRTC_DATA_ATTR int bootCount = 0;

Steg 10: Demonstration

Demonstration
Demonstration

Videon visar hur programmet fungerar i enlighet med bilden.

Steg 11: WiFi-nodMCU-32S ESP-WROOM-32

WiFi-nodMCU-32S ESP-WROOM-32
WiFi-nodMCU-32S ESP-WROOM-32

Steg 12: Montering

hopsättning
hopsättning

Steg 13: Program

Vi kommer nu att göra ett program där vi konfigurerar ESP32 för att gå in i djupt viloläge. Detta kommer att väckas på tre olika sätt: ett för extern väckning (ext0), ett för timer och ett för pekplatta. De kan inte fungera tillsammans, så vi använder en variabel som kommer att vara en räknare för hur många gånger ESP32 gav Boot för att konfigurera sättet att vakna.

Steg 14: Bibliotek krävs

Bibliotek krävs
Bibliotek krävs

För att styra OLED -displayen behöver vi ett externt bibliotek. För detta kommer vi att ladda ner U8g2 -biblioteket.

I Arduino IDE, gå till skissmenyn >> Inkludera bibliotek >> Hantera bibliotek….

Steg 15: Bibliotek och variabler

Vi har inkluderat biblioteket för att styra OLED -skärmen, liksom en konstruktör av displaykontrollinstansen. Vi tilldelar också variabeln i RTC -minnet. Vi ställer in känsligheten för beröringsacceptans, mikrosekundomvandlingsfaktorn i sekunder och tiden ESP32 går till viloläge (i sekunder).

#include // biblioteca para control do display oled

// konstruktör för instans för visning // SDA = 21 e SCL = 22 U8X8_SSD1306_128X64_NONAME_SW_I2C display (SCL, SDA, U8X8_PIN_NONE); // RTC_DATA_ATTR aloca a variável na memoria RTC RTC_DATA_ATTR int bootCount = 0; // sensibilidade para aceitação do toque #define Threshold 40 // fator de conversã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

Steg 16: Inställning

I installationen ökar vi antalet gånger Boot startade. Vi kallar funktionen för att skriva ut Boot -motivet. Om Boot -numret är PAR ställer vi in ESP32 för att vakna via (EXT0) -knappen. Om det är en multipel av 3 ställer vi in ESP32 för att vakna efter en viss tid. Annars sätter vi upp de kapacitiva pekpinnarna för att väcka ESP32. Slutligen ställer vi in styrplattan som väckarkälla och tvingar ESP32 att gå in i viloläge.

void setup () {Serial.begin (115200); fördröjning (1000); // incrementa o numero de vezes que o BOOT ocorreu ++ bootCount; configureDisplay (); // chama a função para imprimir o motivo do BOOT print_wakeup_reason (); // se o numero de boot for PAR configuramos o ESP32 para despertar através do botão (EXT0) if (bootCount % 2 == 0) {esp_sleep_enable_ext0_wakeup (GPIO_NUM_39, 1); // 1 = Hög, 0 = Låg} // se för multiplo de 3 konfiguramos o ESP32 para 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 capacitivo para despertar o ESP32 else {// Setup interrupt on Touch Pad 5 (GPIO12) touchAttachInterrupt (T5, callback, Threshold); // Konfigurera pekplattan som väckarkälla esp_sleep_enable_touchpad_wakeup (); } Serial.println (“entrando em modo sleep”); esp_deep_sleep_start (); // força o ESP32 entrar em modo SLEEP}

Steg 17: Loop, Callback & ConfigureDisplay

I Loop har vi ingenting att göra. Vi fortsätter sedan att avbryta återuppringning om vi har något att göra när avbrottet inträffar. När det gäller configureDisplay initierar vi displayen och konfigurerar några parametrar. Vi skriver ut på skärmen hur många gånger Boot startade.

// nada a se fazer no loopvoid loop () {} // callback das interrupções void callback () {// caso queira fazer algo ao ocorrer a interrupção} void configureDisplay () {// inicializa o display e configura alguns parametros display. Börja(); 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:"); }

Steg 18: Print_wakeup_reason (att veta orsaken till uppvaknandet)

Här har vi funktionen att skriva ut orsaken till ESP32 -väckningen. Kontrollera stiftet och skriv ut på displayen.

// 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) {case 1: reason = "EXT0 RTC_IO BTN"; ha sönder; fall 2: orsak = "EXT1 RTC_CNTL"; ha sönder; fall 3: orsak = "TIMER"; ha sönder; fall 4: orsak = "TOUCHPAD"; ha sönder; fall 5: orsak = "ULP -PROGRAM"; ha sönder; default: reason = "NO DS ORSAK"; ha sönder; } Serial.println (anledning); 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 no display}}

Steg 19: Print_wakeup_touchpad (känner till GPIO Touch)

Nu, i det här steget, har vi funktionen att skriva ut stiftet som rördes. Vi återhämtade GPIO som väckte ESP32 och skrev ut den på displayen.

// 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"; ha sönder; fall 1: GPIO = "0"; ha sönder; fall 2: GPIO = "2"; ha sönder; fall 3: GPIO = "15"; ha sönder; fall 4: GPIO = "13"; ha sönder; fall 5: GPIO = "12"; ha sönder; fall 6: GPIO = "14"; ha sönder; fall 7: GPIO = "27"; ha sönder; fall 8: GPIO = "33"; ha sönder; fall 9: GPIO = "32"; ha sönder; standard: Serial.println ("Wakeup not by touchpad"); ha sönder; } Serial.println ("GPIO:"+GPIO); display.clearLine (7); // apaga a linha 7 visar display.drawString (0, 7, "GPIO:"); display.drawString (6, 7, GPIO.c_str ()); // imprime o GPIO}

Steg 20: Ladda ner filerna

PDF

INO

Rekommenderad: