• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Проблема с прошивкой по ОТА

user2222

New member
Добрый день. Год назад собрал себе датчик температуры на ESP8266, повесил его на улице и он до сих пор работает. Но тут мне захотелось немного подправить кое-что в скетче и при попытке залить в ESP новый код получаю ошибку
[ERROR]: Bad Answer: ERR: ERROR[4]: Not Enough Space

выбранный последовательный порт
не существует или плата не подключена к нему
На момент сборки и отладки проблем с прошивкой по ОТА не возникало. Что это может быть? За год работы память чем-то забилась? Есть ли возможность исправить эту ситуацию без перепрошивки по проводам?
 

pvvx

Активный участник сообщества

user2222

New member
Попробуйте сразу после перезагрузки есп, например передергиванием питания.
Пробовал, не помогает
  • Откройте IDE Arduino, а затем кликните на Инструменты > Порт (Tools > Port). Вы должны увидеть что-то вроде «esp8266-xxxxxx», имеющее IP-адрес, показанный ранее в мониторе порта.
Думаете, я не знаю что нужно выбрать порт?
В доме есть еще одна железка на ESP, прошивается по воздуху без проблем. Кроме этого взял NodeMCU залил туда измененный код и несколько раз потом перезалил по воздуху тоже без проблем. Перебрал всемозможные варианты Flash Size 4MB - ничего не дало.
 

CodeNameHawk

Moderator
Команда форума
Пробовал, не помогает
Я так понял, у вас не видно устройство, MDNS.update(); добавили в цикл?

Обычно мешает прошиваться по ОТА "долгие" функции, достаточно по натыкать delay и может не работать.
Как у вас с памятью, не утекает?
И если есп ходит в интернет, то бывают затыки при ухудшении интернета.

Я применяю такой подход, в основном цикле, перед каждой функцией, что работает с сетью(или с интернетом) ставлю проверку
if (WiFi.status() == WL_CONNECTED) ...
Получается, что когда нет соединения с сетью, есп работает автономно.
В таком случает, после перезагрузки всегда есть возможность прошить через ОТА.
 

user2222

New member
Я так понял, у вас не видно устройство, MDNS.update(); добавили в цикл?
Если вы про ArduinoIDE то ESP я там вижу.
MDNS.update(); добавили в цикл?
Нет, сама библиотека ESP8266mDNS.h используется, но MDNS.update(); в скетче нет.
Обычно мешает прошиваться по ОТА "долгие" функции, достаточно по натыкать delay и может не работать.
delay не использую. Только millis() и встроенную в библиотеку BlynkSimpleEsp8266.h BlynkTimer (может в нем есть delay, надо глянуть).
Как у вас с памятью, не утекает?
Как это узнать?
И если есп ходит в интернет, то бывают затыки при ухудшении интернета.
ESP соединяется только с сервером BLYNK. Думал может сигнал WiFi слабоват, поставил роутер в прделах прямой видимости (метров 5) - ничего не помогло.
 

pvvx

Активный участник сообщества
Думаете, я не знаю что нужно выбрать порт?
Имелось в виду, что выбран не тот адрес...

А на счет "не хватает памяти", то т.к. используется модель "heap4/5" то она может быть дефрагментировна и не иметь необходимого непрерывного блока для OTA. Это беда использования C++.
Такие модели "heap" не используются для устройств рассчитанных на долговременную работу (без частой перезагрузки, т.е. для отработки одной функции за одну перезагрузку) и для отказоустойчивых систем.
Обычным запросом "сколько свободно памяти" это не узнать.
 

user2222

New member
т.е. нужно снимать ESP и перепрошивать по проводу, другого выхода не остается?
 

pvvx

Активный участник сообщества
Впишите обработку команды перезагрузки и таймер перезагрузки, чтобы такого не повторилось в следующий раз.
 

pvvx

Активный участник сообщества
Это как, не подскажите? ESP.reset() по таймеру ?
Типа того. Я не могу "подсказать", т.к. давно не использую глюкодром ESP8266. Надеюсь другие подскажут, но всё равно вам придется адаптировать код под свой проект, а описания его вы не привели...
 

pvvx

Активный участник сообщества
Алгоритмически возможно вписать такое:
Когда устройство "бездельничает" и время таймера перезагрузки истекло, тогда:
1. запросить большой кусок памяти и если не дает, то - перезагрeзка.
2. если дает, освободить и продолжение с переназначением таймера.
Необходимый размер блока нужно узнать расковыряв OTA и добавить какие-то проценты...
 

pvvx

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

user2222

New member
А на счет "не хватает памяти", то т.к. используется модель "heap4/5" то она может быть дефрагментировна и не иметь необходимого непрерывного блока для OTA. Это беда использования C++.
Такие модели "heap" не используются для устройств рассчитанных на долговременную работу (без частой перезагрузки, т.е. для отработки одной функции за одну перезагрузку) и для отказоустойчивых систем.
Обычным запросом "сколько свободно памяти" это не узнать.
Долговременная работа - это сколько? Час, день, неделя, месяц... ? До вчерашней перезагрузки аптайм составил где-то 27 дней
 

pvvx

Активный участник сообщества
Долговременная работа - это сколько? Час, день, неделя, месяц... ? До вчерашней перезагрузки аптайм составил где-то 27 дней
Долговременная работа - для меня и то, что изготавливает наша контора своего - это 10 лет минимум.
Arduino столько не живет. А что там у вас и какой желателен цикл - неизвестно.
 

pvvx

Активный участник сообщества
Вы роутер можете выключить? Вот по нему, по обрыву связи, пусть и перезагружается. Хотя бы такую простую реализацию...
 

yurik72

Member
Из своего опыта добавлю, у меня возникало проблема прошивки через OTA, устройство просто падало и перегружалось в какой то момент, и после долгих ковыряний в коде и поиске ошибок, проблема оказалась в питании. Само устройство могло работать месяцами без перегрузки, использовало короткие пакеты для сброса данных в инет. А на OTA не хватило. Помог обычный конденсатор на 1000 мкф по линии 3.3 V. Советуют ставить танталовый еще, но у меня не оказалось
 

CodeNameHawk

Moderator
Команда форума
т.е. нужно снимать ESP и перепрошивать по проводу, другого выхода не остается?
Если она прошивалась по ОТА, то попробуйте отключить есп, перезагрузить комп и роутер, запустить есп и только тогда запустить ардуиноиде.
 
Сверху Снизу