- ESP8266 настройка под прошивку по воздуху через wi-fi в FLProg
- Прошивка по воздуху контроллера esp8266 v2.0
- Программирование ESP8266 в Arduino IDE «по воздуху» (OTA, Over The Air)
- Что такое OTA программирование ESP8266?
- 3 простых шага по использованию OTA с ESP8266
- Шаг 1. Установка Python версии 2.7.x
- Шаг 2. Процедура загрузки скетча OTA через последовательный интерфейс
- Шаг 3. Загрузите новый скетч «по воздуху»
ESP8266 настройка под прошивку по воздуху через wi-fi в FLProg
Я даже не знаю добавлять ли какие-то картинки в этой статье, все разжевал в видео которое в конце статьи.
Наверное здесь остановлюсь на основных подводных камнях для того чтоб все прошло у Вас гладко.
Прошивка ESP8266 методом ATO
OTA (от «over the air», что можно перевести как «по воздуху») – это метод загрузки на модуль ESP8266 новой прошивки, но не через последовательный порт, а по WiFI-связи. Этот метод крайне полезен, если ESP8266 находится в каком-то труднодоступном месте.
На мой взгляд очень интересная штука и очень полезная, но arduino ide для того чтоб залить скетч по “Воздуху” использует python поэтому его нужно установить.
Во-первых, на компьютер нужно будет установить Python 2.7.x.
- Зайдите на сайт Python и загрузите версию 2.7.x для Windows
- Откройте файл и следуйте инструкциям программы-установщика
- Выберите вариант «Install for all users»
Это нужно зделать обязательно, так как arduino ide обращается к python как “python.exe” поэтому path должен быть настроен.
После заливки скетча с OTA и попытке установить новый скетч через wifi и программу Arduino ide, может возникнуть ошибка:
void setup(void) < Serial.begin(115200); >void loop() < uint32_t realSize = ESP.getFlashChipRealSize(); uint32_t ideSize = ESP.getFlashChipSize(); FlashMode_t ideMode = ESP.getFlashChipMode(); Serial.printf("Flash real id: %08X\n", ESP.getFlashChipId()); Serial.printf("Flash real size: %u bytes\n\n", realSize); Serial.printf("Flash ide size: %u bytes\n", ideSize); Serial.printf("Flash ide speed: %u Hz\n", ESP.getFlashChipSpeed()); Serial.printf("Flash ide mode: %s\n", (ideMode == FM_QIO ? "QIO" : ideMode == FM_QOUT ? "QOUT" : ideMode == FM_DIO ? "DIO" : ideMode == FM_DOUT ? "DOUT" : "UNKNOWN")); if (ideSize != realSize) < Serial.println("Flash Chip configuration wrong!\n"); >else < Serial.println("Flash Chip configuration ok.\n"); >delay(5000); >
Ну или его можно скачать по ссылке:https://yadi.sk/d/E4ZC4sOfjYULpw
Данный скетч нужно залить на esp8266. После этого можно заливать уже другие скетчи, перезаписав данный. И при попытке прошить esp8266 через wi-fi уже такой ошибки возникать не будет.
В принципе все. Все подводные камни которые мне встречались при создании OTA я Вас рассказал. Подробнее о создании OTA в программе FLProg можно посмотреть в видео:
Прошивка по воздуху контроллера esp8266 v2.0
Здравствуйте, в этой статье мы разберем OTA прошивку esp8266 (ну или говорят простым языком, прошивку по воздуху). В этой статье я уже разбирал прошивку по воздуху, но тогда нам нужно было еще установить программу python на компьютер и прошивалось это все по ip адресу. В этом же примере я думаю все будет гораздо проще, мы будем заливать новую прошивку в esp8266 через веб интерфейс. Так же у некоторых людей не получалось повторить первый способ, но с этим способом прошивки я думаю справится большинство.
Итак в принципе нам ничего не понадобится, кроме самого контроллера ESP8266, на картинке и в видео ниже, используется контроллер NodeMCU его можно приобрести здесь: http://ali.pub/3dpnvb
Но я его использую из-за удобства подключения, для тестов. Для окончательных проектов мне больше нравятся контроллеры wemos d1 они по функционалу такие-же, но в 2 раза меньше и их легче можно спрятать в какой нибудь корпус. Купить wemos d1 можно здесь: http://ali.pub/3dpoub
Я думаю если вы попали на данную статью, то уже знакомы с esp8266 и определились с ее реализацией.
Программу которую я покажу сейчас, придумал не я, ее нашел на просторах интернета мой подписчик Дамир Салахов. Он перепробовал много способов прошивки ESP по воздуху, но пришел к выводу, что данный способ самый лучший.
Саму программу ОТА можно скачать здесь: https://yadi.sk/d/Kt2JRijJ2wclwg
Итак как я уже говорил ранее, принцип работы здесь такой, что мы заходим по веб интерфейсу и заливаем прошивку уже через него.
Для начала давайте посмотрим на саму программу:
//Файл для загрузки должен иметь расширение *.bin #include #include #include const char* ssid = "TechSUP_2Gz"; // SSID wi-fi роутера const char* password = "Connection77*ok"; // Пароль от wi-fi #define OTAUSER "admin" // Логин для входа в OTA #define OTAPASSWORD "admin" // Пароль для входа в ОТА #define OTAPATH "/firmware"// Путь, который будем дописывать после ip адреса в браузере. #define SERVERPORT 80 // Порт для входа, он стандартный 80 это порт http ESP8266WebServer HttpServer(SERVERPORT); ESP8266HTTPUpdateServer httpUpdater; //----------------------------------------------------------------- void setup(void) < WiFi.begin(ssid, password); /* Ждем подключения к Wifi */ while (WiFi.status() != WL_CONNECTED) < delay(1000); >httpUpdater.setup(&HttpServer, OTAPATH, OTAUSER, OTAPASSWORD); HttpServer.onNotFound(handleNotFound); HttpServer.begin(); > void loop(void) < HttpServer.handleClient(); // Прослушивание HTTP-запросов от клиентов >/* Выводить надпись, если такой страницы ненайдено */ void handleNotFound() < HttpServer.send(404, "text/plain", "404: Not found"); >
Здесь нас интересуют вот эти параметры:
const char* ssid = "TechSUP_2Gz"; // SSID wi-fi роутера const char* password = "Connection77*ok"; // Пароль от wi-fi #define OTAUSER "admin" // Логин для входа в OTA #define OTAPASSWORD "admin" // Пароль для входа в ОТА #define OTAPATH "/firmware"// Путь, который будем дописывать после ip адреса в браузере. #define SERVERPORT 80 // Порт для входа, он стандартный 80 это порт http
Я конечно их описал в комментариях к коду и думаю еще раз не стоит это все описывать.
После заливки скетча в контроллер переходим по ip адресу и видим следующее окно:
Это окно выскакивает, если мы ввели не существующую страницу. Как было описано в комментариях к коду, чтоб открыть страницу для прошивки, нужно ввести следующее:
http://ipадрес/firmware – где /firmware это путь который мы указываем в define OTAPATH
После ввода правильного пути у нас выскочит окно ввода логина и пароля:
Как указали в скетче, логин: admin пароль: admin
После ввода верных логина и пароля, нас перенесет в следующее окно, уже непосредственно в котором будем выбирать файл для прошивки:
Тут остановимся по подробнее, дело в том, что файлы с расширением .ino данным способом не загрузить в контроллер. Загрузить сможем только бинарный файл (двоичный) расширения .bin . На самом деле, тут ничего нет сложного, так как программа для программирования arduino ide умеет преобразовывать скетчи в формат .bin , для этого нам нужно открыть скетч, который мы хотим залить, выбрать пункты в программе arduini ide: ” Скетч->Экспорт бинарного файла” и файл с расширением .bin сохранится в туже папку где и находится файл .ino данного скетча. Выглядит это все таким образом:
После того как мы сохранили .bin файл его теперь можем выбрать в web интерфейсе и загрузить в наш контроллер esp8266.
Еще такой момент, если хотите чтоб скетч снова можно было залить после заливки файла .bin нужно в вашем новом скетче оставить код который предназначен для OTA. Иными словами Вы берете тело скетча OTA и добавляете туда уже свой код, оставляя OTA код. Тогда вы в любой момент можете подключиться по ip адресу и залить новый скетч.
В видео, которое добавлено ниже, я постарался подробно об этом рассказать и показать. И там еще показал примеры, как можно залить новый скетч отредактированный из тела OTA скетча. Извиняюсь за тавтологию, надеюсь вы меня поняли.
Программирование ESP8266 в Arduino IDE «по воздуху» (OTA, Over The Air)
Фантастической особенностью любого микроконтроллера с поддержкой Wi-Fi, такого как ESP8266 NodeMCU, является возможность обновления его прошивки по беспроводной сети. Это называется программированием «по воздуху» (OTA, Over-The-Air).
Что такое OTA программирование ESP8266?
OTA программирование позволяет обновлять/загружать новую программу в ESP8266 с помощью Wi-Fi вместо того, чтобы требовать от пользователя подключить ESP8266 к компьютеру через USB.
Функциональность OTA чрезвычайно полезна в случае отсутствия физического доступа к модулю ESP. Это помогает сократить время, затрачиваемое на обновление каждого модуля ESP при технической поддержке.
Одной из важных особенностей OTA является то, что один центральный объект может отправлять обновления нескольким модулям ESP, использующим одну и ту же сеть.
Единственным недостатком является то, что вам нужно для OTA добавлять дополнительный код в каждый загружаемый скетч, чтобы в следующем обновлении вы смогли снова использовать OTA.
3 простых шага по использованию OTA с ESP8266
- Установка Python версии 2.7.x. Первый шаг – установите на компьютер Python версии 2.7.x.
- Загрузка базовой OTA прошивки через последовательный интерфейс. Загрузите скетч, содержащий прошивку OTA. Этот шаг обязателен шаг, чтобы вы могли выполнять следующие обновления/загрузки через беспроводную сеть.
- Загрузка нового скетча по воздуху. Теперь вы можете загружать новые скетчи в ESP8266 из Arduino IDE по воздуху.
Шаг 1. Установка Python версии 2.7.x
Чтобы использовать функциональность OTA, вам необходимо установить Python версии 2.7.x, если он еще не установлен на вашем компьютере.
Перейдите на официальный сайт Python и загрузите 2.7.x (конкретный релиз) для Windows (установщик MSI).
Откройте установщик и следуйте указаниям мастера установки.
В разделе настройки Python 2.7.x убедитесь, что включен последний параметр «Add python.exe to Path» (добавить python.exe в путь).
Шаг 2. Процедура загрузки скетча OTA через последовательный интерфейс
Заводской образ в ESP8266 не поддерживает возможность обновления через OTA. Поэтому вам нужно сначала загрузить на ESP8266 прошивку OTA через последовательный интерфейс.
Этот шаг обязателен для первой прошивки, чтобы вы могли выполнять следующие обновления/загрузки по беспроводной сети.
Дополнение ESP8266 для Arduino IDE поставляется с библиотекой OTA и примером BasicOTA. Вы можете получить к нему доступ через Файл → Примеры → ArduinoOTA → BasicOTA.
Должен загрузиться следующий код. Но, прежде чем начать загружать скетч в модуль, вам нужно внести несколько изменений, чтобы он у вас заработал. Вам необходимо изменить следующие две переменные в соответствии с учетными данными вашей сети, чтобы ESP8266 мог подключиться к существующей сети.
const char* ssid = ". "; const char* password = ". ";
После этих изменений загрузите скетч.
#include #include #include #include const char* ssid = ". "; const char* 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-[ChipID] // ArduinoOTA.setHostname("myesp8266"); // Аутентификация по умолчанию // ArduinoOTA.setPassword("admin"); // Пароль может быть зашифрован MD5 // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3 // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3"); ArduinoOTA.onStart([]() < String type; if (ArduinoOTA.getCommand() == U_FLASH) type = "sketch"; else // U_SPIFFS type = "filesystem"; // Примечание: NOTE: при обновлении SPIFFS это место для размонтирования SPIFFS с помощью SPIFFS.end() Serial.println("Start updating " + type); >); ArduinoOTA.onEnd([]() < Serial.println("\nEnd"); >); 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"); 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"); >); ArduinoOTA.begin(); Serial.println("Ready"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); > void loop()
Теперь откройте монитор последовательного порта со скоростью 115200 бит/с. И нажмите кнопку RST на ESP8266. Если все в порядке, он выведет динамический IP адрес, полученный от вашего маршрутизатора. Запишите его.
Шаг 3. Загрузите новый скетч «по воздуху»
А теперь давайте загрузим новый скетч по воздуху, т.е. через Wi-Fi.
Помните! Вам нужно добавлять код для OTA в каждый загружаемый вами скетч. В противном случае вы потеряете возможность прошивки через OTA и не сможете выполнять следующие загрузки через беспроводную сеть. Поэтому рекомендуется изменять приведенный выше код, включая в него ваш новый код.
В качестве примера мы включим простой скетч Blink в код BasicOTA. Не забудьте изменить переменные SSID и пароля на учетные данные вашей сети.
Изменения в программе BasicOTA выделены номерами строк.
#include #include #include #include const char* ssid = ". "; const char* password = ". "; // переменные для мигания светодоиодом const int led = D0; // вывод ESP8266, к которому подключен встроенный светодиод unsigned long previousMillis = 0; // хранит время последнего обновления светодиода const long interval = 1000; // интервал мигания (миллисекунды) int ledState = LOW; // ledState используется для установки состояния светодиода void setup() < pinMode(led, OUTPUT); 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-[ChipID] // ArduinoOTA.setHostname("myesp8266"); // Аутентификация по умолчанию // ArduinoOTA.setPassword("admin"); // Пароль может быть зашифрован MD5 // MD5(admin) = 21232f297a57a5a743894a0e4a801fc3 // ArduinoOTA.setPasswordHash("21232f297a57a5a743894a0e4a801fc3"); ArduinoOTA.onStart([]() < String type; if (ArduinoOTA.getCommand() == U_FLASH) type = "sketch"; else // U_SPIFFS type = "filesystem"; // Примечание: NOTE: при обновлении SPIFFS это место для размонтирования SPIFFS с помощью SPIFFS.end() Serial.println("Start updating " + type); >); ArduinoOTA.onEnd([]() < Serial.println("\nEnd"); >); 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"); 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"); >); ArduinoOTA.begin(); Serial.println("Ready"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); > void loop() < ArduinoOTA.handle(); // цикл для мигания без использования задержек unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) < // сохранить последнее внемя, когда мигнули светодиодом previousMillis = currentMillis; // если светодиод погашен, включить его, и наоборот ledState = not(ledState); // установить состояние светодиода в соответствии с переменной digitalWrite(led, ledState); >>
В приведенной выше программе мы не использовали delay() для мигания светодиода, потому что ESP8266 во время delay() приостанавливает программу. Если следующий запрос OTA будет сгенерирован, когда ESP8266 приостановлен в ожидании прохождения задержки delay() , ваша программа пропустит этот запрос.
Как только вы скопируете приведенный выше скетч в Arduino IDE, выберите Инструменты → Порт, и вы должны увидеть что-то вроде этого: esp8266-xxxxxx at ip_адрес_вашего_esp. Если подобного не будет, возможно, вам придется перезапустить IDE.
Выберите порт и нажмите кнопку «Загрузить». Через несколько секунд новый скетч будет загружен. И вы должны увидеть на плате мигающий светодиод.