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

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

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Pixel Art Mini Meow Animated.gif Черновик


Прошивка 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»
Python 1.png
  • В секции «Customize Python 2.7.X» включите последнюю опцию, т.е. «Add python.exe to Path»
Python 2.png

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

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

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

  • Подключите ESP8266 к компьютеру через USB-кабель:
ESP8266 connected to computer 3.jpg
  • Откройте в IDE Arduino меню Инструменты > Плата (Tools > Board) и выберите свой ESP. Также выберите COM-порт, соответствующий вашему ESP
Select esp8266 com port 4.png
  • Откройте скетч-пример «BasicOTA.ino». Для этого кликните в IDE Arduino на Файл > Примеры > Arduino OTA > BasicOTA.ino (File > Examples > Arduino OTA > BasicOTA.ino) или просто скопируйте скетч, показанный ниже, в рабочую область IDE Arduino:
 1 /*********
 2   Руи Сантос (Rui Santos)
 3   Более подробно о проекте на: http://randomnerdtutorials.com
 4   Пример в IDE Arduino: File > Examples > Arduino OTA > BasicOTA.ino
 5                        (Файл > Примеры > Arduino OTA > BasicOTA.ino)
 6 *********/
 7 
 8 #include <ESP8266WiFi.h>
 9 #include <ESP8266mDNS.h>
10 #include <WiFiUdp.h>
11 #include <ArduinoOTA.h>
12 
13 // замените значения в этих константах на те, 
14 // что соответствуют вашей сети:
15 const char* ssid = "YOUR_SSID";
16 const char* password = "YOUR_PASSWORD";
17 
18 void setup() {
19   Serial.begin(115200);
20   Serial.println("Booting");  //  "Загрузка"
21   WiFi.mode(WIFI_STA);
22   WiFi.begin(ssid, password);
23   while (WiFi.waitForConnectResult() != WL_CONNECTED) {
24     Serial.println("Connection Failed! Rebooting...");
25     //  "Соединиться не удалось! Перезагрузка..."
26     delay(5000);
27     ESP.restart();
28   }
29 
30   // строчка для номера порта по умолчанию
31   // можно вписать «8266»:
32   // ArduinoOTA.setPort(8266);
33 
34   // строчка для названия хоста по умолчанию;
35   // можно вписать «esp8266-[ID чипа]»:
36   // ArduinoOTA.setHostname("myesp8266");
37 
38   // строчка для аутентификации
39   // (по умолчанию никакой аутентификации не будет):
40   // ArduinoOTA.setPassword((const char *)"123");
41 
42   ArduinoOTA.onStart([]() {
43     Serial.println("Start");  //  "Начало OTA-апдейта"
44 
45   });
46   ArduinoOTA.onEnd([]() {
47     Serial.println("\nEnd");  //  "Завершение OTA-апдейта"
48   });
49   ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
50     Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
51   });
52   ArduinoOTA.onError([](ota_error_t error) {
53     Serial.printf("Error[%u]: ", error);
54     if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
55     //  "Ошибка при аутентификации"
56     else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
57     //  "Ошибка при начале OTA-апдейта"
58     else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
59     //  "Ошибка при подключении"
60     else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
61     //  "Ошибка при получении данных"
62     else if (error == OTA_END_ERROR) Serial.println("End Failed");
63     //  "Ошибка при завершении OTA-апдейта"
64   });
65   ArduinoOTA.begin();
66   Serial.println("Ready");  //  "Готово"
67   Serial.print("IP address: ");  //  "IP-адрес: "
68   Serial.println(WiFi.localIP());
69 }
70 
71 void loop() {
72   ArduinoOTA.handle();
73 }

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

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

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

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

ESP8266 connected to powerbank 7.jpg
  • Откройте IDE Arduino, а затем кликните на Инструменты > Порт (Tools > Port). Вы должны увидеть что-то вроде «esp8266-xxxxxx», имеющее IP-адрес, показанный ранее в мониторе порта.
Select esp8266 wifi 8.png
  • Скопируйте в IDE Arduino скетч, показанный ниже, и загрузите его на ESP8266. Этот скетч программирует модуль NodeMCU с чипом ESP12-E на мигание встроенного светодиода один раз в секунду.
 1 /*********
 2   Руи Сантос (Rui Santos)
 3   Подробнее о проекте на: http://randomnerdtutorials.com
 4   Пример в IDE Arduino: File > Examples > Arduino OTA > BasicOTA.ino
 5                        (Файл > Примеры > Arduino OTA > BasicOTA.ino)
 6 *********/
 7 
 8 #include <ESP8266WiFi.h>
 9 #include <ESP8266mDNS.h>
10 #include <WiFiUdp.h>
11 #include <ArduinoOTA.h>
12 
13 // замените значения в этих константах на те, 
14 // что соответствуют вашей сети:
15 const char* ssid = "YOUR_SSID";
16 const char* password = "YOUR_PASSWORD";
17 
18 const int ESP_BUILTIN_LED = 2;
19 
20 void setup() {
21   Serial.begin(115200);
22   Serial.println("Booting");  //  "Загрузка"
23   WiFi.mode(WIFI_STA);
24   WiFi.begin(ssid, password);
25   while (WiFi.waitForConnectResult() != WL_CONNECTED) {
26     Serial.println("Connection Failed! Rebooting...");
27     //  "Соединиться не удалось! Перезагрузка..."
28     delay(5000);
29     ESP.restart();
30   }
31 
32   // строчка для номера порта по умолчанию
33   // можно вписать «8266»:
34   // ArduinoOTA.setPort(8266);
35 
36   // строчка для названия хоста по умолчанию;
37   // можно вписать «esp8266-[ID чипа]»:
38   // ArduinoOTA.setHostname("myesp8266");
39 
40   // строчка для аутентификации
41   // (по умолчанию никакой аутентификации не будет):
42   // ArduinoOTA.setPassword((const char *)"123");
43 
44   ArduinoOTA.onStart([]() {
45     Serial.println("Start");  //  "Начало OTA-апдейта"
46   });
47   ArduinoOTA.onEnd([]() {
48     Serial.println("\nEnd");  //  "Завершение OTA-апдейта" 
49   });
50   ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
51     Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
52   });
53   ArduinoOTA.onError([](ota_error_t error) {
54     Serial.printf("Error[%u]: ", error);
55     if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
56     //  "Ошибка при аутентификации"
57     else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
58     //  "Ошибка при начале OTA-апдейта"
59     else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
60     //  "Ошибка при подключении"
61     else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
62     //  "Ошибка при получении данных"
63     else if (error == OTA_END_ERROR) Serial.println("End Failed");
64     //  "Ошибка при завершении OTA-апдейта"
65   });
66   ArduinoOTA.begin();
67   Serial.println("Ready");  //  "Готово"
68   Serial.print("IP address: ");  //  "IP-адрес: "
69   Serial.println(WiFi.localIP());
70   pinMode(ESP_BUILTIN_LED, OUTPUT);
71 }
72 
73 void loop() {
74   ArduinoOTA.handle();
75   digitalWrite(ESP_BUILTIN_LED, LOW);
76   delay(1000);
77   digitalWrite(ESP_BUILTIN_LED, HIGH);
78   delay(1000);
79 }

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

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

См.также

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