Оглавление:

Экономия заряда батареи с помощью глубокого сна: 20 шагов
Экономия заряда батареи с помощью глубокого сна: 20 шагов

Видео: Экономия заряда батареи с помощью глубокого сна: 20 шагов

Видео: Экономия заряда батареи с помощью глубокого сна: 20 шагов
Видео: Как отправить приложение в режим сна. Простые способы экономии заряда на Android устройстве 2024, Ноябрь
Anonim
Image
Image
Способы разбудить ESP32
Способы разбудить ESP32

Вы заинтересованы в использовании аккумулятора с вашим ESP32? Если да, то сегодня я буду обсуждать важную техническую информацию по этой теме. Мы знаем, что этот микроконтроллер тратит много энергии при передаче информации. Он потребляет около 190 миллиампер. В этом видео я покажу, как экономить энергию от ESP32 с помощью так называемой функции «DEEP SLEEP». Мы настроим микросхему на вход в этот режим, изучим способы выхода из этого режима и создадим пример, показывающий три различных способа разбудить ESP32.

Важно помнить, что радио тратит много энергии, а не процессор. Экономия энергии очень важна. Это связано с тем, что конечные точки (цепи, передающие информацию) часто питаются от батарей и должны прослужить до пяти лет. Некоторые производители обещают срок до десяти лет, и это действительно для высококачественных батарей, которые не так часто используют конечные точки. Во всех остальных случаях я советую вам использовать Deep Sleep для экономии энергии вашей схемы.

Шаг 1. Введение

ESP32 имеет режим энергосбережения, называемый «Deep Sleep». В этом режиме процессоры, большая часть оперативной памяти и все периферийные устройства с цифровой синхронизацией отключены. Единственные части микросхемы, которые все еще могут быть подключены, - это контроллер 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 содержит логику для срабатывания сигнализации, когда один из GPIO RTC переходит на заранее определенный логический уровень. RTC IO является частью области питания периферийных устройств RTC, поэтому периферийные устройства RTC будут оставаться в рабочем состоянии во время глубокого сна, если этот источник активации будет запрошен.

esp_deep_sleep_enable_ext0_wakeup (gpio_num_t gpio_num, уровень int)

gpio_num> Номер GPIO, используемый в качестве источника активации. Могут использоваться только GPIO с функцией RTC: 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, которые вызовут активацию. В этом растровом изображении можно использовать только GPIO с поддержкой RTC: 0, 2, 4, 12-15, 25-27, 32-39.

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

• ESP_EXT1_WAKEUP_ALL_LOW: пробуждается, когда все выбранные GPIO находятся в LOW

• ESP_EXT1_WAKEUP_ANY_HIGH: пробуждается, когда любой из выбранных GPIO имеет ВЫСОКИЙ уровень

Шаг 6: пробуждение сопроцессора ULP

Сопроцессор ULP может работать, пока микросхема находится в режиме глубокого сна, и может использоваться для поиска датчиков, контроля значений АЦП или емкостных датчиков касания и активации микросхемы при обнаружении определенного события.

Сопроцессор ULP является частью области мощности периферийных устройств RTC и запускает программу, хранящуюся в медленной памяти RTC. Следовательно, периферийные устройства RTC и медленная память RTC будут активированы во время глубокого сна, если будет запрошен этот режим активации.

Шаг 7: сенсорная панель

Контроллер RTC содержит логику для запуска тревоги с помощью емкостных сенсорных датчиков. Однако определение контактного штифта другое. Мы должны использовать прерывание касания для каждого из желаемых контактов.

После настройки прерываний мы включили режим пробуждения для использования датчиков.

// Настраиваем сенсорную панель как источник пробуждения esp_sleep_enable_touchpad_wakeup ();

Шаг 8: переход в режим глубокого сна

После установки режима пробуждения достаточно одной команды, чтобы перевести ESP32 в режим глубокого сна (затрачивая 2,5 мкА или меньше). Подчеркиваю, что это расход от чипа ESP, а не от планшета, так как последний тратит больше.

esp_deep_sleep_start ();

Например, от этой команды ESP32 засыпает и не выполняет следующие строки кода.

Важно: все настройки пробуждения должны быть выполнены перед выполнением указанной выше команды.

Шаг 9. Вот еще одна важная информация

Вот еще одна важная информация
Вот еще одна важная информация

Приведенный ниже вызов возвращает причину пробуждения ESP32.

1: EXT0 2: EXT1 3: ТАЙМЕР 4: СЕНСОРНАЯ ПАНЕЛЬ 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

Узел Wi-Fi MCU-32S ESP-WROOM-32
Узел Wi-Fi MCU-32S ESP-WROOM-32

Шаг 12: Сборка

сборка
сборка

Шаг 13: программа

Теперь мы создадим программу, в которой мы настроим ESP32 для перехода в режим глубокого сна. Он будет активирован тремя разными способами: один для внешнего пробуждения (ext0), один для таймера и один для сенсорной панели. Они не могут работать вместе, поэтому мы будем использовать переменную, которая будет счетчиком количества раз, когда ESP32 передал Boot, чтобы настроить способ пробуждения.

Шаг 14: Требуется библиотека

Требуется библиотека
Требуется библиотека

Для управления OLED-дисплеем нам понадобится внешняя библиотека. Для этого скачаем библиотеку U8g2.

В среде Arduino IDE перейдите в меню Sketch >> Включить библиотеку >> Управление библиотеками….

Шаг 15: библиотеки и переменные

Мы включили библиотеку для управления OLED-дисплеем, а также конструктор экземпляра контроллера дисплея. Также мы размещаем переменную в памяти RTC. Мы устанавливаем чувствительность для принятия касания, микросекундный коэффициент преобразования для секунд и время перехода ESP32 в спящий режим (в секундах).

#include // biblioteca para controle do display oled

// конструктор экземпляра управления, отображающий // SDA = 21 e SCL = 22 U8X8_SSD1306_128X64_NONAME_SW_I2C display (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 converã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: настройка

В программе установки мы увеличиваем количество загрузок. Мы вызываем функцию для печати мотива загрузки. Если номер загрузки - PAR, мы устанавливаем ESP32 для пробуждения с помощью кнопки (EXT0). Если оно кратно 3, мы устанавливаем ESP32 на пробуждение по истечении заданного времени. В противном случае мы настраиваем емкостные сенсорные контакты, чтобы разбудить ESP32. Наконец, мы устанавливаем сенсорную панель в качестве источника пробуждения и заставляем ESP32 перейти в спящий режим.

void setup () {Serial.begin (115200); задержка (1000); // приращение числовых значений очереди BOOT ++ bootCount; configureDisplay (); // создание функции для загрузки или мотивации BOOT print_wakeup_reason (); // этот номер загрузки для конфигураций PAR или ESP32 для отправки запросов на загрузку (EXT0) if (bootCount% 2 == 0) {esp_sleep_enable_ext0_wakeup (GPIO_NUM_39, 1); // 1 = Высокий, 0 = Низкий} // для нескольких конфигураций 3 o ESP32 для определения значения темпа else if (bootCount% 3 == 0) {esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); } // может быть противоположным образом сконфигурирован контактный конденсатор для использования ESP32 else {// Настройка прерывания на сенсорной панели 5 (GPIO12) touchAttachInterrupt (T5, callback, Threshold); // Настраиваем сенсорную панель как источник пробуждения 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

В Loop нам делать нечего. Затем мы переходим к обратному вызову прерывания, если нам нужно что-то сделать, когда происходит прерывание. Что касается configureDisplay, мы инициализируем дисплей и настраиваем некоторые параметры. Мы печатаем на экране количество загрузок.

// не задано без loopvoid loop () {} // callback das interrupções void callback () {// caso queira fazer algo ao ocorrer a interrupção} void configureDisplay () {// запускает отображение и настраивает параметры отображения параметров. начинать(); display.setPowerSave (0); // modo powerSave (0-Off? 1-On) display.setFont (u8x8_font_torussansbold8_u); // использование шрифта // не отображать номер, полученный при загрузке display.drawString (0, 0, "BOOT NUM:"); display.drawString (0, 2, String (bootCount).c_str ()); display.drawString (0, 4, «МОТИВО:»); }

Шаг 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) {case 1: reason = "EXT0 RTC_IO BTN"; перерыв; случай 2: причина = "EXT1 RTC_CNTL"; перерыв; случай 3: причина = "ТАЙМЕР"; перерыв; случай 4: причина = "СЕНСОРНАЯ ПАНЕЛЬ"; перерыв; случай 5: причина = "ПРОГРАММА ULP"; перерыв; по умолчанию: причина = "НЕТ ПРИЧИНЫ DS"; перерыв; } Serial.println (причина); display.clearLine (6); // apaga a linha 6 do display display.drawString (0, 6, cause.c_str ()); // очистить причину отказа от показа // чтобы отключить сенсорную панель, нужно проверить ее качество, если нужно отключить отображение if (wakeup_reason == 4) {print_wakeup_touchpad (); // проверка изображения и загрязнения без отображения}}

Шаг 19: Print_wakeup_touchpad (знакомство с GPIO Touch)

Теперь, на этом шаге, у нас есть функция для печати контакта, которого коснулись. Мы восстановили GPIO, который пробудил ESP32, и распечатали его на дисплее.

// функция для печати или записи для токадовых изображений print_wakeup_touchpad () {touch_pad_t touchPin; touchPin = esp_sleep_get_touchpad_wakeup_status (); // восстановить GPIO, который был уничтожен ESP32 String GPIO = ""; переключатель (touchPin) {case 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); // пример 7 do display display.drawString (0, 7, "GPIO:"); display.drawString (6, 7, GPIO.c_str ()); // очистить GPIO}

Шаг 20: Загрузите файлы

PDF

Я НЕТ

Рекомендуемые: