Базовое OTA-обновление ESP32 «по воздуху» (OTA) в Arduino IDE

Базовое OTA-обновление ESP32 «по воздуху» (OTA) в Arduino IDE

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

К счастью, существует отличное решение — обновление «по воздуху» (Over-The-Air).

Что такое обновление «по воздуху» (OTA)?

ESP32 обладает важной функцией, которая называется обновление «по воздуху» (Over-The-Air updates), или сокращённо OTA. Эта функция позволяет загружать новые программы или прошивки на ESP32 через соединение Wi-Fi, а не через подключение традиционного USB-кабеля.

Эта возможность становится особенно ценной, когда ваш ESP32 установлен в труднодоступном месте, например, на крыше, спрятан внутри стены или расположен в отдалённой зоне на улице.

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

Принцип работы OTA-обновления ESP32

Прежде чем начать работать с OTA-обновлениями, очень полезно понять, что происходит «за кулисами» и как ESP32 управляет всем этим процессом.

ESP32 организует свою флеш-память в различные секции, называемые разделами (Partitions). Эти разделы используются для различных целей, таких как хранение программ, сохранение пользовательских данных и управление файловыми системами.

Для правильной работы OTA-обновлений ESP32 необходима специальная организация памяти. Эта организация включает как минимум два одинаковых раздела приложений, с именами ota_0 и ota_1, а также третий раздел, называемый otadata (раздел данных OTA).

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

Процесс OTA-обновления ESP32

В любой момент времени только один из этих разделов приложений активен и выполняет вашу программу, в то время как другой простаивает и не используется. Когда вы выполняете OTA-обновление, новая программа загружается в неактивный раздел. Как только загрузка завершается и ESP32 проверяет, что новое обновление является допустимым, система переключается, делая только что обновлённый раздел активным. С этого момента ваш ESP32 будет запускать новую программу из этого раздела.

Такая продуманная архитектура обеспечивает важную функцию безопасности. Если что-то пойдёт не так во время обновления, ESP32 может автоматически откатиться к предыдущей версии прошивки, которая работала нормально. Эта возможность отката делает всю систему гораздо более надёжной и предотвращает полную неработоспособность вашего устройства из-за неудачного обновления.

Два основных метода OTA для ESP32

Существует несколько методов выполнения OTA-обновлений на ESP32, но два из наиболее часто используемых:

Базовое OTA

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

После успешной загрузки этого скетча с поддержкой OTA ваш ESP32 будет отображаться как сетевой порт наряду с обычными последовательными портами в Arduino IDE. С этого момента вы можете просто выбрать этот сетевой порт и загружать новые программы непосредственно на ваш ESP32 через вашу Wi-Fi-сеть так же легко, как вы бы загружали через USB-кабель.

Веб-обновление (Web Updater)

Метод веб-обновления работает немного иначе. В этом подходе ваш ESP32 запускает небольшой веб-сервер, который предоставляет страницу обновления. С любого компьютера или телефона, подключённого к той же сети, вы можете открыть эту страницу в браузере и загрузить новую версию вашей программы в виде бинарного файла (.bin). ESP32 затем автоматически устанавливает эту новую прошивку.

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

Данное руководство проведёт вас шаг за шагом через реализацию базовых OTA-обновлений. Однако, если вам интересен метод OTA через веб-обновление и вы хотите узнать, как он работает, вы можете ознакомиться с отдельным руководством здесь:

OTA-обновление ESP32 через веб-интерфейс (Web Updater) в Arduino IDE

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

/lastminuteengineers/esp32-ota-web-updater-arduino-ide/index

Шаги для выполнения OTA-обновления

Процесс включения и выполнения OTA-обновления включает два простых шага:

  1. Загрузка скетча с поддержкой OTA через USB (последовательное) соединение.

  2. Загрузка новой программы «по воздуху» через беспроводное соединение.

Шаг 1: Загрузка скетча с поддержкой OTA (серийная загрузка)

Самое первое, что вам нужно сделать, — это загрузить программу с поддержкой OTA на ваш ESP32. Важно помнить, что этот первый шаг всегда должен выполняться через физическое последовательное соединение с помощью USB-кабеля. Только после этой начальной настройки ваш ESP32 сможет начать принимать беспроводные обновления.

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

// Include Libraries
#include <WiFi.h>        // For connecting ESP32 to WiFi
#include <ArduinoOTA.h>  // For enabling over the air updates

// Set WiFi Credentials
const char* ssid = "..........";      // Change to your WiFi Network name
const char* password = "..........";  // Change to you password

void setup() {
  // Connect to WiFi
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    delay(5000);
    ESP.restart();
  }

  ArduinoOTA.begin();  // Starts OTA
}

void loop() {
  ArduinoOTA.handle();  // Handles OTA
}

Разбор работы OTA-кода

Теперь давайте разберём, как этот код на самом деле работает и что делает каждая его часть.

Мы начинаем с подключения двух важных библиотек в верхней части нашего кода. Библиотека WiFi.h позволяет ESP32 подключаться к Wi-Fi-сети, а библиотека ArduinoOTA.h включает обновления «по воздуху».

#include <WiFi.h>        // For connecting ESP32 to WiFi
#include <ArduinoOTA.h>  // For enabling over the air updates

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

// Set WiFi Credentials
const char* ssid = "..........";      // Change to your WiFi Network name
const char* password = "..........";  // Change to you password

Переходя к секции setup нашего кода, первое, что мы делаем, — подключаемся к Wi-Fi. Мы выполняем это с помощью функции WiFi.begin() из библиотеки Wi-Fi. При выполнении она автоматически подключает ваш ESP32 к сети в режиме станции (station mode). Затем код терпеливо ожидает, пока соединение не будет успешно установлено, прежде чем двигаться дальше.

// Connect to WiFi
WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
  delay(5000);
  ESP.restart();
}

После того как Wi-Fi-соединение установлено, мы используем нашу первую важную функцию из библиотеки ArduinoOTA, которая называется ArduinoOTA.begin(). Эта функция не требует никаких специальных параметров — она просто запускает OTA-сервис, чтобы ваш ESP32 был готов принимать беспроводные обновления.

ArduinoOTA.begin();

В секции loop кода у нас есть ещё одна важная функция — ArduinoOTA.handle(). Эта функция непрерывно проверяет, поступают ли на ваш ESP32 запросы на обновление. Ваш собственный код приложения — всё, что вы хотите, чтобы ваш ESP32 делал, — также будет находиться в этой секции loop рядом с этой функцией.

void loop() {
  ArduinoOTA.handle();  // Handles OTA
}

Это действительно представляет собой максимально упрощённый, абсолютный минимум кода, необходимый для работы обновлений «по воздуху» на вашем ESP32.

Однако, если вы хотите изучить дополнительные возможности и функции, вы можете воспользоваться другими функциями, доступными в библиотеке ArduinoOTA. Чтобы увидеть, что ещё возможно, просто перейдите в File > Examples > ArduinoOTA > BasicOTA.

Встроенный пример BasicOTA в Arduino IDE

Шаг 2: Загрузка нового скетча «по воздуху»

Когда ваш ESP32 выполняет скетч с поддержкой OTA, вы можете отключить USB-кабель. С этого момента вы можете питать ESP32 от аккумуляторного блока или любого другого источника питания по вашему выбору.

Перед тем как продолжить, убедитесь, что ваш компьютер и плата ESP32 подключены к одной и той же Wi-Fi-сети. Это абсолютно необходимо для правильной работы OTA.

В Arduino IDE найдите выпадающее меню выбора платы и порта. Теперь вы должны увидеть ваш ESP32 в списке как сетевой порт, например, что-то вроде «DOIT ESP32 DEVKIT V1 at 192.168.254.53» с маленьким значком беспроводной сети рядом. Выберите этот сетевой порт для продолжения. Если вы не можете найти его в выпадающем меню, попробуйте перезапустить IDE.

Выбор сетевого порта в Arduino IDE

Вот что важно помнить для всех ваших будущих обновлений: каждая новая программа, которую вы планируете загрузить «по воздуху», также должна включать в себя и ArduinoOTA.begin(), и ArduinoOTA.handle(). Если вы забудете включить эти функции, вы потеряете возможность OTA после этого обновления, и вам придётся вернуться к использованию USB-кабеля для её восстановления.

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

В качестве практического примера для демонстрации этого процесса мы включили простую программу мигания светодиодом в предыдущий код.

// Include Libraries
#include <WiFi.h>        // For connecting ESP32 to WiFi
#include <ArduinoOTA.h>  // For enabling over the air updates

// Set WiFi Credentials
const char* ssid = "..........";      // Change to your WiFi Network name
const char* password = "..........";  // Change to you password

//variabls for blinking an LED with Millis
const int led = 2;                 // ESP32 Pin to which onboard LED is connected
unsigned long previousMillis = 0;  // will store last time LED was updated
const long interval = 1000;        // interval at which to blink (milliseconds)
int ledState = LOW;                // ledState used to set the LED

void setup() {
  pinMode(led, OUTPUT);

  // Connect to WiFi
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    delay(5000);
    ESP.restart();
  }

  ArduinoOTA.begin();  // Starts OTA
}

void loop() {
  ArduinoOTA.handle();  // Handles OTA

  //loop to blink without delay
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;
    // if the LED is off turn it on and vice-versa:
    ledState = not(ledState);
    // set the LED with the ledState of the variable:
    digitalWrite(led, ledState);
  }
}

Примечание

Вы могли заметить, что в этом примере мы не использовали функцию delay() для мигания светодиода, хотя delay() обычно используется для этой цели. Причина в том, что функция delay() полностью приостанавливает всю вашу программу на определённое время. Если запрос OTA-обновления придёт, пока ваш ESP32 «заморожен» и ожидает завершения delay(), ваша программа полностью пропустит этот запрос, и обновление не удастся.

Вместо использования delay() мы используем неблокирующий метод, такой как millis(). Это позволяет вашей программе продолжать работать и проверять наличие обновлений, даже выполняя другие задачи.

Теперь, когда вы будете готовы, нажмите кнопку «Upload» так же, как вы обычно делаете при любой загрузке Arduino.

На экране появится окно с заголовком «Configure and Upload», предлагающее ввести пароль. Здесь запрашивается пароль Wi-Fi вашей сети. Введите его и нажмите кнопку «Upload» в окне.

Запрос пароля при загрузке OTA-скетча через сетевой порт

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

Мигание встроенного светодиода ESP32

Важные советы

Для бесперебойной работы обновлений «по воздуху» (OTA) на вашем ESP32 важно следовать нескольким ключевым советам.

  • Всегда убедитесь, что каждая новая программа, которую вы загружаете по беспроводной сети, включает OTA-код. Если вы загрузите программу без него, ваш ESP32 потеряет возможность обновления по Wi-Fi. В этом случае вам нужно будет снова подключить плату к компьютеру USB-кабелем и повторно загрузить работающий скетч с поддержкой OTA.

  • Всегда убедитесь, что ваш компьютер и ESP32 находятся в одной Wi-Fi-сети. Это абсолютно необходимо для правильной работы OTA, потому что два устройства должны обмениваться данными друг с другом по сети.

  • Если сетевой порт не появляется в Arduino IDE после первой физической загрузки, не волнуйтесь. Просто перезапустите IDE.

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