Spisu treści:

Oszczędzanie baterii przy głębokim śnie: 20 kroków
Oszczędzanie baterii przy głębokim śnie: 20 kroków

Wideo: Oszczędzanie baterii przy głębokim śnie: 20 kroków

Wideo: Oszczędzanie baterii przy głębokim śnie: 20 kroków
Wideo: Jak oszczędzać baterię w telefonie? Poradnik krok po kroku dla każdego 2024, Lipiec
Anonim
Image
Image
Sposoby budzenia ESP32
Sposoby budzenia ESP32

Czy jesteś zainteresowany użyciem baterii z ESP32? Jeśli tak, omówię dzisiaj kilka ważnych informacji technicznych na ten temat. Wiemy, że ten mikrokontroler zużywa dużo energii podczas przesyłania informacji. Zużywa blisko 190 miliamperów. W tym filmie pokażę jak oszczędzać energię z ESP32 dzięki funkcji tzw. „DEEP SLEEP”. Ustawimy chip, aby wejść w ten tryb, nauczymy się, jak wyjść z tego trybu i stworzymy przykład pokazujący trzy różne sposoby wybudzenia ESP32.

Należy pamiętać, że radio zużywa dużo energii, a nie procesor. Oszczędność energii jest bardzo ważna. Dzieje się tak, ponieważ punkty końcowe (obwody, które wysyłają informacje) są często zasilane bateryjnie i powinny działać do pięciu lat. Niektórzy producenci obiecują czas działania do dziesięciu lat i dotyczy to wysokiej jakości baterii, które nie używają tak często punktów końcowych. We wszystkich innych przypadkach radzę używać Deep Sleep, aby oszczędzać energię z obwodu.

Krok 1: Wprowadzenie

ESP32 ma tryb oszczędzania energii, zwany „Głębokim uśpienia”. W tym trybie procesory, większość pamięci RAM i wszystkie taktowane cyfrowo urządzenia peryferyjne są wyłączone. Jedyne części układu, które można jeszcze podłączyć, to sterownik RTC, urządzenia peryferyjne RTC (w tym koprocesor ULP) i pamięci RTC.

Mamy kilka sposobów na wybudzenie ESP32 podczas snu. Źródła budzenia można skonfigurować w dowolnym momencie przed przejściem w tryb głębokiego uśpienia.

Krok 2: Sposoby wybudzenia ESP32

Istnieje pięć sposobów na wybudzenie ESP32:

• Zegar

• budzenie zewnętrzne (ext0)

• budzenie zewnętrzne (ext1)

• budzenie koprocesora ULP

• Panel dotykowy

Krok 3: Zegar

Sterownik RTC ma wbudowany zegar, który może być użyty do aktywacji chipa po określonym czasie. Czas jest określony z dokładnością do mikrosekund.

esp_deep_sleep_enable_timer_wakeup(uint64_t time_in_us)

time_in_us> to czas w mikrosekundach

Krok 4: Wybudzenie zewnętrzne (ext0)

Moduł RTC IO zawiera logikę wyzwalającą alarm, gdy jeden z GPIO RTC wejdzie na wstępnie zdefiniowany poziom logiczny. RTC IO jest częścią domeny zasilania urządzeń peryferyjnych RTC, więc urządzenia peryferyjne RTC będą utrzymywane przy życiu podczas głębokiego uśpienia, jeśli wymagane jest to źródło aktywacji.

esp_deep_sleep_enable_ext0_wakeup(gpio_num_t gpio_num, poziom wewnętrzny)

gpio_num> numer GPIO używany jako źródło aktywacji. Można używać tylko GPIO z funkcją RTC: 0, 2, 4, 12-15, 25-27, 32-39.

poziom> poziom wejściowy, który wywoła alarm (0 = NISKI, 1 = WYSOKI)

Krok 5: Wybudzenie zewnętrzne (ext1)

Sterownik RTC zawiera logikę do wyzwalania budzika za pomocą wielu GPIO RTC.

esp_deep_sleep_enable_ext1_wakeup (maska uint64_t, tryb esp_ext1_wakeup_mode_t)

mask> maska bitowa numerów GPIO, które spowodują aktywację. W tej bitmapie można używać tylko GPIO z obsługą RTC: 0, 2, 4, 12-15, 25-27, 32-39.

mode> wybierz funkcję logiczną służącą do określenia warunku aktywacji:

• ESP_EXT1_WAKEUP_ALL_LOW: budzi się, gdy wszystkie wybrane GPIO są w stanie LOW

• ESP_EXT1_WAKEUP_ANY_HIGH: budzi się, gdy którykolwiek z wybranych GPIO jest WYSOKI

Krok 6: Wybudzenie koprocesora ULP

Koprocesor ULP może działać, gdy chip jest w stanie głębokiego uśpienia i może być używany do wyszukiwania czujników, monitorowania wartości ADC lub pojemnościowych czujników dotykowych oraz aktywowania chipa po wykryciu określonego zdarzenia.

Koprocesor ULP jest częścią domeny mocy urządzeń peryferyjnych RTC i uruchamia program przechowywany w wolnej pamięci RTC. Dlatego urządzenia peryferyjne RTC i wolna pamięć RTC zostaną aktywowane podczas głębokiego uśpienia, jeśli ten tryb aktywacji jest wymagany.

Krok 7: Touchpad

Sterownik RTC zawiera logikę wyzwalającą alarm za pomocą pojemnościowych czujników dotykowych. Definicja pinu dotykowego jest jednak inna. Musimy użyć przerwania dotykowego dla każdego z pożądanych pinów.

Po ustawieniu przerwań włączyliśmy tryb wybudzania, aby korzystać z czujników.

//Skonfiguruj Touchpad jako źródło budzenia esp_sleep_enable_touchpad_wakeup();

Krok 8: Wejście w tryb głębokiego uśpienia

Po ustawieniu trybu wybudzania wystarczy jedno polecenie, aby wprowadzić ESP32 w tryb Deep Sleep (wydając 2,5 μA lub mniej). Podkreślam tutaj, że ten wydatek pochodzi z układu ESP, a nie z płytki, bo ta wydaje więcej.

esp_deep_sleep_start();

Z tego polecenia ESP32 zasypia i nie wykonuje na przykład kolejnych linii kodu.

Ważne: Wszystkie ustawienia wybudzania należy wprowadzić przed wykonaniem powyższego polecenia.

Krok 9: Oto kilka ważnych informacji

Oto kilka ważnych informacji
Oto kilka ważnych informacji

Poniższe wywołanie zwraca przyczynę wybudzenia ESP32.

1: EXT0 2: EXT1 3: TIMER 4: PANEL DOTYKOWY 5: ULP

esp_sleep_get_wakeup_cause();

Jeśli ustawimy wybudzanie za pomocą touchpada, możemy odzyskać, które GPIO nastąpiło za pomocą polecenia

esp_sleep_get_touchpad_wakeup_status();

Za każdym razem, gdy ESP32 się obudzi, ponownie przejdzie przez konfigurację. W ten sposób wszystkie zmienne, które nie są zdefiniowane w pamięci zegara czasu rzeczywistego powrócą do stanu wyjściowego.

Aby zachować zmienne w pamięci nawet po zaśnięciu, użyj deklaracji zmiennej w poniższym przykładzie:

//RTC_DATA_ATTR w zmiennej pamięci RTCRTC_DATA_ATTR int bootCount = 0;

Krok 10: Demonstracja

Demonstracja
Demonstracja

Film pokazuje działanie programu, zgodnie z obrazem.

Krok 11: Wi-Fi NodeMCU-32S ESP-WROOM-32

Węzeł WiFiMCU-32S ESP-WROOM-32
Węzeł WiFiMCU-32S ESP-WROOM-32

Krok 12: Montaż

montaż
montaż

Krok 13: Program

Stworzymy teraz program, w którym skonfigurujemy ESP32, aby wejść w tryb głębokiego uśpienia. Zostanie to wybudzone na trzy różne sposoby: jeden dla zewnętrznego budzenia (ext0), jeden dla timera i jeden dla touchpada. Nie mogą ze sobą współpracować, więc użyjemy zmiennej, która będzie licznikiem, ile razy ESP32 dał Bootowi, aby skonfigurować sposób budzenia.

Krok 14: Wymagana biblioteka

Wymagana biblioteka
Wymagana biblioteka

Do sterowania wyświetlaczem OLED potrzebujemy zewnętrznej biblioteki. W tym celu pobierzemy bibliotekę U8g2.

W Arduino IDE przejdź do menu Szkic >> Dołącz bibliotekę >> Zarządzaj bibliotekami….

Krok 15: Biblioteki i zmienne

Dodaliśmy bibliotekę do sterowania wyświetlaczem OLED, a także konstruktor instancji kontrolera wyświetlacza. Również alokujemy zmienną w pamięci RTC. Ustawiamy czułość na akceptację dotyku, przelicznik mikrosekund na sekundy oraz czas przejścia ESP32 w tryb uśpienia (w sekundach).

#include //biblioteca para controle do display oled

//construtor da instancia do controlador do display //SDA = 21 e SCL = 22 U8X8_SSD1306_128X64_NONAME_SW_I2C display(SCL, SDA, U8X8_PIN_NONE); //RTC_DATA_ATTR w pamięci zmiennej 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 mode sleep (em segundos) #define TIME_TO_SLEEP 3

Krok 16: Konfiguracja

W Instalatorze zwiększamy liczbę wystąpień rozruchu. Wywołujemy funkcję, aby wydrukować motyw Boot. Jeśli numerem rozruchu jest PAR, ustawiamy ESP32, aby wybudzał się za pomocą przycisku (EXT0). Jeśli jest to wielokrotność 3, ustawiamy ESP32, aby wybudzał się po określonym czasie. W przeciwnym razie ustawiamy pojemnościowe piny dotykowe, aby obudzić ESP32. Na koniec ustawiamy Touchpad jako źródło wybudzenia i zmuszamy ESP32 do przejścia w tryb uśpienia.

void setup() { Serial.begin(115200); opóźnienie (1000); //zwiększenie o numero de vezes que o BOOT ocorreu ++bootCount; configureDisplay(); //chama a função para imprimir o motivo zrobić BOOT print_wakeup_reason(); //se o numer startowy dla konfiguracji PAR lub ESP32 dla despertar através do botão (EXT0) if(bootCount % 2 == 0) { esp_sleep_enable_ext0_wakeup(GPIO_NUM_39, 1); //1 = High, 0 = Low } //se dla wielu konfiguracji 3 lub ESP32 dla określonego tempa w innym przypadku if(bootCount % 3 == 0) { esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); } //Konfiguracja w kontraście do obsługi funkcji dotykowych dla ESP32 else { //Konfiguracja przerwania na touchpadzie 5 (GPIO12) touchAttachInterrupt(T5, callback, Threshold); //Skonfiguruj Touchpad jako źródło budzenia esp_sleep_enable_touchpad_wakeup(); } Serial.println(„entrando em modo sleep ); esp_deep_sleep_start(); //dla ESP32 entrar em modo SLEEP }

Krok 17: Pętla, oddzwanianie i konfiguracja wyświetlacza

W Pętli nie mamy nic do roboty. Następnie przechodzimy do przerwania wywołania zwrotnego, jeśli mamy coś do zrobienia, gdy nastąpi przerwanie. W przypadku configureDisplay inicjujemy wyświetlacz i konfigurujemy niektóre parametry. Drukujemy na ekranie, ile razy doszło do rozruchu.

//nada se fazer no loopvoid loop() { } //callback das interrupções void callback(){ //caso queira fazer algo ao ocorrer a interrupção } void configureDisplay() { //inicjalizacji wyświetlania i konfigurowania parametrów wyświetlania parametrów. rozpocząć(); display.setPowerSave(0); //modo powerSave (0-Off ? 1-On) display.setFont(u8x8_font_torussansbold8_u); //fonte utilizada //imprime no display o 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:"); }

Krok 18: Print_wakeup_reason (znając przyczynę przebudzenia)

Tutaj mamy funkcję drukowania przyczyny budzenia ESP32. Sprawdź pinezkę i wydrukuj na wyświetlaczu.

//função dla zapisania przyczyny ESP32 despertarvoid print_wakeup_reason(){ esp_sleep_wakeup_cause_t wakeup_reason; Powód ciągu = ""; wakeup_reason = esp_sleep_get_wakeup_cause(); //recupera a causa do despertar switch(wakeup_reason) { case 1:reason = "EXT0 RTC_IO BTN"; przerwa; przypadek 2: powód = "EXT1 RTC_CNTL"; przerwa; przypadek 3: powód = "TIMER"; przerwa; przypadek 4:przyczyna = "PADEK DOTYKOWY"; przerwa; przypadek 5:przyczyna = "PROGRAM ULP"; przerwa; default:reason = "BRAK PRZYCZYNY DS"; przerwa; } Serial.println(powód); display.clearLine(6); //apaga a linha 6 wyświetla display.drawString(0, 6, Reason.c_str()); //włącz przyczynę do despertar no display //se despertou by TOUCHPAD, então vamos verificar em qual dos pinos ocorreu if(wakeup_reason == 4) { print_wakeup_touchpad(); //weryfikacja o pino i imprime bez wyświetlania } }

Krok 19: Print_wakeup_touchpad (znaj GPIO Touch)

Teraz w tym kroku mamy funkcję drukowania pinu, który został dotknięty. Odzyskaliśmy GPIO, które obudziło ESP32 i wydrukowaliśmy je na wyświetlaczu.

//função do zapisania lub pino que tocadovoid print_wakeup_touchpad() { touch_pad_t touchPin; touchPin = esp_sleep_get_touchpad_wakeup_status(); //odzyskiwanie GPIO que despertou o ESP32 String GPIO = ""; switch(touchPin) { przypadek 0: GPIO = "4"; przerwa; przypadek 1: GPIO = "0"; przerwa; przypadek 2: GPIO = "2"; przerwa; przypadek 3: GPIO = "15"; przerwa; przypadek 4: GPIO = "13"; przerwa; przypadek 5: GPIO = "12"; przerwa; przypadek 6: GPIO = "14"; przerwa; przypadek 7: GPIO = "27"; przerwa; przypadek 8: GPIO = "33"; przerwa; przypadek 9: GPIO = "32"; przerwa; default: Serial.println("Wybudzanie nie przez touchpad"); przerwa; } Serial.println("GPIO: "+GPIO); display.clearLine(7);//apaga a linha 7 do wyświetlania display.drawString(0, 7, "GPIO: "); display.drawString(6, 7, GPIO.c_str()); //imprime o GPIO }

Krok 20: Pobierz pliki

PDF

JA NIE

Zalecana: