Съдържание:

Спестяване на живота на батерията с дълбок сън: 20 стъпки
Спестяване на живота на батерията с дълбок сън: 20 стъпки

Видео: Спестяване на живота на батерията с дълбок сън: 20 стъпки

Видео: Спестяване на живота на батерията с дълбок сън: 20 стъпки
Видео: Как устроена IT-столица мира / Russian Silicon Valley (English subs) 2024, Юли
Anonim
Image
Image
Начини за събуждане на ESP32
Начини за събуждане на ESP32

Интересувате ли се от използването на батерия с вашия ESP32? Ако е така, днес ще обсъдя важна техническа информация по този въпрос. Знаем, че този микроконтролер изразходва много енергия, когато предава информация. Консумира близо 190 милиампера. В този видеоклип ще покажа как да се пести енергия от ESP32 с така наречената функция „DEEP SLEEP“. Ще настроим чипа да влиза в този режим, ще научим начините за излизане от този режим и ще създадем пример, показващ три различни начина за събуждане на ESP32.

Важно е да запомните, че радиото харчи много енергия, а не процесора. Спестяването на енергия е много важно. Това е така, защото крайните точки (веригите, които изпращат информация) често се захранват от батерии и трябва да издържат до пет години. Има някои производители, които обещават продължителност до десет години и това важи за висококачествени батерии, които не използват толкова крайните точки. Във всички останали случаи ви съветвам да използвате Deep Sleep, за да пестите енергия от веригата си.

Стъпка 1: Въведение

ESP32 има енергоспестяващ режим, наречен „Deep Sleep“. В този режим процесорите, повечето RAM и всички периферни устройства с тактова честота са изключени. Единствените части на чипа, които все още могат да бъдат свързани, са RTC контролерът, RTC периферните устройства (включително ULP копроцесор) и RTC паметта.

Имаме няколко начина да събудим ESP32, когато спим. Източниците на събуждане могат да бъдат настроени по всяко време, преди да влезете в режим на дълбок сън.

Стъпка 2: Начини за събуждане на ESP32

Има пет начина да събудите ESP32:

• Таймер

• Външно събуждане (ext0)

• Външно събуждане (ext1)

• Събуждане на ULP копроцесор

• Тъчпад

Стъпка 3: Таймер

RTC контролерът има вграден таймер, който може да се използва за активиране на чипа след предварително определен период от време. Времето е определено с микросекундна точност.

esp_deep_sleep_enable_timer_wakeup (uint64_t time_in_us)

time_in_us> е времето в микросекунди

Стъпка 4: Външно събуждане (ext0)

Модулът RTC IO съдържа логика за задействане на алармата, когато един от RTC GPIO влиза в предварително дефинирано логическо ниво. RTC IO е част от домейна на захранване на периферните устройства RTC, така че периферните устройства на RTC ще се поддържат живи по време на Deep Sleep, ако се поиска този източник на активиране.

esp_deep_sleep_enable_ext0_wakeup (gpio_num_t gpio_num, ниво int)

gpio_num> GPIO номер, използван като източник за активиране. Могат да се използват само RTC-функционални GPIO: 0, 2, 4, 12-15, 25-27, 32-39.

ниво> входно ниво, което ще задейства алармата (0 = НИСКО, 1 = ВИСОКО)

Стъпка 5: Външно събуждане (ext1)

RTC контролерът съдържа логика за задействане на будилника, използвайки множество RTC GPIO.

esp_deep_sleep_enable_ext1_wakeup (uint64_t маска, esp_ext1_wakeup_mode_t режим)

маска> битова маска на GPIO номера, която ще предизвика активиране. В тази растерна карта могат да се използват само RTC-активирани GPIO: 0, 2, 4, 12-15, 25-27, 32-39.

режим> изберете логическата функция, използвана за определяне на условията за активиране:

• ESP_EXT1_WAKEUP_ALL_LOW: събужда се, когато всички избрани GPIO са в НИСКО

• ESP_EXT1_WAKEUP_ANY_HIGH: събужда се, когато някой от избраните GPIOs е ВИСОК

Стъпка 6: Събуждане на ULP копроцесор

Съпроцесорът ULP може да работи, докато чипът е в режим на дълбоко заспиване и може да се използва за търсене на сензори, наблюдение на стойностите на ADC или капацитивен сензор за докосване и активиране на чипа, когато се открие конкретно събитие.

Съпроцесорът ULP е част от домейна на захранване на периферните устройства RTC и изпълнява програмата, съхранявана в RTC с бавна памет. Следователно, RTC периферните устройства и RTC бавната памет ще бъдат активирани по време на Deep Sleep, ако се поиска този режим на активиране.

Стъпка 7: Тъчпад

RTC контролерът съдържа логика за задействане на алармата с помощта на капацитивните сензори за докосване. Определението на сензорния щифт обаче е различно. Трябва да използваме прекъсване с докосване за всеки от желаните щифтове.

След като зададохме прекъсванията, активирахме режима на събуждане, за да използваме сензорите.

// Конфигуриране на тъчпада като източник за събуждане esp_sleep_enable_touchpad_wakeup ();

Стъпка 8: Влизане в режим на дълбок сън

След като настроите режим на събуждане, е достатъчна една команда за поставяне на ESP32 в режим на дълбоко заспиване (изразходване 2,5 μA или по-малко). Тук подчертавам, че този разход е от чипа на ESP, а не от плочата, тъй като последната харчи повече.

esp_deep_sleep_start ();

От тази команда ESP32 заспива и не изпълнява например следващите редове код.

Важно: Всички настройки за събуждане трябва да бъдат направени преди изпълнението на горната команда.

Стъпка 9: Ето още по -важна информация

Ето още малко важна информация
Ето още малко важна информация

Повикването по -долу връща причината за събуждане на ESP32.

1: EXT0 2: EXT1 3: ТАЙМЕР 4: TOUCHPAD 5: ULP

esp_sleep_get_wakeup_cause ();

Ако настроим събуждането от тъчпада, можем да възстановим кой GPIO, докосването е станало чрез командата

esp_sleep_get_touchpad_wakeup_status ();

Всеки път, когато ESP32 се събуди, той ще премине през настройката отново. По този начин всички променливи, които не са дефинирани в RTC паметта, ще се върнат в началното си състояние.

За да запазите променливите в паметта дори след заспиване, използвайте декларацията на променливата в примера по -долу:

// RTC_DATA_ATTR за различно ниво на памет RTCRTC_DATA_ATTR int bootCount = 0;

Стъпка 10: Демонстрация

Демонстрация
Демонстрация

Видеото показва работата на програмата, в съответствие с изображението.

Стъпка 11: WiFi NodeMCU-32S ESP-WROOM-32

WiFi NodeMCU-32S ESP-WROOM-32
WiFi NodeMCU-32S ESP-WROOM-32

Стъпка 12: Монтаж

Монтаж
Монтаж

Стъпка 13: Програма

Сега ще направим програма, в която ще конфигурираме ESP32 за влизане в режим на дълбоко заспиване. Това ще се събуди по три различни начина: един за външно събуждане (ext0), един за таймер и един за тъчпад. Те не могат да работят заедно, така че ще използваме променлива, която ще бъде брояч за броя пъти, които ESP32 е дал Boot, за да конфигурира начина за събуждане.

Стъпка 14: Изисква се библиотека

Задължителна библиотека
Задължителна библиотека

За да контролираме OLED дисплея, се нуждаем от външна библиотека. За целта ще изтеглим библиотеката U8g2.

В IDE на Arduino отидете в менюто Sketch >> Include Library >> Manage Libraries ….

Стъпка 15: Библиотеки и променливи

Включихме библиотеката за управление на OLED дисплея, както и конструктор на екземпляра на контролера на дисплея. Също така, ние разпределяме променливата в RTC паметта. Задаваме чувствителността за приемане на докосване, коефициента на преобразуване в микросекунда за секунди и времето, когато ESP32 преминава в режим на заспиване (в секунди).

#include // biblioteca para controle do display oled

// конструктор за инсталиране на контролер или дисплей // SDA = 21 e SCL = 22 U8X8_SSD1306_128X64_NONAME_SW_I2C дисплей (SCL, SDA, U8X8_PIN_NONE); // RTC_DATA_ATTR за различна памет на RTC RTC_DATA_ATTR int bootCount = 0; // sensibilidade para aceitação do toque #define Threshold 40 // fator de razgovaã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

Стъпка 16: Настройка

В настройката увеличаваме броя на случаите на зареждане. Извикваме функцията за отпечатване на мотива Boot. Ако номерът за зареждане е PAR, ние настройваме ESP32 да се събужда чрез бутона (EXT0). Ако е кратно на 3, ние настройваме ESP32 да се събуди след определено време. В противен случай ние настройваме капацитивните сензорни щифтове, за да събудим ESP32. И накрая, ние зададохме тъчпада като източник за събуждане и принудихме ESP32 да влезе в режим на заспиване.

void setup () {Serial.begin (115200); забавяне (1000); // прибавяне на числови детайли за BOOT ocorreu ++ bootCount; configureDisplay (); // chama a função para imprimir o motivo do BOOT print_wakeup_reason (); // се показва числото за зареждане за PAR конфигурации или ESP32, за да се отървем от изискванията (EXT0), ако (bootCount % 2 == 0) {esp_sleep_enable_ext0_wakeup (GPIO_NUM_39, 1); // 1 = Високо, 0 = Ниско} // се използва за многоплощни 3 конфигурации o ESP32 за деспертиране на депо за ум темпо определение иначе ако (bootCount % 3 == 0) {esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); } // caso contrario configuramos os pinos de touch kapacitivo para despertar o ESP32 else {// Настройка прекъсване на Touch Pad 5 (GPIO12) touchAttachInterrupt (T5, обратно повикване, праг); // Конфигуриране на тъчпада като източник за събуждане esp_sleep_enable_touchpad_wakeup (); } Serial.println (“entrando em modo sleep”); esp_deep_sleep_start (); // força o ESP32 entrar em modo SLEEP}

Стъпка 17: Цикъл, обратно повикване и конфигуриране на дисплея

В цикъла нямаме какво да правим. След това пристъпваме към прекъсване на обратното повикване, ако имаме какво да правим, когато настъпи прекъсването. Що се отнася до configureDisplay, ние инициализираме дисплея и конфигурираме някои параметри. Отпечатваме на екрана колко пъти се е случило зареждането.

// няма a fazer без 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. begin (); display.setPowerSave (0); // modo powerSave (0-Off? 1-On) display.setFont (u8x8_font_torussansbold8_u); // използване на фонда // imprime без дисплей 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:"); }

Стъпка 18: Print_wakeup_reason (знаейки причината за пробуждането)

Тук имаме функцията да отпечатаме причината за събуждането на ESP32. Проверете щифта и отпечатайте на дисплея.

// função para imprimir a causa do ESP32 despertarvoid print_wakeup_reason () {esp_sleep_wakeup_cause_t wakeup_reason; Низкова причина = ""; wakeup_reason = esp_sleep_get_wakeup_cause (); // възстановяване на превключвател за причиняване на деспертар (wakeup_reason) {случай 1: reason = "EXT0 RTC_IO BTN"; прекъсване; случай 2: reason = "EXT1 RTC_CNTL"; прекъсване; случай 3: reason = "TIMER"; прекъсване; случай 4: reason = "TOUCHPAD"; прекъсване; случай 5: reason = "ULP PROGRAM"; прекъсване; по подразбиране: reason = "NO DS CAUSE"; прекъсване; } Serial.println (причина); 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 без дисплей}}

Стъпка 19: Print_wakeup_touchpad (познайте GPIO Touch)

Сега, в тази стъпка, имаме функцията да отпечатаме пина, който е докоснат. Ние възстановихме GPIO, който събуди ESP32 и го отпечата на дисплея.

// função para imprimir o pino que foi tocadovoid print_wakeup_touchpad () {touch_pad_t touchPin; touchPin = esp_sleep_get_touchpad_wakeup_status (); // възстановяване на GPIO que despertou o ESP32 String GPIO = ""; ключ (touchPin) {случай 0: GPIO = "4"; прекъсване; случай 1: GPIO = "0"; прекъсване; случай 2: GPIO = "2"; прекъсване; случай 3: GPIO = "15"; прекъсване; случай 4: GPIO = "13"; прекъсване; случай 5: GPIO = "12"; прекъсване; случай 6: GPIO = "14"; прекъсване; случай 7: GPIO = "27"; прекъсване; случай 8: GPIO = "33"; прекъсване; случай 9: GPIO = "32"; прекъсване; по подразбиране: Serial.println ("Събуждане не чрез тъчпад"); прекъсване; } Serial.println ("GPIO:"+GPIO); display.clearLine (7); // apaga a linha 7 do display display.drawString (0, 7, "GPIO:"); display.drawString (6, 7, GPIO.c_str ()); // imprime o GPIO}

Стъпка 20: Изтеглете файловете

PDF

АЗ НЕ

Препоръчано: