Режимы глубокого сна в ESP32 с помощью ESP-IDF


В этом уроке мы изучим работу с режимами глубокого сна и источниками пробуждения в ESP32 с помощью ESP-IDF. Мы покажем, как перевести плату разработки ESP32 в режим глубокого сна. Кроме того, мы также обсудим различные источники пробуждения, с помощью которых ESP32 может переходить из спящего режима в обычный режим выполнения, такие как таймер, внешние события, сенсорные контакты и пробуждение сопроцессора ULP.

Режимы глубокого сна и источники пробуждения в ESP32

Также на нашем сайте вы можете прочитать статью про использование спящих режимов в ESP32 с помощью Arduino IDE.

Режим глубокого сна в ESP32

Режим глубокого сна в ESP32 помогает экономить заряд батареи и снижать энергопотребление. Модуль потребляет много энергии, обычно до 75 мА в обычном режиме, а при использовании Wi-Fi это потребление увеличивается до 240 мА. Чтобы уменьшить это дополнительное энергопотребление, мы можем легко перевести плату в режим глубокого сна, когда нам нужно выполнить какую-либо задачу после определенного промежутка времени. При успешной активации режима глубокого сна в ESP32 потребление тока будет находиться в диапазоне микроампер (мкА), а время работы батареи также увеличится.

В таблице ниже показаны периферийные устройства и модули, активные или неактивные в различных режимах работы ESP32. Обратите внимание, что в режиме глубокого сна включены только память RTC и периферийные устройства (контроллер RTC, быстрая память RTC, медленная память RTC) и сопроцессор ULP, остальные модули выключены, включая все цифровые периферийные устройства, большую часть ОЗУ и ЦП.

Различные режимы работы ESP32 и его периферийных устройств

Для более полного понимания ситуации, ознакомьтесь с таблицей ниже, чтобы увидеть, как изменяется энергопотребление платы ESP32 в режиме глубокого сна по сравнению с другими режимами.

Энергопотребление компонентов платы ESP32 в различных режимах

Теперь рассмотрим как настроить режимы пониженного энергопотребления.

Настройка режима глубокого сна

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

Это API используется для перехода в режим глубокого сна. Если источник пробуждения еще не настроен, плата остается в режиме глубокого сна до тех пор, пока не будет нажата внешняя кнопка сброса.

После перехода платы ESP32 в режим глубокого сна контроллер RTC отключает цифровые периферийные устройства и процессоры. Кроме того, аппаратное обеспечение настраивается в соответствии с заданными источниками пробуждения.

Источники пробуждения ESP32

Для пробуждения ESP32 из глубокого сна можно использовать различные источники пробуждения. К ним относятся пробуждение по таймеру, пробуждение по контакту сенсора, внешнее пробуждение и пробуждение сопроцессора ULP. Эти источники пробуждения могут действовать по отдельности или даже комбинироваться таким образом, что при срабатывании любого из источников плата ESP32 просыпается. Эти источники настраиваются в коде до того, как плата ESP32 перейдет в режим глубокого сна. Для включения источника пробуждения используется следующий универсальный API:

где 'X' — источник пробуждения, который может принимать одно из следующих значений:

  • таймер;
  • сенсорная панель;
  • ext0;
  • ext1;
  • ulp.

Аналогичным образом, для отключения источника пробуждения используется следующий универсальный API:

Пробуждение по таймеру

Пробуждение по таймеру — один из простейших способов пробуждения, использующий встроенный таймер контроллера реального времени (RTC). Плата ESP32 просыпается по истечении заданного времени таймера. Время таймера определяется в микросекундах, хотя точное разрешение зависит от источника тактовой частоты, выбранного для RTC SLOW_CLK. Хотя пробуждение по таймеру основано на встроенном таймере RTC, в этом режиме пробуждения нет необходимости оставлять периферийные устройства RTC/память RTC включенными во время сна.

Следующая функция используется для включения пробуждения в фазу глубокого сна с помощью таймера:

Сенсорная панель

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

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

Контакты сенсорного датчика ESP32

ESP-WROOM-32 состоит из 10 встроенных емкостных сенсорных датчиков. Они полезны, поскольку работают как сенсоры, которые могут вызывать прерывание сенсорной панели при касании, обнаруживая любые электрические/магнитные волны вокруг себя. Вы можете посмотреть контакты сенсорных датчиков на плате ESP32:

  • TOUCH0 – GPIO4
  • TOUCH1 – GPIO0
  • TOUCH2 – GPIO2
  • TOUCH3 – GPIO15
  • TOUCH4 – GPIO13
  • TOUCH5 – GPIO12
  • TOUCH6 – GPIO14
  • TOUCH7 – GPIO27
  • TOUCH8 – GPIO33
  • TOUCH9 – GPIO32

Внешнее пробуждение

В качестве источника пробуждения также используется внешнее пробуждение, при котором изменение состояния контакта GPIO выводит плату ESP32 из глубокого сна. Источник пробуждения настраивается до перевода платы ESP32 в режим глубокого сна. Существует два типа внешнего пробуждения, которые можно настроить: ext0 и ext1. В случае ext0 один контакт GPIO настраивается как источник внешнего пробуждения. Однако, если используется несколько контактов GPIO, то вместо них используется ext1.

Важно отметить, что в качестве источника пробуждения для внешнего источника можно использовать только контакты GPIO RTC.

ESP32 DevKit V1-DOIT имеет 14 выводов GPIO для RTC, которые можно использовать для активации по внешнему прерыванию.

  • RTC_GPIO0 : GPIO36
  • RTC_GPIO3: GPIO39
  • RTC_GPIO9: GPIO32
  • RTC_GPIO8: GPIO33
  • RTC_GPIO6: GPIO25
  • RTC_GPIO7: GPIO26
  • RTC_GPIO17: GPIO27
  • RTC_GPIO16: GPIO14
  • RTC_GPIO15: GPIO12
  • RTC_GPIO14: GPIO13
  • RTC_GPIO11: GPIO0
  • RTC_GPIO13: GPIO15
  • RTC_GPIO12: GPIO2
  • RTC_GPIO10: GPIO4

Внешнее пробуждение – ext0

Как мы уже упоминали, ext0 используется, когда один из выводов GPIO RTC используется в качестве внешнего источника пробуждения. Для включения источника пробуждения ext0 мы используем следующий API:

Модуль ввода-вывода RTC отвечает за запуск пробуждения ext0. Поскольку модуль ввода-вывода RTC является частью домена питания периферийных устройств RTC, периферийные устройства RTC должны быть включены во время режима глубокого сна, если ext0 используется в качестве источника пробуждения.

Как мы уже упоминали, можно комбинировать несколько источников пробуждения, при этом любой из них может инициировать пробуждение. Однако при использовании ext0 нельзя использовать одновременно источники пробуждения для тачпада или ULP. Они несовместимы с этим внешним источником пробуждения.

Внешнее пробуждение -ext1

Как мы уже упоминали, ext1 используется, когда несколько выводов GPIO RTC используются в качестве внешних источников пробуждения. Для включения источника пробуждения ext1 мы используем следующий API:

Контроллер RTC отвечает за запуск пробуждения ext1. Поэтому периферийные устройства RTC могут быть выключены во время использования источников пробуждения ext1. Для запуска пробуждения с помощью ext1 можно использовать одну из двух логических функций: ESP_EXT1_WAKEUP_ANY_HIGH или ESP_EXT1_WAKEUP_ALL_LOW. В случае первой логической функции пробуждение запускается, когда любой из установленных выводов GPIO RTC находится в состоянии HIGH. В случае второй логической функции пробуждение запускается, когда все установленные выводы GPIO RTC находятся в состоянии LOW.

Пробуждение сопроцессора ULP

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

Для включения этого источника пробуждения мы используем следующий API:

Пример глубокого сна ESP32 с помощью ESP-IDF 

В этом разделе мы создадим и протестируем пример глубокого сна, предоставляемый ESP-IDF на вкладке system («Система»). Этот пример настраивает различные источники пробуждения, а затем переводит плату ESP32 в глубокий сон, используя API esp_sleep.h.

Создание примера проекта

Откройте VS Code и перейдите в меню View > Command Palette («Вид» > «Палитра команд»). Введите в строке поиска ESP-IDF: New Project и нажмите Enter.

Укажите название проекта и каталог. Мы назвали наш проект «ESP_IDF_DEEP_SLEEP». Для платы ESP-IDF мы выбрали опцию custom board («Пользовательская плата»). В качестве целевой платформы ESP-IDF мы выбрали модуль ESP32. Нажмите кнопку ‘Choose Template’ («Выбрать шаблон»), чтобы продолжить.

Создание примера проекта глубокого сна

В разделе Extension («Расширение») выберите опцию ESP-IDF:

Выбор опции ESP-IDF в разделе Extension («Расширение»)

На вкладке system («Система») мы щелкнем по пункту «deep_sleep». Затем нажмем ‘Create project using template deep_sleep’ («Создать проект, используя шаблон deep_sleep»).

Создание проекта с использованием шаблона deep_sleep

Вы получите уведомление о создании проекта. Чтобы открыть проект в новом окне, нажмите «Да».

Это откроет созданный нами проект ESP_IDF_DEEP_SLEEP во вкладке EXPLORER. Внутри папки проекта находится несколько папок. Это справедливо для всех проектов, которые вы будете создавать с помощью ESP-IDF Explorer.

Конфигурация проекта

Для начала перейдем в меню menuconfig. Щелкните значок, показанный ниже. Откроется редактор конфигурации ESP-IDF SDK.

Иконка в VS Code для запуска меню menuconfig

Прокрутите вниз и откройте Example Configuration (пример конфигурации) для нашего проекта. Здесь вы можете включить источники пробуждения, которые хотите использовать в примере. По умолчанию включены пробуждение от касания, мониторинг температуры с помощью ULP и пробуждение от GPIO. Вы также можете отключить любую опцию по своему усмотрению.

Открытие Example Configuration (пример конфигурации) для нашего проекта

Перейдём к файлу main.c. В папке main находится исходный код, поэтому файл main.c будет расположен именно там.

Теперь перейдите в файл main > deep_sleep_example_main.c и откройте его.

Ниже приведён фрагмент кода. Этот пример кода демонстрирует, как перевести ESP32 в режим глубокого сна и настроить четыре источника пробуждения, указанных ниже.

  • Пробуждение по таймеру: встроенный таймер RTC запускает пробуждение ESP32 каждые 20 секунд.
  • Внешнее пробуждение ext1: ext1 инициирует пробуждение с помощью ESP_EXT1_WAKEUP_ANY_HIGH. Это означает, что когда любой из выводов GPIO RTC находится в состоянии HIGH, плата ESP32 просыпается. В этом примере в качестве выводов GPIO RTC используются GPIO2 и GPIO4.
  • Пробуждение сенсорной панели: пробуждение произойдет, когда пользователь коснется любого из контактов сенсорной панели: GPIO32 или GPIO33 для ESP32 и GPIO9 для ESP32-S2. Это вызовет прерывание от сенсорного датчика.
  • Пробуждение с помощью сопроцессора ULP: п этом случае сопроцессор ULP непрерывно контролирует температуру микроконтроллера. Когда температура превышает 5 градусов Цельсия, запускается процесс пробуждения.

В этом примере скетча используются API, которые мы обсуждали ранее, для настройки источников пробуждения таймера, ext1, касания и ULP, а затем плата ESP32 переводится в режим глубокого сна.

Код для запуска глубокого сна на ESP32

Компиляция скетча

Для прошивки микросхемы введите следующую команду в последовательном терминале. Не забудьте заменить COM-порт на тот, через который подключена ваша плата.

Ввод команды в терминале для компиляции скетча

После успешной прошивки кода терминал ESP-ID отображает следующие сообщения. Это начальный запуск, поэтому он отображается сообщением ‘Not a deep sleep reset’ («Не выполнен сброс в режиме глубокого сна»). Таймер пробуждения включен на заданное время 20 секунд. Пробуждение ext1 настроено на GPIO2 и GPIO4. Для пробуждения тачпада были настроены GPIO33 и GPIO32, которые соответствуют тачпаду 8 и тачпаду 9 соответственно. Для обоих тачпадов выводится среднее значение показаний вместе с установленным порогом. Затем включается пробуждение тачпада и ULP. Наконец, плата ESP32 переходит в режим глубокого сна.

Сообщения в теминале свидетельствующие о переходе платы ESP32 в режим глубокого сна

Это сообщения, которые мы получили в терминале, когда ESP32 вышел из глубокого сна. ESP32 снова загружается, но на этот раз терминал выводит сообщение о пробуждении и источник, вызвавший его. В нашем случае пробуждение произошло из-за ULP. После вывода всех сообщений, показывающих измерения температуры ULP и активацию источников пробуждения, ESP32 снова переходит в глубокий сон.

Сообщения в терминале свидетельствующие о выходе платы ESP32 из режима глубокого сна и повторного в него входа

Для запуска пробуждения через ext1 сначала убедитесь, что контакты GPIO2 и GPIO4 ESP32 находятся в низком состоянии, чтобы избежать плавающих контактов, а затем подключите один из этих двух контактов к высокому состоянию. Аналогично, для запуска пробуждения с помощью тачпада подключите провод к контактам GPIO32 или GPIO33 и коснитесь их. Вы также можете подключить к этим контактам сенсоры касания. Без использования дополнительного оборудования будут работать только источники пробуждения по таймеру и ULP.

(Проголосуй первым!)
Загрузка...
12 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *