ESP8266:Примеры/Прошивка ESP8266 методом OTA

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Прошивка ESP8266 методом OTA[1]

OTA (от «over the air», что можно перевести как «по воздуху») – это метод загрузки на модуль ESP8266 новой прошивки, но не через последовательный порт, а по WiFI-связи. Этот метод крайне полезен, если ESP8266 находится в каком-то труднодоступном месте.

Беспроводная загрузка нового скетча из IDE Arduino может пригодиться в следующих ситуациях:

  • При разработке прошивки – как более быстрая альтернатива загрузке нового скетча через последовательный порт
  • При загрузке прошивки на несколько ESP, подключенных к вашей сети

Давайте приступим!

Шаг 1 – Установка Python 2.7.x

Во-первых, на компьютер нужно будет установить Python 2.7.x.

  • Зайдите на сайт Python и загрузите версию 2.7.x для Windows
  • Откройте файл и следуйте инструкциям программы-установщика
  • Выберите вариант «Install for all users»
  • В секции «Customize Python 2.7.X» включите последнюю опцию, т.е. «Add python.exe to Path»

Шаг 2 – Загрузка BasicOTA.ino (по проводу)

Чтобы у вас появилась возможность загружать новую прошивку беспроводным путем, на ESP8266 нужно сначала установить скетч «BasicOTA.ino», и сделать это нужно через последовательный порт, т.е. по проводу. Перед загрузкой убедитесь, что у вас стоит последняя версия IDE Arduino. Скачать ее можно отсюда.

Потом следуйте этим инструкциям:

  • Подключите ESP8266 к компьютеру через USB-кабель:
  • Откройте в IDE Arduino меню Инструменты > Плата (Tools > Board) и выберите свой ESP. Также выберите COM-порт, соответствующий вашему ESP
  • Откройте скетч-пример «BasicOTA.ino». Для этого кликните в IDE Arduino на Файл > Примеры > Arduino OTA > BasicOTA.ino (File > Examples > Arduino OTA > BasicOTA.ino) или просто скопируйте скетч, показанный ниже, в рабочую область IDE Arduino:
/*********
  Руи Сантос (Rui Santos)
  Более подробно о проекте на: http://randomnerdtutorials.com
  Пример в IDE Arduino: File > Examples > Arduino OTA > BasicOTA.ino
                       (Файл > Примеры > Arduino OTA > BasicOTA.ino)
*********/

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

// замените значения в этих константах на те, 
// что соответствуют вашей сети:
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";

void setup() {
  Serial.begin(115200);
  Serial.println("Booting");  //  "Загрузка"
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    //  "Соединиться не удалось! Перезагрузка..."
    delay(5000);
    ESP.restart();
  }

  // строчка для номера порта по умолчанию
  // можно вписать «8266»:
  // ArduinoOTA.setPort(8266);

  // строчка для названия хоста по умолчанию;
  // можно вписать «esp8266-[ID чипа]»:
  // ArduinoOTA.setHostname("myesp8266");

  // строчка для аутентификации
  // (по умолчанию никакой аутентификации не будет):
  // ArduinoOTA.setPassword((const char *)"123");

  ArduinoOTA.onStart([]() {
    Serial.println("Start");  //  "Начало OTA-апдейта"

  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\nEnd");  //  "Завершение OTA-апдейта"
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
    //  "Ошибка при аутентификации"
    else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
    //  "Ошибка при начале OTA-апдейта"
    else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
    //  "Ошибка при подключении"
    else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
    //  "Ошибка при получении данных"
    else if (error == OTA_END_ERROR) Serial.println("End Failed");
    //  "Ошибка при завершении OTA-апдейта"
  });
  ArduinoOTA.begin();
  Serial.println("Ready");  //  "Готово"
  Serial.print("IP address: ");  //  "IP-адрес: "
  Serial.println(WiFi.localIP());
}

void loop() {
  ArduinoOTA.handle();
}
Примечание

Поменяйте в этом скетче SSID и пароль на те, что соответствуют вашей сети.

  • Нажмите в IDE Arduino на кнопку «Загрузка» и дождитесь сообщения «Загрузка завершена»
  • Откройте в IDE Arduino монитор порта на скорости 115200 бод. Если вы ввели правильные данные для своей WiFi-сети, спустя несколько секунд в мониторе порта должен отобразиться IP-адрес чипа ESP:

Шаг 3 – Загрузка нового скетча методом OTA

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

  • Откройте IDE Arduino, а затем кликните на Инструменты > Порт (Tools > Port). Вы должны увидеть что-то вроде «esp8266-xxxxxx», имеющее IP-адрес, показанный ранее в мониторе порта.
  • Скопируйте в IDE Arduino скетч, показанный ниже, и загрузите его на ESP8266. Этот скетч программирует модуль NodeMCU с чипом ESP12-E на мигание встроенного светодиода один раз в секунду.
/*********
  Руи Сантос (Rui Santos)
  Подробнее о проекте на: http://randomnerdtutorials.com
  Пример в IDE Arduino: File > Examples > Arduino OTA > BasicOTA.ino
                       (Файл > Примеры > Arduino OTA > BasicOTA.ino)
*********/

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

// замените значения в этих константах на те, 
// что соответствуют вашей сети:
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";

const int ESP_BUILTIN_LED = 2;

void setup() {
  Serial.begin(115200);
  Serial.println("Booting");  //  "Загрузка"
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Connection Failed! Rebooting...");
    //  "Соединиться не удалось! Перезагрузка..."
    delay(5000);
    ESP.restart();
  }

  // строчка для номера порта по умолчанию
  // можно вписать «8266»:
  // ArduinoOTA.setPort(8266);

  // строчка для названия хоста по умолчанию;
  // можно вписать «esp8266-[ID чипа]»:
  // ArduinoOTA.setHostname("myesp8266");

  // строчка для аутентификации
  // (по умолчанию никакой аутентификации не будет):
  // ArduinoOTA.setPassword((const char *)"123");

  ArduinoOTA.onStart([]() {
    Serial.println("Start");  //  "Начало OTA-апдейта"
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\nEnd");  //  "Завершение OTA-апдейта" 
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
    //  "Ошибка при аутентификации"
    else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
    //  "Ошибка при начале OTA-апдейта"
    else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
    //  "Ошибка при подключении"
    else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
    //  "Ошибка при получении данных"
    else if (error == OTA_END_ERROR) Serial.println("End Failed");
    //  "Ошибка при завершении OTA-апдейта"
  });
  ArduinoOTA.begin();
  Serial.println("Ready");  //  "Готово"
  Serial.print("IP address: ");  //  "IP-адрес: "
  Serial.println(WiFi.localIP());
  pinMode(ESP_BUILTIN_LED, OUTPUT);
}

void loop() {
  ArduinoOTA.handle();
  digitalWrite(ESP_BUILTIN_LED, LOW);
  delay(1000);
  digitalWrite(ESP_BUILTIN_LED, HIGH);
  delay(1000);
}
Примечание

Поменяйте в этом скетче SSID и пароль на те, что соответствуют вашей сети.

  • Нажмите в IDE Arduino кнопку «Загрузка» и дождитесь сообщения «Загрузка завершена».
  • Ваш ESP должен начать мигать встроенным светодиодом с частотой один раз в секунду.

См.также

Внешние ссылки