Esp32 как отключить wifi

Обновлено: 05.07.2024

Без сомнений, плата ESP32 может составить конкуренцию многим платам WiFi/MCU и SoC, при этом часто превосходя их в производительности и цене. Однако, в зависимости от режима работы, плата ESP32 может потреблять много энергии.

Энергопотребление платы не играет большой роли в IoT-проектах, где плата «зашита» в стену, однако, когда речь идет о питании от батареи – каждый миллиампер-час важно экономить.

Часто это решается снижением потребления платы включением одного из нескольких режимов сна.

Что такое «режим сна»?

Это состояние платы, во время которого она не используется. Состояние ESP32 находится в оперативной памяти. Когда плата входит в режим сна, периферия платы отключается от питания, в то время, как ОЗУ получает достаточно питания только чтобы хранить данные.

Что внутри чипа ESP32?

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

active_mode

«Сердцем» чипа является 32-битный двухъядерных микропроцессор, постоянное запоминающее устройство с 448Кб памяти, 520Кб оперативной памяти и 4Мб флеш-памяти.

Кроме того, плата содержит модули WiFi, Bluetooth, криптографический ускоритель (это сопроцессор, разработанный специально для выполнения вычислительно-интенсивных криптографических операций), модуль RTC (real-time clock – часы реального времени) и периферийные устройства.

Режимы энергопотребления ESP32

Благодаря продвинутой системе энергопотребления, плата имеет 5 режимов потребления. Чип может изменять эти режимы для соответствия требованиям устройств в электричестве. Собственно, режимы энергопотребления:

  • Активный режим
  • Спящий режим модема
  • Режим легкого сна
  • Режим глубокого сна
  • Режим гибернации

У каждого режима свои преимущества и возможности сбережения энергии. Давайте разберем каждый режим.

Активный режим

Активный режим – стандартное состояние платы, в нем активны все функции чипа.

Поскольку активный режим постоянно поддерживает все модули в работоспособном состоянии (особенно модуль WiFi, ядра процессора и модуль Bluetooth), для работы микросхемы требуется ток более 240 мА. Также при одновременном использовании WiFi и Bluetooth иногда достигаются пики мощности до 790 мА.

active_mode_

В Datasheet ESP32 можно найти энергопотребление платы в активном режиме:

Wi-Fi Tx packet 13dBm

Wi-Fi/BT Tx packet 0dBm

Wi-Fi/BT Rx and listening

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

Режим модема ESP32

В режиме сна модема все активно, кроме WiFi и Bluetooth. Процессор также работает. В этом режиме чип потребляет около 3 мА на медленной скорости и 20 мА на высокой скорости передачи.

modem_sleep_mode

Для поддержания соединения WiFi и Bluetooth процессор и соответствующие модули включаются через определенные интервалы времени. В эти моменты плата переходит в активный режим.

Плата может уходить в режим сна модема только тогда, когда она подключена к роутеру в режиме станции. ESP32 остается подключенной к маршрутизатору через механизм маяка DTIM.

Для энергосбережения плата выключает модуль WiFi между двумя интервалами DTIM и автоматически включает его перед следующим сигналом.

Время ожидания определяется интервалом маяка DTIM роутера, оно обычно составляет от 100 мс до 1000 мс.

Режим легкого сна

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

light_sleep_mode

Перед переходом в спящий режим плата сохраняет свое состояние в ОЗУ и, после выхода из сна, возобновляет свою работу. Одним из способом входа в такой режим сна является функция

Для работы с Wi-Fi понадобится встроенная библиотека WiFi.h (исходники). В большинстве примеров вам надо знать имя сети и пароль от него. После окончания работы желательно вызывать метод WiFi.disconnect(true);.

Базовый минимальный пример

Сначала рассмотрим базовый пример для общего понимания. Все пояснения в комментариях.

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

Получить IP-адреса

В пассивном режиме без входа в сеть вы получите IP-адрес, равный 0.0.0.0. Если нужно получить реальный адрес, то скетч нужно переписать. Добавим возможность входа в сеть, используя учётные данные.

Теперь вы получите реальный IP-адрес. Узнав адрес через WiFi.localIP(), вы можете в командной строке ввести команду ping ESP_ADDRESS (подставьте ваш адрес), чтобы убедиться, что устройство находится в сети. Пригодится для отладки примеров.

Метод WiFi.getHostname() возвращает имя платы espressif. По идее по этому имени тоже можно обращаться через команду ping espressif, но у меня этот вариант не заработал.

Также привёл другие вызовы функций, которые встречаются в библиотеке.

Другой вариант получения IP-адреса через лямбда-функции.

Ещё один пример получения IP-адреса разными способами. На этот раз обойдёмся без лямбда-функции. Как и в предыдущем примере мы отслеживаем событие SYSTEM_EVENT_STA_GOT_IP и при его наступлении вычисляем адрес.

Адрес вычисляем тремя способами. Первый способ самый простой, вызываем функцию localIP() и получаем готовый результат. Второй способ - получаем информацию из WiFiEventInfo_t через его поле got_ip. Третий способ - используем класс IPAddress. Два последних способа даны для общего развития, пользуйтесь первым.

Узнать настройки Wi-Fi модуля

Для скетча нам не понадобится вводить пароль от Wi-Fi, достаточно просто включить сам Wi-Fi на плате и узнать его Mac-адрес, запустить диагностику, узнать локальный адрес.

WiFiScan

Встроенный пример Examples/WiFi/WiFiScan служит для сканирования WiFi-сети. Выводит число найденных точек и их названия.

В скетче используются следующие функции:

  • WiFi.mode(WIFI_STA) - устанавливает нужный режим
  • WiFi.disconnect() - завершает соединение
  • WiFi.scanNetworks() - сканирует сети и возвращает число найденных точек доступа
  • WiFi.RSSI(i) - возвращает уровень сигнала по индексу
  • WiFi.SSID(i) - возвращает имя точки доступа по индексу

Сканируем WiFi-сеть. Расширенный вариант

Чтобы просканировать текущую WiFi-сеть, нам понадобятся учётная запись для входа в неё (идентификатор и пароль). После успешного входа запускаем сканирование через функцию WiFi.scanNetworks(), которая вернёт информацию о всех точках доступа с сопутствующими свойствами.

Для удобства часть кода поместим в отдельные функции: scanNetworks() и connectToNetwork() (её можно использовать при использовании контроллера в качестве веб-клиента.

Обратите внимание, что мы получаем IP-адрес два раза. Первый раз при выходе в интернет, а второй раз - когда закрываем WiFi-соединение. Во втором случае IP-адрес будет равен 0.0.0.0

В мониторе порта выводится следующая информация (часть данных я убрал в целях безопасности).

Точка доступа

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

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

Отслеживаем момент подключения и отключения устройства к точке доступа

За соответствующие события отвечают SYSTEM_EVENT_AP_STACONNECTED и SYSTEM_EVENT_AP_STADISCONNECTED.

Mac-адрес для точки доступа

В первом примере с получением настроек модуля мы вычисляли Mac-адрес через функцию WiFi.macAddress. Существует также функция WiFi.softAPmacAddress(), когда плата работает в режиме точки доступа.

Включаем поддержку IPv6

Мы можем включить поддержку IPv6 и получить адрес в этом формате. Включение поддержки IPv6 происходит при помощи функции softAPenableIpV6(). Вызовем функцию при событии SYSTEM_EVENT_AP_START, когда активируется точка доступа.

После включения поддержки в событии SYSTEM_EVENT_AP_STA_GOT_IP6 (получение адреса) узнаём IPv6-адрес.

Сколько устройств подключено к точке доступа

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


Режим экономии энергии ESP8266 (DEEP SLEEP)


Итак, вы создали потрясающий проект, используя аппаратное обеспечение ESP8266, в котором есть LiPo аккумулятор, или вы просто подключили свой NodeMCU к USB-аккумулятору. Но после запуска вы понимаете, что питание от аккумулятора длится недолго.

Поскольку мы много времени не контролируем аппаратное обеспечение / компоненты в микроконтроллере, мы не можем оптимизировать оборудование. Но мы можем написать прошивку, которая будет отключать оборудование, чтобы сэкономить электроэнергию. Во время сна устройство потребляет гораздо меньше энергии, чем при пробуждении.

В этой статье мы сосредоточимся на режиме DEEP SLEEP (режим экономии электроенергии) с ESP8266.


ТИПЫ СНА
Существует четыре режима сна для ESP8266: No-sleep, Modem-sleep, Light-sleep и Deep-sleep.

Все они имеют разные функции.

NO-SLEEP

Установка No-Sleep режима значить что постоянно будет работать все оборудование. Очевидно, что это наиболее неэффективно и будет потреблять больше всего энергии.

MODEM-SLEEP

MODEM-SLEEP - это режим по умолчанию для ESP8266. Однако он включен только когда вы подключены к точке доступа.

В режиме «MODEM-SLEEP» ESP8266 отключает модем (WiFi) на как возможно дольше. Он отключает модем между интервалами DTIM Beacon. Этот интервал устанавливается вашим маршрутизатором.

LIGHT-SLEEP

Light-sleep выполняет ту же функцию, что и «MODEM-SLEEP», но также отключает системные часы и приостанавливает работу CPU. CPU не выключен. Это просто холостой ход.

DEEP-SLEEP

Все выключено, но часы реального времени (RTC) включены потому что нужно контролировать время. Поскольку все выключено, это наиболее энергоэффективный вариант.

Если вам нужна дополнительная информация, обязательно ознакомьтесь с документацией.

MODEM-SLEEP и LIGHT-SLEEP полезны, если вам все еще нужно работать в ESP8266, и вам нужны дополнительные опции питания. Они также легко настраиваются в настройках WiFi ESP8266. Но, если вам нужно какое-то серьезное управление мощностью, Deep-sleep - это ваш вариант.



С Deep-sleep структура наших приложений будет выполнять следующие шаги:

Выполните некоторые действия (считывание информации с датчика)
Сон на n микросекунд
Повторение

Важно отметить, что время сна указано в микросекундах (мкс).

Забавный факт, вы не можете отключить ESP8266 на вечно. Согласно SDK ESP8266, вы можете отключить его только на 4 294 967 295 мкс, что составляет около

Теперь давайте посмотрим код. В этих примерах я собираюсь использовать IDE Arduino.

Давайте рассмотрим простой пример:

Несмотря на то, что мы ничего не подключаем, чтобы включить Deep-sleep, нам нужно связать контакт RST с GPIO 16 на ESP8266. На NodeMCU GPIO 16 представлен как D0.

Если мы посмотрим на распиновку для NodeMCU, мы увидим, что GPIO 16 является специальным выводом:


Вывод RST поддерживается сигналом HIGH при запуске ESP8266. Однако, когда контакт RST получает сигнал LOW, он перезапускает микроконтроллер. Когда ваше устройство находится в режиме глубокого сна, он отправит сигнал LOW на GPIO 16, когда таймер сна будет включен. Вам необходимо подключить GPIO 16 к RST для пробуждения (или сброса) устройства, когда Deep-sleep закончился.

Вот пример кода:

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

DEEP-SLEEP W/ ПОДКЛЮЧЕНИЕ


В реальном мире мы хотим выполнить действие, например, сделать сетевой запрос, в то время как устройство отключено. Давайте рассмотрим пример отправки показаний датчика температуры в Losant каждые 20 секунд и сон между ними.

Вот код:
В этом примере мы выполняем следующие шаги:

Подключение к Wi-Fi (если не подключено)
Считывание датчика температуры из аналогового
Режим сна - 1мин
Повторение

Вывод
Теперь, когда вы знаете, как использовать режим экономии энергии (DEEP-SLEEP), вы можете сделать свое оборудование более энергоэффективным.

ESP32 DevKit — это универсальная платформа для разработки IoT-решений.


Программирование на C++


Для начала работы с платформой ESP32 DevKit на языке C++ скачайте и установите на компьютер интегрированную среду разработки Arduino IDE. По умолчанию среда IDE настроена только на AVR-платы. Для платформы ESP32 DevKit добавьте в менеджере плат поддержку платформ на модуле ESP32. Выберите платформу ESP32 DevKit: Инструменты Плата DOIT ESP32 DEVKIT V1 .

После выполненных действий плата ESP32 DevKit готова к программированию через Arduino IDE.

Подробности о функциях и методах работы ESP32 на языке C++ читайте на ESP32 Arduino Core’s.

Примеры работы для Arduino

ESP32 может подключиться к Wi-Fi сети, создать собственную точку доступа, представляться сервером и клиентом, формировать GET и POST запросы. Также микроконтроллер имеет два АЦП и датчик Хола.

Пример WebClient

После подключения к Wi-Fi микроконтроллер напишет в COM порт ответ от сервера.


Пример Analog WebServer

ESP32 имеет 15 аналоговых пинов. Выведем через веб-интерфейс значения с 36, 39 и 34 пина.

Когда микроконтроллер подключится к Wi-Fi сети, в монитор порта будет выведен IP-адрес веб-страницы с данными. Получить к ней доступ можно из локальной сети, перейдя по указанному IP-адресу. Скопируйте IP-адрес из монитора порта и вставьте в адресную строку браузера. Если вы подключены к той же локальной сети, что и ESP32, то вы увидите веб-интерфейс.

Пример blink WebServer

Создадим WEB-сервер на порту 80. С помощью веб-интерфейса будем мигать светодиодами на 16 и 17 пинах.


При переходе по IP-адресу из монитора порта, выводится веб-страница с кнопками.

Программирование на JavaScript


Для старта с платформой Wi-Fi Slot на языке JavaScript скачайте и установите интегрированную среду разработки — Espruino Web IDE.

Подробнее о функциях и методах работы ESP32 на языке JavaScript читайте документацию на Espruino.

Элементы платы


Мозг платформы

Платформа для разработки ESP32 DevKit основана на модуле ESP32-WROOM с чипом ESP32-D0WDQ6 от Espressif.


Чип ESP32-D0WDQ6

Чип ESP32-D0WDQ6 — выполнен по технологии SoC (англ. System-on-a-Chip — система на кристалле), в которую входит 2-ядерный 32-битный процессор Tensilica Xtensa LX6 с блоками памяти ROM на 448 КБ и SRAM на 520 КБ. В кристалле также расположены беспроводные технологии Wi-Fi/Bluetooth, радио-модуль, датчик Холла и сенсор температуры.

Для работы с чипом необходима внешняя Flash-память и другая электронная обвязка. Кристалл ESP32-D0WDQ6 является основой на базе которой выпускаются модули с необходимой периферией: например ESP32-WROOM или ESP32-WROVER .

Модуль ESP32-WROOM

ESP32-WROOM — модуль с чипом ESP32-D0WDQ6, Flash-памятью на 4 МБ и всей необходимой обвязкой, которые спрятаны под металлическим кожухом. Pins SCK/CLK, SDO/SD0, SDI/SD1, SHD/SD2, SWP/SD3 and SCS/CMD, namely, GPIO6 to GPIO11 are connected to the integrated SPI flash integrated on the module and are not recommended for other uses.

Рядом с кожухом расположена миниатюрная антенна из дорожки на верхнем слое печатной платы в виде змейки. Металлический кожух экранирует компоненты модуля и тем самым улучшает электромагнитные свойства.

Модуль является основной, на которой выполняются промышленные устройства или отладочные платы, например: ESP32 DevKit или ESP32-Sense Kit .

USB-UART преобразователь

Преобразователь USB-UART на микросхеме CP2102 обеспечивает связь модуля ESP32-WROOM с USB-портом компьютера. При подключении к ПК — платформа ESP32 DevKit определяется как виртуальный COM-порт.

Разъём micro-USB

Разъём micro-USB предназначен для прошивки и питания платформы ESP32 DevKit с помощью компьютера.

Светодиодная индикация

Имя светодиода Назначение
ON Индикатор питания платформы.
LED Пользовательский светодиод на 2 пине микроконтроллера. При задании значения «высокого уровня» светодиод включается, при «низком» – выключается.

Кнопка EN

Кнопка предназначена для ручного сброса программы — аналог кнопки RESET обычного компьютера.

Кнопка BOOT

Кнопка служит для ручного перевода модуля в режим прошивки:

Регулятор напряжения

Линейный понижающий регулятор напряжение AMS1117-3.3 обеспечивает питание микроконтроллера. Выходное напряжение 3,3 вольта с максимальным током 1 А.

Распиновка


Пины питания

VIN: Пин для подключения внешнего источника напряжения в диапазоне от 5 до 14 вольт. 3V3: Пин от стабилизатора напряжения с выходом 3,3 вольта и максимальных током 1 А. Регулятор обеспечивает питание модуля ESP32-WROOM.

Порты ввода/вывода

В отличие от большинства плат Arduino, родным напряжением ESP32 DevKit является 3,3 В, а не 5 В. Выходы для логической единицы выдают 3,3 В, а в режиме входа ожидают принимать не более 3,3 В. Более высокое напряжение может повредить микроконтроллер!

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

Читайте также: