Firmware update error code 5 esp8266

Hello All, I am trying to update my firmware for NodeMCU through OTA. I am using the basic HTTP_UPDATE example code given in arduino. The Bin File is placed on Github and trying to download that an...

Hello All,
I am trying to update my firmware for NodeMCU through OTA. I am using the basic HTTP_UPDATE example code given in arduino. The Bin File is placed on Github and trying to download that and upload it to the board.

Platform

  • Hardware: [NodeMCU Amica]
  • Core Version: [latest git hash or date]
  • Development Env: [Arduino IDE]
  • Operating System: [Windows]

Settings in IDE

  • Module: [Generic ESP8266 Module]
  • Flash Mode: [DOUT Compatible]
  • Flash Size: [4MB/1MB]
  • lwip Variant: [v1.4|v2 Lower Memory|Higher Bandwidth]
  • Reset Method: [ck]
  • Flash Frequency: [40Mhz]
  • CPU Frequency: [80Mhz|160MHz]
  • Upload Using: [OTA|SERIAL]
  • Upload Speed: [115200|other] (serial upload only)

/**
httpUpdate.ino

*/

#include <Arduino.h>

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

#include <ESP8266HTTPClient.h>
#include <ESP8266httpUpdate.h>

#define USE_SERIAL Serial

#ifndef APSSID
#define APSSID «Akhtar»
#define APPSK «akhtar1234»
#endif

ESP8266WiFiMulti WiFiMulti;

void setup() {

USE_SERIAL.begin(115200);
// USE_SERIAL.setDebugOutput(true);

USE_SERIAL.println();
USE_SERIAL.println();
USE_SERIAL.println();

for (uint8_t t = 4; t > 0; t—) {
USE_SERIAL.printf(«[SETUP] WAIT %d…n», t);
USE_SERIAL.flush();
delay(1000);
}

WiFi.mode(WIFI_STA);
WiFiMulti.addAP(APSSID, APPSK);

}

void loop() {
// wait for WiFi connection
if ((WiFiMulti.run() == WL_CONNECTED)) {

WiFiClient client;

// The line below is optional. It can be used to blink the LED on the board during flashing
// The LED will be on during download of one buffer of data from the network. The LED will
// be off during writing that buffer to flash
// On a good connection the LED should flash regularly. On a bad connection the LED will be
// on much longer than it will be off. Other pins than LED_BUILTIN may be used. The second
// value is used to put the LED on. If the LED is on with HIGH, that value should be passed
ESPhttpUpdate.setLedPin(LED_BUILTIN, LOW);

t_httpUpdate_return ret = ESPhttpUpdate.update(client, "https://github.com/akhtarusafzai/office/blob/master/Blink.bin");
// Or:
//t_httpUpdate_return ret = ESPhttpUpdate.update(client, "server", 80, "file.bin");

switch (ret) {
  case HTTP_UPDATE_FAILED:
    USE_SERIAL.printf("HTTP_UPDATE_FAILD Error (%d): %sn", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
    break;

  case HTTP_UPDATE_NO_UPDATES:
    USE_SERIAL.println("HTTP_UPDATE_NO_UPDATES");
    break;

  case HTTP_UPDATE_OK:
    USE_SERIAL.println("HTTP_UPDATE_OK");
    break;
}

}
}

Debug Messages

[SETUP] WAIT 4...
[SETUP] WAIT 3...
[SETUP] WAIT 2...
[SETUP] WAIT 1...
HTTP_UPDATE_FAILD Error (-5): HTTP error: connection lost
HTTP_UPDATE_FAILD Error (-5): HTTP error: connection lost
HTTP_UPDATE_FAILD Error (-5): HTTP error: connection lost
HTTP_UPDATE_FAILD Error (-5): HTTP error: connection lost

Victor


  • #1

Начиная с версии AT_v0.18 появилась возможность прошиваться из облака.

Внимание!
В настоящий время поддерживается прошивка из облака только для версий прошивки, начиная с SDK 1.0.0 AT v0.22 от 20.03.2015

1. Проверяем версию прошивки:

0017 — версия AT
0901 — версия SDK

Если версия AT меньше 18, то прошивка из облака не поддерживается — прошиваемся вручную и возвращаемся к пункту 1. Если версия 18 или выше, то идем дальше.

2. Убедитесь, что esp8266 находится в режиме STA или STA+AP

3. Подключаемся к маршрутизатору, затем нужно убедится, что esp8266 получила IP адрес

Код:

AT+CWJAP="ssid","password"
    OK
AT+CIFSR
    192.168.1.100

4. Запускаем обновление

Код:

AT+CIUPDATE
    +CIPUPDATE:1    found server
    +CIPUPDATE:2    connect server
    +CIPUPDATE:3    got edition
    +CIPUPDATE:4    start start

    OK

Если в процессе обновления возникли ошибки, то процесс прервется и esp8266 сообщит «ERROR»
5. Перегружаемся и снова проверяем версию прошивки

6. Profit!

Последнее редактирование: 21 Мар 2015

  • #2

По поводу обновления из облака я вот что расскажу. Скачал я тут недавно прошивку которая XRST поддерживает. Дал команду
AT+CIUPDATE чтоб обновиться, думал может там busy…s уже профиксили, и сижу пишу веб сервер. То что на модуль приходит по вайфаю я вижу. И вдруг приходит Link. Фигасе… Потом почти сразу Unlink и так несколько раз. Кароче кто-то подключился. Потом пошли GET запросы, причем простенькие типа GET HTTP 1.1. И это через некоторое время после обновления из облака. Команда CIPSTATUS показывает IP подключившегося 104.152.52.56.
Вот откуда подключившийся мой IP адрес узнал и порт, который на роутере до модуля проброшен?
Отсюда вывод: тот кто написал эту прошивку добавил туда отправку IP адресов к себе на комп. Или еще лучше организовал обновление со своего компа и теперь все обновляющиеся будут получать его шпионские прошивки.

Victor


  • #3

Или еще лучше организовал обновление со своего компа и теперь все обновляющиеся будут получать его шпионские прошивки.

А по-другому никак. При сборке прошивки по адресу 0x3E000 должен находится файл master_device_key, для официальных прошивок его нет в свободном доступе, нужно выковыривать из существующих официальных прошивок. Каждый разработчик может зарегистрироваться на iot.espressif.cn, сгенерировать свой ключ и включать его в свои прошивки. После этого, обновление через облако происходит не до следующей официальной прошивки, а до следующего релиза разработчика, которому принадлежит ключ. Сделано это специально, с хорошим умыслом. Типа выпустил новую прошивку и все твои девайсы сами обновились. Прикольно. Ну а в реальности, конечно, можно использовать по-разному.

  • #4

Попробовал обновится из облака, на терминале побежали строки
+CIPUPDATE:1
+CIPUPDATE:2
+CIPUPDATE:3
+CIPUPDATE:4
+CIPUPDATE:5
+CIPUPDATE:6
а потом посыпался мусор. Теперь при включении сыпется мусор в терминале и часто моргает синий светодиод, что делать? хана чипу?
мусор что то вроде

5],?4j
В[1E]4<$бя‰/
‹2‘$#[04]uC,2шl*э~[1D]–сляi[06]4:ьм‡&[04][16](Ц4Kы[0B]„.ШQ[07]†я¬8$#юа[0E]СR±C[12]:[12][1A]C[12]H[12]я#Y6†ХYaБВ[12]
xсЖ<R[18]uM|l[06]”[06]џѓф†¶
kDћ6[12]-ТШ[1E][1B]†¤цЬ[19]ґBь»Y[1B]˜;,[1C]ш¬‘ЪцH¬84[08]d $HЙЈя‹‡.ИR[07]ИЖ<i| .[1A][16]RШ[12][1B]†B[12]8[12]ю#Y6†ХY[1A][04]¤ђ¬“ђkDЪ||“Ф¶’[05],?$j[1A]KѕьkDћdя[12]-вШ[1E][1A]†P¤цШ[19]ґBь2Y[1B]ВЦY[1A][07]Т2[16]tнkDЪ||’Ф¶’[05],?$j
В[1E]юм†[04]м‰/[1A]‹±C[11]¤[12][1A]C»H[12]я#Y[13]ВЦYaБX[11]B[1D]ьkFЪ~щ0[19]d’[0B]я[0B]„.ИQ[0B]†я¬8$#ю[02]–Iн*2[12][1A]†PB[12][0E][12]я»Y6‡ХY[1A]$i[04]4:ьм‡&[04]`ИR
¬ю[0B]„.ИQ[0B]†я¬8$#ю[02]–Iн*2[12][1A]†PB[12][0E][12]я»Y6‡ХY[1A]$i[04]4:ьм‡&[04]`ИR
¬ю[0B]„.ИQ[0B]†яkF(Ю .[1A]‹±C2[1A][19]uR6Gц2Y6—ЅЃ
БX[11]B[1D]ьkF˜°[1E][0F]И[16]KыРЉ[1E]<ТсВЦ<iвя[12]–iП:[12]2:¤єШ[12][1E]†ш»Y[1B]Ш;[0C][1C]ш¤‘ЪцH¬84(d $HЙЈя‹‡[17]tR[07]ИЖ<i|[12]-ТШ[1E][1B]†¤цЬ[19]ґBь»Y[1B]aІYCр¤ђЪ{‚Ж<R[18]uM|l[06]”[06]џѓ2’–[05]kDћ6[12]–iП[1D]¤[12][1B]†B[12]8[12]ю#Y6‡ХY[1A][04]¤ђЪ{‚Ж<R[18]uM|l[06]”[06]џѓ2’–[05]kDћ6[12]–iП[11]¤[12][1A]†PB[12][0E][12]я»Y6‡хY[1A]$i[06]4:ьм‡&[04][16](Ц4Kы[0B]„.ШQ[0F]†я¬8$#ю[02]–Iн*2[12][1A]†PB[12][0E][12]я»Y6‡ХY[1A]$¤ђЪ{‚Ж<R[18]uM|l[06]”[06]џѓ2’–[05]kDћ6‰.[1A]‹±C2[1A]2:R2H2я2Y6—ЅЃ
БX[19]B[1D]ш¬84)d $H%ЊшрЉ[1E]<ТуВЖ<i<[12]–iП:[12]2:¤єШ[12][1E]†ш»Y[1B]Ш;[0C][1C]шi[04]4:ьм‡&[04]`ИR
¬ю[0B]„.ИQ[0B]†я¬8$#ю[02]–Iн*2[12][1A]†PB[12][0E][12]я»Y6‡ХY[1A]$¤ђЪ{‚Ж<R[18]uM|l[06]”[06]џѓф†¶
kDћ6[12]–iП[11]¤[12][1A]†PB[12][0E][12]я»Y6‡ХY[1A]$¤‘Ъs‚Ж<)Јr02[Ґ+x#ѓ2’–[05]¬8$$[12]–iП:[12]2:¤єШ[12][1E]†ш»Y[1B]Ш[19]цЩш¤ђ¬“ђkDЪ||’Ф¶’[05],?$j
В[1E]юм†[04]м‰/[1A]‹±C[11]¤[12][1A]C»H[12]я#Y[13]ВЦYaБX[19]B[1D]ш¬84)d $H%ЊшрЉ[1E]<ТуВЖ<i<[12]-ТШ[1E][1B]†¤цЬ[19]ґBь»Y[1B]aІYCрi[06] zсЦ<)ўr02[Т
р°BP•рьЖ<i<‰/[1A]‹2‘$#[04]vC,2шl*э~[1D]–сляi[06]4:ьм‡&[04][16](Ц4Kы[0B]„.ШQ[07]†я¬8$#ю[02]–Iн*2[12][1A]†ёШ2[1E]¤шd+м}[1C]†ръяi[06]4:ьм‡&[04]`ИR

Victor


  • #5

у меня такое было на кривых неоригинальных прошивках (типа 922, 925) — неправильно собраны, не могут обновиться.
Мусор — это новая прошивка принимается с сайта Espressif, а старая не может ее принять :)
Мне помогла просто перепрошивка. GPIO0 на землю, передернуть питание и запускаете XTCOM_UTIL. Ну сначала, конечно, нужно выбрать прошивку, которую будете заливать.

  • #6

Попробовал обновится из облака, на терминале побежали строки
+CIPUPDATE:1
+CIPUPDATE:2
+CIPUPDATE:3
+CIPUPDATE:4
+CIPUPDATE:5
+CIPUPDATE:6
а потом посыпался мусор. Теперь при включении сыпется мусор в терминале и часто моргает синий светодиод, что делать? хана чипу?
мусор что то вроде

5],?4j
В[1E]4<$бя‰/
‹2‘$#[04]uC,2шl*э~[1D]–сляi[06]4:ьм‡&[04][16](Ц4Kы[0B]„.ШQ[07]†я¬8$#юа[0E]СR±C[12]:[12][1A]C[12]H[12]я#Y6†ХYaБВ[12]
xсЖ<R[18]uM|l[06]”[06]џѓф†¶
kDћ6[12]-ТШ[1E][1B]†¤цЬ[19]ґBь»Y[1B]˜;,[1C]ш¬‘ЪцH¬84[08]d $HЙЈя‹‡.ИR[07]ИЖ<i| .[1A][16]RШ[12][1B]†B[12]8[12]ю#Y6†ХY[1A][04]¤ђ¬“ђkDЪ||“Ф¶’[05],?$j[1A]KѕьkDћdя[12]-вШ[1E][1A]†P¤цШ[19]ґBь2Y[1B]ВЦY[1A][07]Т2[16]tнkDЪ||’Ф¶’[05],?$j
В[1E]юм†[04]м‰/[1A]‹±C[11]¤[12][1A]C»H[12]я#Y[13]ВЦYaБX[11]B[1D]ьkFЪ~щ0[19]d’[0B]я[0B]„.ИQ[0B]†я¬8$#ю[02]–Iн*2[12][1A]†PB[12][0E][12]я»Y6‡ХY[1A]$i[04]4:ьм‡&[04]`ИR
¬ю[0B]„.ИQ[0B]†я¬8$#ю[02]–Iн*2[12][1A]†PB[12][0E][12]я»Y6‡ХY[1A]$i[04]4:ьм‡&[04]`ИR
¬ю[0B]„.ИQ[0B]†яkF(Ю .[1A]‹±C2[1A][19]uR6Gц2Y6—ЅЃ
БX[11]B[1D]ьkF˜°[1E][0F]И[16]KыРЉ[1E]<ТсВЦ<iвя[12]–iП:[12]2:¤єШ[12][1E]†ш»Y[1B]Ш;[0C][1C]ш¤‘ЪцH¬84(d $HЙЈя‹‡[17]tR[07]ИЖ<i|[12]-ТШ[1E][1B]†¤цЬ[19]ґBь»Y[1B]aІYCр¤ђЪ{‚Ж<R[18]uM|l[06]”[06]џѓ2’–[05]kDћ6[12]–iП[1D]¤[12][1B]†B[12]8[12]ю#Y6‡ХY[1A][04]¤ђЪ{‚Ж<R[18]uM|l[06]”[06]џѓ2’–[05]kDћ6[12]–iП[11]¤[12][1A]†PB[12][0E][12]я»Y6‡хY[1A]$i[06]4:ьм‡&[04][16](Ц4Kы[0B]„.ШQ[0F]†я¬8$#ю[02]–Iн*2[12][1A]†PB[12][0E][12]я»Y6‡ХY[1A]$¤ђЪ{‚Ж<R[18]uM|l[06]”[06]џѓ2’–[05]kDћ6‰.[1A]‹±C2[1A]2:R2H2я2Y6—ЅЃ
БX[19]B[1D]ш¬84)d $H%ЊшрЉ[1E]<ТуВЖ<i<[12]–iП:[12]2:¤єШ[12][1E]†ш»Y[1B]Ш;[0C][1C]шi[04]4:ьм‡&[04]`ИR
¬ю[0B]„.ИQ[0B]†я¬8$#ю[02]–Iн*2[12][1A]†PB[12][0E][12]я»Y6‡ХY[1A]$¤ђЪ{‚Ж<R[18]uM|l[06]”[06]џѓф†¶
kDћ6[12]–iП[11]¤[12][1A]†PB[12][0E][12]я»Y6‡ХY[1A]$¤‘Ъs‚Ж<)Јr02[Ґ+x#ѓ2’–[05]¬8$$[12]–iП:[12]2:¤єШ[12][1E]†ш»Y[1B]Ш[19]цЩш¤ђ¬“ђkDЪ||’Ф¶’[05],?$j
В[1E]юм†[04]м‰/[1A]‹±C[11]¤[12][1A]C»H[12]я#Y[13]ВЦYaБX[19]B[1D]ш¬84)d $H%ЊшрЉ[1E]<ТуВЖ<i<[12]-ТШ[1E][1B]†¤цЬ[19]ґBь»Y[1B]aІYCрi[06] zсЦ<)ўr02[Т
р°BP•рьЖ<i<‰/[1A]‹2‘$#[04]vC,2шl*э~[1D]–сляi[06]4:ьм‡&[04][16](Ц4Kы[0B]„.ШQ[07]†я¬8$#ю[02]–Iн*2[12][1A]†ёШ2[1E]¤шd+м}[1C]†ръяi[06]4:ьм‡&[04]`ИR

помогла ли перепрошивка? у меня также сыпется мусор, часто мигает синий светодиод
однако когда замыкаю GPIO0 на землю прошится не могу

  • #7

помогла ли перепрошивка? у меня также сыпется мусор, часто мигает синий светодиод
однако когда замыкаю GPIO0 на землю прошится не могу

помогла, прижимая GPIO0 к земле нажми ресет и шей! Удачи!

  • #8

помогла, прижимая GPIO0 к земле нажми ресет и шей! Удачи!

ресет это перемкнуть(и отпустить) ногу RST на VCC?
через какую программу шил?

  • ESP8266_V091.png

    18.7 KB
    Просмотры: 9

Victor


  • #10

ВНИМАНИЕ!
На картинке выше указано, что вы можете подавать 5V на VCC ESP8266 — на большинстве версий это приведет к выходу ESP8266 из строя!
Подавайте напряжение на VCC не выше 3,6V!
А вот UTXD, URXD на большинстве версий модуля толерантно к 5V TTL. Хотя некоторые источники, включая продавцов модулей и документацию ESP8266EX Datasheet, уверяют что высокие уровни TTL должны быть также не выше 3,6V. Как подключать именно ваш модуль — решаете только вы сами на свой страх и риск.

  • #11

Попробовал обновится из облака, …
а потом посыпался мусор.

Вот-вот, такая же ерунда. Только я при попытке обновления из облака забыл GPIO0 на землю посадить…
Сыпался мусор, а теперь даже порт открыть не могу, не говоря о перепрошивке! Уверяет, что port is busy… Похоже, проще новый 8266 купить, чем этот оживить.
Есть еще какие варианты?

Victor


  • #12

Не надо новый модуль покупать.
Просто порт занят терминальной программой — выйдите из нее, а если уже вышли, то перезагрузите комп

  • #13

Виктор,
спасибо большущее! Действительно, терминалка повесилась, и перезагрузка компа решила проблему. Все прекрасно прошилось ESP8266-flasher-ом. Карта живет, цепляется к раутеру, жизнь налаживается!:)

  • #14

Не надо новый модуль покупать.
Просто порт занят терминальной программой — выйдите из нее, а если уже вышли, то перезагрузите комп

Добрый день
У меня esp8266 — 07
При создании сервера передатчик отказался его создавать
Решил обновить из облака
Прошивка оказалась не официальная
Теперь передатчик сутками шлет по UART цифры
Попытался обновить прошивку через XTCOM — бесполезно
http://www.instructables.com/file/FESNEMYI7IJB2XF
По этой картинке пропаял все ноги — 0 реакции
Помогите Может еще чет надо

JustACat


  • #15

RomReed,
1) уточните, что не работает с XTCOM,
2) попробуйте прошить через Flash Download Tool http://bbs.espressif.com/viewtopic.php?f=5&t=433
3) по картинке если все припаяно напрямую (без резисторов, кондеров), то это тоже может быть причиной…
Ноги лучше подтягивать резисторами правильного номинала. ESP, штука капризная.
Еще иногда с XTCOM помогает Reset ESP дернуть в момент, когда в XTCOM счетчик бежит.

  • #16

RomReed,
1) уточните, что не работает с XTCOM,
2) попробуйте прошить через Flash Download Tool http://bbs.espressif.com/viewtopic.php?f=5&t=433
3) по картинке если все припаяно напрямую (без резисторов, кондеров), то это тоже может быть причиной…
Ноги лучше подтягивать резисторами правильного номинала. ESP, штука капризная.
Еще иногда с XTCOM помогает Reset ESP дернуть в момент, когда в XTCOM счетчик бежит.

Вот как раз счетчик доходит до конца и пишет error
Reset ESP дернул в момент, когда в XTCOM счетчик бежит помогло.Ответила ок. Но при прошивке все равно кидает еррор https://vk.com/romreed?z=photo52248258_367456349/photos52248258
решил ногу ресета впаять. Не помогло

Последнее редактирование: 15 Май 2015

  • #17

Flash Download Tool пробовал шить. Не помогает.

Victor


  • #18

Flash Download Tool пробовал шить. Не помогает.

Flash Download Tool логи показывает — посмотрите там COM порт не отваливается?
Как с питанием у вас?

JustACat


  • #19

RomReed, если вы хотите, чтобы вам помогли:
1) перестаньте нарушать сразу сходу правила форума — уважайте других (это относится к оверквотингу и заливке картинок черти-куда)
2) поймите, что тут нет экстрасенсов — расписывайте все подробнее. Описание «пробовал — не помогает» — это нифига не описание. Уж без обид.

  • #20

Flash Download Tool логи показывает — посмотрите там COM порт не отваливается?
Как с питанием у вас?

Exception in thread Thread-12:
Traceback (most recent call last):
Flash Download Tool
File «threading.pyo», line 810, in __bootstrap_inner
File «esp8266_flasher.py», line 19, in run
File «downloader.pyo», line 54, in __init__
File «serialserialwin32.pyo», line 38, in __init__
File «serialserialutil.pyo», line 282, in __init__
File «serialserialwin32.pyo», line 66, in open
SerialException: could not open port ‘COM10’: WindowsError(5, ‘xcexf2xeaxe0xe7xe0xedxee xe2 xe4xeexf1xf2xf3xefxe5.’)

Дмитрий DarkByte Москин

Возвращаем к жизни esp8266 после неудачного обновления

Заказав на пробу несколько различных модификаций отладочной платы esp8266 столкнулся с невозможностью обновить прошивку на одной из модификаций. Модификация ESP8266 под кодом ESP-05 имеет разведённые выводы VCC TX RX GND RST (на некоторых платах RST не выведен). Но для перехода в режим программирования через UART требуется замкнуть GPIO0 на землю, а на данной плате он уже замкнут на VCC, да ещё и таким образом, что для обрезания дорожки и установки на место разрыва переключателя требуется микроскоп, скальпель и нормальный паяльник.

Сам ESP8266 программируемой памяти не имеет (а возможно и имеет, но мы не умеем ей пользоваться), поэтому используется внешняя flash память на 512кб. По умолчанию в неё залита тестовая прошивка, которая принимает AT команды через UART на скорости 9600 бод. Возможностей этой прошивки вполне достаточно для того, чтобы подключить модуль к внешнему микроконтроллеру и общаться со внешним миром через WiFi. Но в большинстве задач, типа умного дома, вполне достаточно тех возможностей, что предоставляет МК ESP8266, но для этого нужно научиться заливать в него свой код.

Стандартная AT прошивка не отличается, ни функционалом, ни стабильностью. Но есть у неё одна интересная команда AT+CIUPDATE, которая должна загрузить из интернета новую версию прошивки и записать её во flash. Но что-то пошло не так, и все пять имеющихся у меня модулей модификации ESP-05 превратились в кирпичи. В момент прошивки модули питались стабильными 3.3В при максимальном токе 1А. После неудачного обновления модуль переходил на скорость 74880 бод и бесконечно падал в Fatal exception при попытке загрузиться.

Данную проблему можно решить двумя путями. Простой путь заключается в переводе чипа esp8266 в режим программирования замыкании GPIO0 на GND и подключении его через usb-ttl переходник к компьютеру с установленной утилитой XTCOM_UTIL или аналогами. В моём случае было до невозможности трудно отцепить GPIO0 от VCC, поэтому я выбрал второй путь: отпаять флеш память от платы и запрограммировать её с использованием внешнего программатора, в моём случае, дешёвого китайского комбайна CH341A.

В качестве новой прошивки решил выбрать frankenstein, в основном из-за наличия у него возможности обновлять прошивку по tftp. При правильном подходе эта возможность позволит больше не возиться с паяльником для обновления прошивки. Последнюю версию прошивки брал из github, antares.rom заливал начиная с нулевого адреса, предварительно очистив содержимое флешки. После возвращения флешки на место, МК ожил.

Базовый функционал прошивки frankenstein предоставляет следующие возможности:

Источник

Firmware update error code 5 esp8266

Описание конструктора прошивки для wifi модуля ESP32(он же ESP32S). Прошивка основана на SDK RTOS(esp-idf) производителя чипа.

Поддержка модулей ESP32S, ESP32S2, ESP32C3, ESP32S3.

Тестовая поддержка ESP32S3. Могут быть ошибки компиляции.

Распиновка одного из распространенных модулей на базе ESP32:

Не проверенные опции:

ADC KEY, TSL2561, DS1621, Email check (не проверено без SSL), RFID замок(не проверен SPI), АЦП PCF8591, MPR121, UART bridge, VirtualWire 433/315, iButton

Просьба сообщить через обратную связь, работают ли у Вас указанные выше опции.

Опции, имеющие проблемы или недоделки:

IR передатчик (доступен только NEC и RAW протоколы)

IR приемник (принимает только NEC)

Прошивка модуля

Для начала соберем прошивку в конструкторе с необходимыми Вам функциями. Рекомендуется включать опции NVS настройки 2 и Экспорт/Импорт настроек.

Автоматическая прошивка модуля с загрузкой всех необходимых файлов можно произвести через WiFi-Iot Flasher (документация и ссылка на софт)

Прошивка через сторонние флешеры:

Прошивка через Flash_download_tools . Настройка DoNotChgBIn должна быть выключена.

Перед первой прошивкой в некоторых случаях, когда модуль не стартует из-за мусора в памяти требуется прошить пустой файл. Или воспользоваться опцией ERASE в настройках Flash tools.

Одним файлом — можно скачать и прошить только один этот файл по адресу 0x0000.

Или прошить 3 файла по указанным адресам:

0x1000 — загрузчик прошивки (bootloader), адрес для ESP32, ESP32S2. Для ESP32C3 и ESP32S3 — 0x0000 адрес;

0x8000 — таблица разметки разделов. Определяет размер секций и наличие SPIFFS диска;

0x10000 — сама прошивка. Только этот файл изменяется при компиляции новой прошивки.

Обратите внимание на размер flash памяти, обычно в модулях установлена память на 4 или 16 мегабайт. В прошивающей программе необходимо указать этот размер в мегабитах ! Установленный размер памяти в мегабитах видно в программе Flash download tools в окне Detected info.

Важно ! Если в модуле 4 мегабайта памяти, то при прошивке через программатор файл прошивки(адрес 0x10000) должен быть не больше 1.6 мегабайта !

Необходимо указать режим работы flash памяти DIO. В режиме QIO модули не работают, bootloader собран в режиме DIO.

Для загрузки прошивки необходимо GPIO 0 подтянуть к GND и нажать reset.

Готовые платы с USB-UART обычно автоматически запускаются в режиме прошивки, но иногда при проблемах требуется так же замыкать GPIO 0. Иногда для этого отдельно выведена кнопка BOOT.

Особенности прошивки ESP32S2 mini

Два варианта прошивки:

1. Через USB используя прошивку dfu_esp32s2.bin . Требуется установка драйвера через программу https://zadig.akeo.ie/ . Прошить через онлайн прошиватор https://dfu.stetelthings.com/.

2. UART0 не выведен . Шьем через UART1(GPIO17-U1TXD, GPIO18-U1RXD ) через внешний USB-UART. Прошивка через esptools требуется ключ —no-stub.

В обеих случая для запуска режима прошивки требуется зажать кнопку «0» сбросив чип по питанию или нажав кнопку RST.

Ошибки запуска модуля

esp_image: Image length 1116272 doesn’t fit in partition length 1048576 — Сообщение о том, что размер файла прошивки больше секции, в данном случае 1 мегабайта( 1048576 байт) . Необходимо пересобрать прошивку меньшего размера. Ошибка возникает, если не читать предыдущий абзац.

boot: Failed to verify partition table — Ошибка таблицы разделов, возникает, если в модуле находится мусор от предыдущей прошивки. Требуется очистка модуля бланком.

Brownout detector was triggered — нехватка питания, срабатывает защита. Помогает установка электролита или замена кабеля(если он тонкий китайский)

Ошибки обновления по OTA

Если на главной ошибка:

Firmware update ERROR ! (code 3) — это значит не собрана прошивка, например из-за ошибки компиляции.

Firmware update ERROR ! (code 2) — превышен размер файла прошивки. Изучайте вариант переразметки памяти.

Firmware update ERROR ! (code 1) — у модуля нет доступа к Интернету или к серверу wifi-iot.com. Плохой интернет.

Не забываем, что в UART можно посмотреть более точную причину и состояние обновления.

Ошибки во время работы модуля

***ERROR*** A stack overflow in task vsens has been detected -ошибка переполнения стека задачи (в данном случае vsens). Произошла ситуация, когда задаче потребовалось больше ресурсов, чем выделено.

Ecли подобные ошибки появляются в UART , то необходимо сообщить в обратную связь для устранения проблемы.

Запуск модуля.

Первоначальная настройка требует запустить режим Safe mode. В эфире должна появится точка доступа WiFi-IoT. При пустых настройках точки доступа Safe mode включается автоматически.

Safe mode можно запустить замыканием GPIO 18 и 19 и перезапуском модуля. Если данные GPIO заняты и установка перемычки невозможна, то можно воспользоваться опцией Safe GPIO.

После подключения к точке доступа необходимо зайти через браузер по адресу 192.168.4.1 и настроить там параметры доступа к своему роутеру.

Прошивка через OTA или через веб интерфейс.

Прошивка поддерживает OTA — это обновление прошивки напрямую из конструктора на вкладке Firmware_update. В Free режиме будет загружена прошивка по умолчанию, в PRO будет загружаться прошивка из Вашего личного кабинета.

С 29.11.17 в модуле доступно обновление прошивки с локального компьютера, прошивку можно загрузить на этой же вкладке обновления по OTA. Опция доступна только в PRO режиме !

Структура разметки памяти:

При запуске модуля в UART выдается информация о разметке модуля.

Пример для 4 мегабайт flash с секциями по 1 мегабайту(старая разметка):

Пример для 4 мегабайт flash с секциями по 1.6 мегабайт и SPIFFS 512кб (новая разметка):

Переразметка flash памяти(актуально для прошивки до 9.05.20)

Если модуль с нуля прошит после 9.05.20, то эта команда не требуется .

Переразметка позволяет увеличить максимальный размер секции OTA с 1024 кб до 1348 кб.

Запускается командой http://[ip адрес]/patchpartions , Необходимо чтобы была загружена OTA partion 1 (смотрим на вкладке debug) , обновитесь по ОТА, чтобы была нужная секция. Естественно, что нужно пытаться обновлять прошивку, чтобы она укладывалась в 1 мегабайт.

Откат загруженной прошивки

С помощью команды http://[ip адрес]/configpartion?st=x можно переключится на предыдущую прошивку, где x- это номер партиции, на которую нужно переключится (1 или 2). Текущую партицию можно посмотреть в debug.

Режим PRO

Режим PRO дает возможность использовать модуль в полную силу. Активация модуля происходит на вкладке лицензий личного кабинета.

Работа с UART устройствами

Чип ESP32 имеет 3 UART (0,1,2), ESP32S2 и ESP32C3 — 2 UART(0 и 1). На данный момент UART 0 занят под debug, при его выборе в опциях отладка отключается — рекомендуется переназначать его на другие GPIO.

У каждой UART опции в дополнительных настройках необходимо указать номер UART, который не должен пересекаться с другими UART устройствами. Требуется так же указать GPIO выводы, они никак не привязаны к номеру UART и могут быть назначены любые свободные в указанном диапазоне.

Некоторые опции экперементально поддерживают программный UART выбрав номера UART 3 или 4.

Сравнительная таблица чипов

Чип Аппаратный
ethernet
Bluetooth Количество
UART
Количество
GPIO
Количество
АЦП
Аппаратный
ШИМ
USB ОЗУ*
ESP8266 нет нет 1 + 1 только TX 16 1 нет нет 40 (RTOS)
ESP32 да да 3 40 8 да нет 245
ESP32S2 нет нет 2 47 8 да да 110
ESP32C3 нет да 2 22 5 да нет** 180
ESP32S3 нет да 3 47 8 да да 245
ESP32C2 нет да 2 21 5 да нет** ?

* — примерное свободное ОЗУ на «пустой» прошивке.

** — USB только для отладки и прошивки.

Отладочная информация на UART порте

Через UART0 на скорости 115200 выводится отладочная информация модуля. Здесь видно все ошибки. При проблемах работы прошивки просьба сообщать эту информацию разработчику.

Для вывода данных подходит приложение Putty в режиме uart монитора.

Распиновка выводов чипа ESP32

Тут не отображены GPIO 6-11 , использующиеся под SPI Flash память.

GPIO 20, 24, 28, 29 ,30, 31 не выведены на модулях и нигде не фигурируют в документации(?) 37 и 38 так же часто не доступны на модулях.

ADC2_CHx не доступны в SDK на данный момент из-за конфликта с WI-FI. С учетом отсутствия GPIO 37 и 38 доступны всего 6 ADC.

GPIO 34 -39 доступны только на вход, на выход сконфигурировать вывод невозможно. Назначить выводы для I2C так же не получится.

Системные GPIO, которые мешают штатному запуску модуля, должно быть: GPIO0 — 1, GPIO12 -1(3.3в) 0(1.8в) в зависимости от модели spi флеш памяти.

Для прошивки требуется чтобы GPIO2 и GPIO0 были на GND. Обычно схема у готовых плат это делает автоматически

При некорректном режиме включения системных GPIO в UART отладке будет другое отличное от сообщение SPI_FAST_FLASH_BOOT (это нормальный режим загрузки с SPI FLASH)

Источник

HTTP_UPDATE_FAILD Error (-5): HTTP error: connection lost #6256

Comments

akhtarusafzai commented Jul 4, 2019

Hello All,
I am trying to update my firmware for NodeMCU through OTA. I am using the basic HTTP_UPDATE example code given in arduino. The Bin File is placed on Github and trying to download that and upload it to the board.

Platform

  • Hardware: [NodeMCU Amica]
  • Core Version: [latest git hash or date]
  • Development Env: [Arduino IDE]
  • Operating System: [Windows]

Settings in IDE

  • Module: [Generic ESP8266 Module]
  • Flash Mode: [DOUT Compatible]
  • Flash Size: [4MB/1MB]
  • lwip Variant: [v1.4|v2 Lower Memory|Higher Bandwidth]
  • Reset Method: [ck]
  • Flash Frequency: [40Mhz]
  • CPU Frequency: [80Mhz|160MHz]
  • Upload Using: [OTA|SERIAL]
  • Upload Speed: [115200|other] (serial upload only)

#define USE_SERIAL Serial

#ifndef APSSID
#define APSSID «Akhtar»
#define APPSK «akhtar1234»
#endif

USE_SERIAL.println();
USE_SERIAL.println();
USE_SERIAL.println();

for (uint8_t t = 4; t > 0; t—) <
USE_SERIAL.printf(«[SETUP] WAIT %d. n», t);
USE_SERIAL.flush();
delay(1000);
>

WiFi.mode(WIFI_STA);
WiFiMulti.addAP(APSSID, APPSK);

void loop() <
// wait for WiFi connection
if ((WiFiMulti.run() == WL_CONNECTED)) <

Debug Messages

The text was updated successfully, but these errors were encountered:

devyte commented Jul 5, 2019

The basic example clearly shows an http url, while github requires https, i. e. secure. Therefore that example won’t work in your case. You have to use a WiFiClientSecure client, and set it up correctly before passing it as arg to the updater.
Closing due to user error.

Jhony9625 commented Jul 15, 2019

Hi, I’m using the same example of httpUpdate and I get wrong http code the server link is this: http://qualitysystems.com.co/Blink.bin

I searched the internet and found this 2016 post #2022 I tried what it says but it did not work for me. I do not know what else to do to solve this problem.

JiriBilek commented Jul 15, 2019

@Jhony9625: I assume the error is reported in file ESP8266httpUpdate.cpp , line 419 or nearby.
If so, edit the file, add debugging printouts to find out what’s going on. You can also turn on debugging messages in Arduino IDE (debug level HTTP_UPDATE), maybe it helps. Otherwise you have to understand the httpUpdate code and find out the problem yourself.

akhtarusafzai commented Jul 17, 2019

@Jhony9625 I have resolved the issue. I was passing a https address to http_update method. it won’t work without ssl certificates fingerprint. Try to give it local server address running on your pc. like http://192.168.0.12/Blink.bin

Jhony9625 commented Jul 17, 2019 •

I was able to solve it, I leave the link they gave me the solution. Thank you all

Источник

Конструктор прошивки ESP32/ESP32C3/ESP32S2/ESP32S3
(обновлено: 26 Jan 2023, 21:30:57)

Описание конструктора прошивки для wifi модуля ESP32(он же ESP32S). Прошивка основана на SDK RTOS(esp-idf) производителя чипа.

Поддержка модулей ESP32S, ESP32S2, ESP32C3, ESP32S3.

Тестовая поддержка ESP32S3. Могут быть ошибки компиляции.

Распиновка одного из распространенных модулей на базе ESP32:

Не проверенные опции:

ADC KEY, TSL2561, DS1621, Email check (не проверено без SSL), RFID замок(не проверен SPI), АЦП PCF8591, MPR121, UART bridge, VirtualWire 433/315, iButton

Просьба сообщить через обратную связь, работают ли у Вас указанные выше опции.

Опции, имеющие проблемы или недоделки:

IR передатчик (доступен только NEC и RAW протоколы)

IR приемник (принимает только NEC)

Прошивка модуля

Для начала соберем прошивку в конструкторе с необходимыми Вам функциями. Рекомендуется включать опции NVS настройки 2 и Экспорт/Импорт настроек.

Автоматическая прошивка модуля с загрузкой всех необходимых файлов можно произвести через WiFi-Iot Flasher (документация и ссылка на софт)

Прошивка через сторонние флешеры:

Прошивка через Flash_download_tools . Настройка DoNotChgBIn должна быть выключена.

Перед первой прошивкой в некоторых случаях, когда модуль не стартует из-за мусора в памяти требуется прошить пустой файл. Или воспользоваться опцией ERASE в настройках Flash tools.

Одним файлом — можно скачать и прошить только один этот файл по адресу 0x0000.

Или прошить 3 файла по указанным адресам:

0x1000 — загрузчик прошивки (bootloader), адрес для ESP32, ESP32S2. Для ESP32C3 и ESP32S3 — 0x0000 адрес;

0x8000 — таблица разметки разделов. Определяет размер секций и наличие SPIFFS  диска;

0x10000 — сама прошивка. Только этот файл изменяется при компиляции новой прошивки.

Обратите внимание на размер flash памяти, обычно в модулях установлена память на 4 или 16 мегабайт. В прошивающей программе необходимо указать этот размер в мегабитах ! Установленный размер памяти в мегабитах видно в программе Flash download tools в окне Detected info.

Важно ! Если в модуле 4 мегабайта памяти, то  при прошивке через программатор файл прошивки(адрес 0x10000) должен быть не больше 1.6 мегабайта  !

Необходимо указать режим работы flash памяти DIO. В режиме QIO модули не работают, bootloader собран в режиме DIO.

Для загрузки прошивки необходимо GPIO 0 подтянуть к GND и нажать reset.

Готовые платы с USB-UART обычно автоматически запускаются в режиме прошивки, но иногда при проблемах требуется так же замыкать GPIO 0. Иногда для этого отдельно выведена кнопка BOOT.

Особенности прошивки ESP32S2 mini

Три варианта прошивки:

1. Прошить через  flash_download_tool_3.9.3 — она поддерживает ESP32S2. При подключении через USB нужно выключить no-stub установив в конфиге no-stub = True 

2. Через USB используя прошивку dfu_esp32s2.bin . Требуется установка драйвера через программу https://zadig.akeo.ie/ . Прошить через онлайн прошиватор https://dfu.stetelthings.com/. 

3. UART0 не выведен . Шьем через UART1(GPIO17-U1TXD, GPIO18-U1RXD ) через внешний USB-UART. Прошивка через esptools требуется ключ —no-stub.

В обеих случая для запуска режима прошивки требуется зажать кнопку «0» сбросив чип по питанию или нажав кнопку RST.

Ошибки запуска модуля

esp_image: Image length 1116272 doesn’t fit in partition length 1048576 — Сообщение о том, что размер файла прошивки больше секции, в данном случае 1 мегабайта(1048576 байт). Необходимо пересобрать прошивку меньшего размера. Ошибка возникает, если не читать предыдущий абзац.

boot: Failed to verify partition table — Ошибка таблицы разделов, возникает, если в модуле находится мусор от предыдущей прошивки. Требуется очистка модуля бланком.

Brownout detector was triggered — нехватка питания, срабатывает защита. Помогает установка электролита или замена кабеля(если он тонкий китайский)

Ошибки обновления по OTA

Если на главной ошибка:

Firmware update ERROR ! (code 3) — это значит не собрана прошивка, например из-за ошибки компиляции.

Firmware update ERROR ! (code 2) — превышен размер файла прошивки. Изучайте вариант переразметки памяти.

Firmware update ERROR ! (code 1) — у модуля нет доступа к Интернету или к серверу wifi-iot.com. Плохой интернет.

Не забываем, что в UART можно посмотреть более точную причину и состояние обновления.

Ошибки во время работы модуля

***ERROR*** A stack overflow in task vsens has been detected -ошибка переполнения стека задачи (в данном случае vsens). Произошла ситуация, когда задаче потребовалось больше ресурсов, чем выделено.

Ecли подобные ошибки появляются в UART , то необходимо сообщить в обратную связь для устранения проблемы.

Запуск модуля.

Первоначальная настройка требует запустить режим Safe mode. В эфире должна появится точка доступа WiFi-IoT. При пустых настройках точки доступа Safe mode включается автоматически.

Safe mode можно запустить замыканием GPIO 18 и 19 и перезапуском модуля. Если данные GPIO заняты и установка перемычки невозможна, то можно воспользоваться опцией Safe GPIO.

После подключения к точке доступа необходимо зайти через браузер по адресу 192.168.4.1 и настроить там параметры доступа к своему роутеру.

Прошивка через OTA или через веб интерфейс.

Прошивка поддерживает OTA — это обновление прошивки напрямую из конструктора на вкладке Firmware_update. В Free режиме будет загружена прошивка по умолчанию, в PRO будет загружаться прошивка из Вашего личного кабинета.

С 29.11.17 в модуле доступно обновление прошивки с локального компьютера, прошивку можно загрузить на этой же вкладке обновления по OTA. Опция доступна только в PRO режиме !

Структура разметки памяти:

При запуске модуля в UART выдается информация о разметке модуля.

Пример для 4 мегабайт flash с секциями по 1 мегабайту(старая разметка):

I (113) boot: ## Label            Usage           Type ST Offset   Length
I (135) boot:  0 nvs              WiFi data       01 02 00009000 00004000
I (159) boot:  1 otadata         OTA data        01 00 0000d000 00002000
I (182) boot:  2 phy_init         RF data          01 01 0000f000 00001000
I (205) boot:  3 factory          factory app      00 00 00010000 00100000
I (228) boot:  4 ota_0            OTA app          00 10 00110000 00100000
I (251) boot:  5 ota_1            OTA app          00 11 00210000 00100000

Пример для 4 мегабайт flash с секциями по 1.6 мегабайт и SPIFFS 512кб (новая разметка):

I (54) boot: Partition Table:
I (58) boot: ## Label            Usage          Type ST Offset   Length
I (65) boot:  0 nvs              WiFi data        01 02 00009000 00004000
I (73) boot:  1 otadata          OTA data         01 00 0000d000 00002000
I (80) boot:  2 phy_init         RF data          01 01 0000f000 00001000
I (88) boot:  3 ota_0            OTA app          00 10 00010000 00191000
I (95) boot:  4 ota_1            OTA app          00 11 001b0000 00191000
I (98) boot:  5 storage          Unknown data     01 82 00341000 00080000

Разметка модуля имеет несколько секций, в том числе настройки OTA(otadata), настройки wif(nvs) и калибровки wifi(phy_init)

Секция factory содержит прошивку, которую обычно нужно зашить при первом использовании модуля, а уже при использовании OTA эта секция не используется.

ota_0 и ota_1 содержат прошивки, которые чередуются при обновлении OTA. По этой причине, если уже использовалось OTA ,а нужно зашить прошивку по кабелю,то требуется уже прошивать секцию OTA, которая грузится в данный момент. Это видно далее в логах UART в виде строки I (305) boot: Loading app partition at offset 00110000

Столбец Offset содержит начальный адрес секции, а Length её длину, этот параметр ограничивает максимальный размер прошивки, которую можно залить в модуль. Адрес секции ota_1, а так же длина обеих секций ota изменятся, если сделать переразметку flash памяти.

Данная таблица разметки находится по адресу flash памяти 0x8000
Конструктор прошивки выдает по умолчанию файл разметки для flash 4 мегабайт. С 9.05.20 секции по 1600кб. SPIFFS 512кб.

Файл таблицы для 16 мегабайт можно скачать тут. Секции по 2 мегабайта.

Переразметка flash памяти(актуально для прошивки до 9.05.20)

Если модуль с нуля прошит после 9.05.20, то эта команда не требуется !!!

Переразметка позволяет увеличить максимальный размер секции OTA с 1024 кб до 1348 кб.

Запускается командой http://[ip адрес]/patchpartions , Необходимо чтобы была загружена OTA partion 1 (смотрим на вкладке debug) , обновитесь по ОТА, чтобы была нужная секция. Естественно, что нужно пытаться обновлять прошивку, чтобы она укладывалась в 1 мегабайт.

Откат загруженной прошивки

С помощью команды http://[ip адрес]/configpartion?st=x можно переключится на предыдущую прошивку, где x- это номер партиции, на которую нужно переключится (1 или 2). Текущую партицию можно посмотреть в debug.

Режим PRO

Режим PRO дает возможность использовать модуль в полную силу. Активация модуля происходит на вкладке лицензий личного кабинета.

Работа с UART устройствами

Чип ESP32 имеет 3 UART (0,1,2), ESP32S2 и ESP32C3 — 2 UART(0 и 1). На данный момент UART 0 занят под debug, при его выборе в опциях отладка отключается — рекомендуется переназначать его на другие GPIO. 

У каждой UART опции в дополнительных настройках необходимо указать номер UART, который не должен пересекаться с другими UART устройствами. Требуется так же указать GPIO выводы, они никак не привязаны к номеру UART и могут быть назначены любые свободные в указанном диапазоне.

Некоторые опции экперементально поддерживают программный UART выбрав номера UART 3 или 4.

Сравнительная таблица чипов

Чип Аппаратный
ethernet
Bluetooth Количество
UART
Количество
 GPIO
Количество
АЦП
Аппаратный
ШИМ
USB ОЗУ*
ESP8266 нет нет 1 + 1 только TX 16 1 нет нет 40 (RTOS)
ESP32 да да 3 40 8 да нет 245
ESP32S2 нет нет 2 47 8 да да 110
ESP32C3 нет да 2 22 5 да нет** 180
ESP32S3 нет да 3 47 8 да да 260
ESP32C2 нет да 2 21 5 да нет** ?

* — примерное свободное ОЗУ на «пустой» прошивке.

** — USB только для отладки и прошивки.

Отладочная информация на UART порте

Через UART0 на скорости 115200 выводится отладочная информация модуля. Здесь видно все ошибки. При проблемах работы прошивки просьба сообщать эту информацию разработчику.

Для вывода данных подходит приложение Putty в режиме uart монитора.

Распиновка выводов чипа ESP32

Тут не отображены GPIO 6-11 , использующиеся под SPI Flash память.

GPIO  20, 24, 28, 29 ,30, 31  не выведены на модулях и нигде не фигурируют в документации(?) 37 и 38 так же часто не доступны на модулях.

ADC2_CHx не доступны в SDK на данный момент из-за конфликта с WI-FI. С учетом отсутствия GPIO 37 и 38 доступны всего 6 ADC.

GPIO 34 -39 доступны только на вход, на выход сконфигурировать вывод невозможно. Назначить выводы для I2C так же не получится.

Системные GPIO, которые мешают штатному запуску модуля, должно быть: GPIO0 — 1, GPIO12 -1(3.3в) 0(1.8в) в зависимости от модели spi флеш памяти.

Для прошивки  требуется чтобы GPIO2 и GPIO0 были на GND. Обычно схема у готовых плат это делает автоматически

При некорректном режиме включения системных GPIO в UART отладке будет другое отличное от сообщение SPI_FAST_FLASH_BOOT (это нормальный режим загрузки с SPI FLASH)

Вывод модуля Имя Pin Описание
1 GND Земля
2 EN Разрешить работу чипа
3 SVP SENSOR_VP, GPIO36, ADC1_CH0, RTC_GPIO0
4 SVN SENSOR_VN, GPIO39, ADC1_CH3, RTC_GPIO3
5 IO34 GPIO34, ADC1_CH6, RTC_GPIO4
6 IO35 GPIO35, ADC1_CH7, RTC_GPIO5
7 IO32 GPIO32, 32K_XP (кварц 32,768 кГц), ADC1_CH4, TOUCH9, RTC_GPIO9
8 IO33 GPIO33, 32K_XN (кварц 32,768 кГц), ADC1_CH5, TOUCH8, RTC_GPIO8
9 IO25 GPIO25, DAC_1, ADC2_CH8, RTC_GPIO6
10 IO26 GPIO26, DAC_2, ADC2_CH9, RTC_GPIO7
11 IO27 GPIO27, ADC2_CH7, TOUCH7, RTC_GPIO17
12 IO14 GPIO14, ADC2_CH6, TOUCH6, RTC_GPIO16, MTMS, HSPICLK
13 IO12 GPIO12, ADC2_CH5, TOUCH5, RTC_GPIO15, MTDI, HSPIQ
14 IO13 GPIO13, ADC2_CH4, TOUCH4, RTC_GPIO14, MTCK, HSPID, U0CTS
15 IO15 GPIO15, ADC2_CH3, TOUCH3, RTC_GPIO13, MTDO, HSPICS0, U0RTS
16 GND Земля
17 IO2 GPIO2, ADC2_CH2, TOUCH2, RTC_GPIO12, HSPIWP
18 Io0 GPIO0, ADC2_CH1, TOUCH1, RTC_GPIO11, CLK_OUT1
19 IO4 GPIO4, ADC2_CH0, TOUCH0, RTC_GPIO10, HSPIHD
20 IO16 GPIO16, HS1_DATA4
21 3V3 3.3V
22 IO17 GPIO17, HS1_DATA5
23 IO5 GPIO5, VSPICS0, HS1_DATA6
24 IO18 GPIO18, VSPICLK, HS1_DATA7
25 IO23 GPIO23
26 IO19 GPIO19, VSPIQ, HS2_DATA2
27 IO22 GPIO22, VSPIWP, HS2_CLK
28 U0RX U0RXD, GPIO3, CLK_OUT2, HS2_DATA0
29 U0TX U0TXD, GPIO1, CLK_OUT3, HS2_DATA1
30 IO21 GPIO21, VSPIHD, HS2_CMD
31 GND Земля

ESP8266 is a low-cost Wi-Fi chip that supports full TCP/IP stack. Till date, numerous types of boards are developed using ESP8266. The developers implement various programming languages to program this chip. You can use very basic level AT commands, low-level C/C++ language, or high-level and users friendly languages like Arduino, Micropython, and NodeMCU. The possibilities are virtually endless. But, ESP8266 sometime shows errors while connected to the serial monitor.

Understanding The Error Messages

The error messages are displayed in predefined codes. Unless you know the code, you can never understand what it says. ESP8266 error messages can be categorized into 3 types – 1) Reset causes, 2) Boot modes, and 3) Fatal Exceptions. Though some can argue that boot mode is not exactly an “error message”, but sometimes it really helps to diagnose a runtime error. Explanation of all the three error messages are below:

1. Reset Causes

Each time ESP8266 reboots, the ROM code will print out a number corresponding to the reset cause. You can verify the cause of the reset based on the number. Use this as a debugging method when you cannot start the user program and need to analyze the cause of the reset. The chart is given below,

Reset Cause No. Description
0 Unidentified
1 Power reboot or normal boot
2 External reset using reset pin or wake up from deep sleep
3 Software reset
4 Hardware watchdog (WDT) reset

Examples:

rst cause: 2   ->  Normal reset using reset peen or woke up from a deep-sleep.
rst cause: 4   ->  Device encountered a hardware WDT reset.

2. Boot Modes

On reboot, ESP8266 prints the boot mode too. The boot mode message helps to find out two important information: pin mode of three GPIO pins and the location of the boot file used. A boot mode message looks like below,

boot mode :  (5,6)

So, the pattern is – boot mode :  (m,n), where represents the state of three GPIO pins – 15, 0, and 2, and represents the location of the boot file used.

The following table shows the GPIO states as per the value of m,

0 -> ( logic LOW) = 0 Volt            1 -> (Logic HIGH) = 3.3 volt
Value of “m” GPIO15 GPIO0 GPIO2 Mode
0 0 0 0 Invalid
1 0 0 1 UART
2 0 1 0 Invalid
3 0 1 1 Flash
4 1 0 0 SDIO
5 1 0 1 SDIO
6 1 1 0 SDIO
7 1 1 1 SDIO

The table below shows different boot modes for different states of the GPIOs.

untitled

FlashMode and BootMode ESP12E

The following table shows the boot modes as per the value of n,

Value of “n” SD_sel != 3 SD_sel == 3
0 Remapping _
1 UART boot _
2 Jump boot _
3 Flash boot _
4 SDIO LowSpeed V2 IO UART1 booting
5 SDIO HighSpeed V1 IO UART1 booting
6 SDIO LowSpeed V1 IO UART1 booting
7 SDIO HighSpeed V2 IO UART1 booting

Example:

boot mode :  (3,6)  ->  GPIO 15 is low, GPIO 0 is high, GPIO 2 high, esp8266 booted from flash memory. SDIO LowSpeed v1 IO, UART1 booting.

3. Fatal Exceptions

When a program crashes, it prints out an error message containing a fatal exception number. You can debug the crash based on the Fatal exception number.

The following table shows common Fatal exceptions and their possible causes.

Fatal Exception No. Details Possible Causes
0 Command is invalid 1. Damaged .BIN binaries
2. Wild pointers
6 Division by zero Division by zero
9 unaligned read/write operation addresses 1. Unaligned read/write cache addresses
2. Wild pointers
28/29 Access to invalid addresses 1. Access to cache after it’s turned off
2. Wild pointers

Example: (As per the documentation of espressif.com. The explanation seemed a bit unclear there)

Fatal exception (28): 
epc1=0x4025bfa6, epc2=0x00000000, epc3=0x00000000, excvaddr=0x0000000f, depc=0x00000000

If user1.1024.new.2.bin is used, verify that the exception address is “0x4025bfa6” in the user1.1024.new.2.S file. If eagle.irom0text.bin is used, verify the cause of the fatal exception in the eagle.S file. If the address of exception cannot be found, it means that the crash occurs during an interrupt, or that there is a code problem in ROM, such as: –

  • 4000e190
  • 4000df48
  • 4000dea8
  • 4000de84
  • 4000e1e0

Conclusion

The above tables and explanations will help you to debug your codes from the error messages. But, there are a few tricks that can be followed to avoid such problems. Making proper wirings is one of them. Even a slightly loose connection can yield tons of errors and is enough to become your nightmare. Even if you are super sure that connections are pretty okay, still check it again. Disconnect all existing wirings and connect them again.

Try to avoid using any breadboard. It seems strange, but there’s a reason. You cannot be sure about the internal connections of the breadboard. Always try to solder wires and external components directly with ESP8266 breakout boards for an error-free result. This simple trick solved many of my problems dramatically.

Another important and clever trick is using a pull-up or a pull-down resistor instead of directly connecting boot selector GPIOs to Vcc or ground. Also, don’t forget to connect a pull-up resistor between reset pin and Vcc. A 10K ohm resistor will work just fine as a pull-up/down resistor.

OTA (Over the Air) update is uploading firmware to an ESP module using a Wi-Fi connection rather than a serial port. Such functionality becomes extremely useful in case of limited or no physical access to the module.

esp8266 self OTA update firmware from server with version check and HTTPS
esp8266 self OTA update firmware from a server with version check and HTTPS

OTA may be done using:

  • Arduino IDE
  • Web Browser
  • HTTP Server

First of all, read the tutorial “esp8266: flash firmware binary (.bin) compiled and signed“.

This article will explain the OTA update with an automatic REST request that starts the download and flash if the firmware if the version is not updated.

Conditionally OTA (version control) update with REST

For a more complex firmware update system, it is necessary to pass the version to be checked.

    t_httpUpdate_return ret = ESPhttpUpdate.update(client, "192.168.1.70", 3000, "/update", FIRMWARE_VERSION);

The code above expects FIRMWARE_VERSION equal to 0.2.

This call transport a set of information in the header of the call, so if we check the received header by the update GET

app.get('/update', (request, response) => {
    console.log("List of headers", request.headers);
});

we can find these values

host = "192.168.1.70:3000"
user-agent = "ESP8266-http-Update"
connection = "close"
x-esp8266-chip-id = "7667217"
x-esp8266-sta-mac = "50:02:91:74:FE:11"
x-esp8266-ap-mac = "52:02:91:74:FE:11"
x-esp8266-free-space = "1716224"
x-esp8266-sketch-size = "380144"
x-esp8266-sketch-md5 = "43bc6ba7925555d32aca7222f731c0d9"
x-esp8266-chip-size = "4194304"
x-esp8266-sdk-version = "2.2.2-dev(38a443e)"
x-esp8266-mode = "sketch"
x-esp8266-version = "0.2"
content-length = "0"

In this case, we check only the, but some information like free space and SDK version can be very useful.

/*
 * Basic Sketch for automatic update of firmware at start
 * with firmware version control
 *
 * Renzo Mischianti <www.mischianti.org>
 *
 * https://www.mischianti.org
*/

#include <Arduino.h>

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

#include <ESP8266HTTPClient.h>
#include <ESP8266httpUpdate.h>

#ifndef APSSID
#define APSSID "<YOUR-SSID>"
#define APPSK  "<YOUR-PASSWD>"
#endif

ESP8266WiFiMulti WiFiMulti;

#define FIRMWARE_VERSION "0.3"

void update_started() {
  Serial.println("CALLBACK:  HTTP update process started");
}

void update_finished() {
  Serial.println("CALLBACK:  HTTP update process finished");
}

void update_progress(int cur, int total) {
  Serial.printf("CALLBACK:  HTTP update process at %d of %d bytes...n", cur, total);
}

void update_error(int err) {
  Serial.printf("CALLBACK:  HTTP update fatal error code %dn", err);
}

void setup() {

  Serial.begin(115200);
//   Serial.setDebugOutput(true);

  Serial.println();
  Serial.println();
  Serial.println();

  for (uint8_t t = 4; t > 0; t--) {
    Serial.printf("[SETUP] WAIT %d...n", t);
    Serial.flush();
    delay(1000);
  }

  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP(APSSID, APPSK);

  Serial.print(F("Firmware version "));
  Serial.println(FIRMWARE_VERSION);
  delay(2000);
}


void loop() {
    // wait for WiFi connection
  if ((WiFiMulti.run() == WL_CONNECTED)) {

    WiFiClient client;

    // The line below is optional. It can be used to blink the LED on the board during flashing
    // The LED will be on during download of one buffer of data from the network. The LED will
    // be off during writing that buffer to flash
    // On a good connection the LED should flash regularly. On a bad connection the LED will be
    // on much longer than it will be off. Other pins than LED_BUILTIN may be used. The second
    // value is used to put the LED on. If the LED is on with HIGH, that value should be passed
    ESPhttpUpdate.setLedPin(LED_BUILTIN, LOW);

    // Add optional callback notifiers
    ESPhttpUpdate.onStart(update_started);
    ESPhttpUpdate.onEnd(update_finished);
    ESPhttpUpdate.onProgress(update_progress);
    ESPhttpUpdate.onError(update_error);

    ESPhttpUpdate.rebootOnUpdate(false); // remove automatic update

    Serial.println(F("Update start now!"));

    // t_httpUpdate_return ret = ESPhttpUpdate.update(client, "http://192.168.1.70:3000/firmware/httpUpdateNew.bin");
    // Or:
    t_httpUpdate_return ret = ESPhttpUpdate.update(client, "192.168.1.70", 3000, "/update", FIRMWARE_VERSION);

    switch (ret) {
      case HTTP_UPDATE_FAILED:
        Serial.printf("HTTP_UPDATE_FAILD Error (%d): %sn", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
        Serial.println(F("Retry in 10secs!"));
        delay(10000); // Wait 10secs
        break;

      case HTTP_UPDATE_NO_UPDATES:
        Serial.println("HTTP_UPDATE_NO_UPDATES");
        Serial.println("Your code is up to date!");
          delay(10000); // Wait 10secs
        break;

      case HTTP_UPDATE_OK:
        Serial.println("HTTP_UPDATE_OK");
        delay(1000); // Wait a second and restart
        ESP.restart();
        break;
    }
  }
}

Update end point with version control

Now let’s add an updated endpoint with version management

const express = require('express');
const { networkInterfaces } = require('os');
const path = require('path');

const app = express();
const nets = networkInterfaces();

// Server port
const PORT = 3000;

app.get('/', (request, response) => response.send('Hello from www.mischianti.org!'));

let downloadCounter = 1;
const LAST_VERSION = 0.3;
app.get('/update', (request, response) => {
    const version = (request.header("x-esp8266-version"))?parseFloat(request.header("x-esp8266-version")):Infinity;

    if (version<LAST_VERSION){
        // If you need an update go here
        response.status(200).download(path.join(__dirname, 'firmware/httpUpdateNew.bin'), 'httpUpdateNew.bin', (err)=>{
            if (err) {
                console.error("Problem on download firmware: ", err)
            }else{
                downloadCounter++;
            }
        });
        console.log('Your file has been downloaded '+downloadCounter+' times!')
    }else{
        response.status(304).send('No update needed!')
    }
});


app.listen(PORT, () => {
    const results = {}; // Or just '{}', an empty object

    for (const name of Object.keys(nets)) {
        for (const net of nets[name]) {
            // Skip over non-IPv4 and internal (i.e. 127.0.0.1) addresses
            if (net.family === 'IPv4' && !net.internal) {
                if (!results[name]) {
                    results[name] = [];
                }
                results[name].push(net.address);
            }
        }
    }

    console.log('Listening on port '+PORT+'n', results)
});

Now we generate a new compiled binary file with version 0.3 and put It on the server

[SETUP] WAIT 4...
[SETUP] WAIT 3...
[SETUP] WAIT 2...
[SETUP] WAIT 1...
Firmware version 0.2
Update start now!
CALLBACK:  HTTP update process started
CALLBACK:  HTTP update process at 0 of 307888 bytes...
CALLBACK:  HTTP update process at 0 of 307888 bytes...
CALLBACK:  HTTP update process at 4096 of 307888 bytes...
CALLBACK:  HTTP update process at 8192 of 307888 bytes...
CALLBACK:  HTTP update process at 12288 of 307888 bytes...
CALLBACK:  HTTP update process at 16384 of 307888 bytes...
CALLBACK:  HTTP update process at 20480 of 307888 bytes...
CALLBACK:  HTTP update process at 24576 of 307888 bytes...
CALLBACK:  HTTP update process at 28672 of 307888 bytes...
CALLBACK:  HTTP update process at 32768 of 307888 bytes...
CALLBACK:  HTTP update process at 36864 of 307888 bytes...
CALLBACK:  HTTP update process at 40960 of 307888 bytes...
CALLBACK:  HTTP update process at 45056 of 307888 bytes...
CALLBACK:  HTTP update process at 49152 of 307888 bytes...
CALLBACK:  HTTP update process at 53248 of 307888 bytes...
CALLBACK:  HTTP update process at 57344 of 307888 bytes...
CALLBACK:  HTTP update process at 61440 of 307888 bytes...
CALLBACK:  HTTP update process at 65536 of 307888 bytes...
CALLBACK:  HTTP update process at 69632 of 307888 bytes...
CALLBACK:  HTTP update process at 73728 of 307888 bytes...
CALLBACK:  HTTP update process at 77824 of 307888 bytes...
CALLBACK:  HTTP update process at 81920 of 307888 bytes...
CALLBACK:  HTTP update process at 86016 of 307888 bytes...
CALLBACK:  HTTP update process at 90112 of 307888 bytes...
CALLBACK:  HTTP update process at 94208 of 307888 bytes...
CALLBACK:  HTTP update process at 98304 of 307888 bytes...
CALLBACK:  HTTP update process at 102400 of 307888 bytes...
CALLBACK:  HTTP update process at 106496 of 307888 bytes...
CALLBACK:  HTTP update process at 110592 of 307888 bytes...
CALLBACK:  HTTP update process at 114688 of 307888 bytes...
CALLBACK:  HTTP update process at 118784 of 307888 bytes...
CALLBACK:  HTTP update process at 122880 of 307888 bytes...
CALLBACK:  HTTP update process at 126976 of 307888 bytes...
CALLBACK:  HTTP update process at 131072 of 307888 bytes...
CALLBACK:  HTTP update process at 135168 of 307888 bytes...
CALLBACK:  HTTP update process at 139264 of 307888 bytes...
CALLBACK:  HTTP update process at 143360 of 307888 bytes...
CALLBACK:  HTTP update process at 147456 of 307888 bytes...
CALLBACK:  HTTP update process at 151552 of 307888 bytes...
CALLBACK:  HTTP update process at 155648 of 307888 bytes...
CALLBACK:  HTTP update process at 159744 of 307888 bytes...
CALLBACK:  HTTP update process at 163840 of 307888 bytes...
CALLBACK:  HTTP update process at 167936 of 307888 bytes...
CALLBACK:  HTTP update process at 172032 of 307888 bytes...
CALLBACK:  HTTP update process at 176128 of 307888 bytes...
CALLBACK:  HTTP update process at 180224 of 307888 bytes...
CALLBACK:  HTTP update process at 184320 of 307888 bytes...
CALLBACK:  HTTP update process at 188416 of 307888 bytes...
CALLBACK:  HTTP update process at 192512 of 307888 bytes...
CALLBACK:  HTTP update process at 196608 of 307888 bytes...
CALLBACK:  HTTP update process at 200704 of 307888 bytes...
CALLBACK:  HTTP update process at 204800 of 307888 bytes...
CALLBACK:  HTTP update process at 208896 of 307888 bytes...
CALLBACK:  HTTP update process at 212992 of 307888 bytes...
CALLBACK:  HTTP update process at 217088 of 307888 bytes...
CALLBACK:  HTTP update process at 221184 of 307888 bytes...
CALLBACK:  HTTP update process at 225280 of 307888 bytes...
CALLBACK:  HTTP update process at 229376 of 307888 bytes...
CALLBACK:  HTTP update process at 233472 of 307888 bytes...
CALLBACK:  HTTP update process at 237568 of 307888 bytes...
CALLBACK:  HTTP update process at 241664 of 307888 bytes...
CALLBACK:  HTTP update process at 245760 of 307888 bytes...
CALLBACK:  HTTP update process at 249856 of 307888 bytes...
CALLBACK:  HTTP update process at 253952 of 307888 bytes...
CALLBACK:  HTTP update process at 258048 of 307888 bytes...
CALLBACK:  HTTP update process at 262144 of 307888 bytes...
CALLBACK:  HTTP update process at 266240 of 307888 bytes...
CALLBACK:  HTTP update process at 270336 of 307888 bytes...
CALLBACK:  HTTP update process at 274432 of 307888 bytes...
CALLBACK:  HTTP update process at 278528 of 307888 bytes...
CALLBACK:  HTTP update process at 282624 of 307888 bytes...
CALLBACK:  HTTP update process at 286720 of 307888 bytes...
CALLBACK:  HTTP update process at 290816 of 307888 bytes...
CALLBACK:  HTTP update process at 294912 of 307888 bytes...
CALLBACK:  HTTP update process at 299008 of 307888 bytes...
CALLBACK:  HTTP update process at 303104 of 307888 bytes...
CALLBACK:  HTTP update process at 307200 of 307888 bytes...
CALLBACK:  HTTP update process at 307888 of 307888 bytes...
CALLBACK:  HTTP update process at 307888 of 307888 bytes...
CALLBACK:  HTTP update process at 307888 of 307888 bytes...
CALLBACK:  HTTP update process finished
HTTP_UPDATE_OK

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 3460, room 16 
tail 4
chksum 0xcc
load 0x3fff20b8, len 40, room 4 
tail 4
chksum 0xc9
csum 0xc9
v0004b2b0
@cp:B0
ld



[SETUP] WAIT 4...
[SETUP] WAIT 3...
[SETUP] WAIT 2...
[SETUP] WAIT 1...
Firmware version 0.3
Update start now!
HTTP_UPDATE_NO_UPDATES
Your code is up to date!

Conditionally FileSystem OTA (version control) update with REST

In the same manner, we can manage filesystem updates. We are going fast now because It’s the same firmware update logic.

Generate FileSystem binary file

To manage the filesystem, we can use the same way, but first, you must read one of the following guides:

WeMos D1 mini (esp8266), integrated SPIFFS Filesystem (deprecated)

WeMos D1 mini (esp8266), integrated LittleFS Filesystem (recommended)

Now we are going to add data directory to the sketch folder, and we create a file version.txt with this content

and use the plugin to upload.

esp8266 LittleFS plugin menu on ArduinoIDE
esp8266 LittleFS plugin menu on ArduinoIDE

In the console, we find the right command to generate this file.

[LittleFS] data    : D:ProjectsArduinosloeber-workspace-OTAArduinoOTAesp8266_basic_fs_http_updatedata
[LittleFS] size    : 2024
[LittleFS] page    : 256
[LittleFS] block   : 8192
/version.txt
[LittleFS] upload  : C:UsersrenzoAppDataLocalTemparduino_build_649994/ArduinoOTAesp8266_fs_http_update.mklittlefs.bin
[LittleFS] address : 0x200000
[LittleFS] reset   : --before default_reset --after hard_reset
[LittleFS] port    : COM17
[LittleFS] speed   : 921600
[LittleFS] python   : C:UsersrenzoAppDataLocalArduino15packagesesp8266toolspython3.7.2-post1python3.exe
[LittleFS] uploader : C:UsersrenzoAppDataLocalArduino15packagesesp8266hardwareesp8266.0.2toolsupload.py

esptool.py v3.0
Serial port COM17
Connecting....
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 68:c6:3a:a6:32:e5
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 2072576 bytes to 2279...
Writing at 0x00200000... (100 %)
Wrote 2072576 bytes (2279 compressed) at 0x00200000 in 0.1 seconds (effective 312864.3 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting via RTS pin...
[LittleFS] data    : D:ProjectsArduinosloeber-workspace-OTAArduinoOTAesp8266_basic_fs_http_updatedata
[LittleFS] size    : 2024
[LittleFS] page    : 256
[LittleFS] block   : 8192
/version.txt
[LittleFS] upload  : C:UsersrenzoAppDataLocalTemparduino_build_649994/ArduinoOTAesp8266_fs_http_update.mklittlefs.bin
[LittleFS] address : 0x200000
[LittleFS] reset   : --before default_reset --after hard_reset
[LittleFS] port    : COM17
[LittleFS] speed   : 921600
[LittleFS] python   : C:UsersrenzoAppDataLocalArduino15packagesesp8266toolspython3.7.2-post1python3.exe
[LittleFS] uploader : C:UsersrenzoAppDataLocalArduino15packagesesp8266hardwareesp8266.0.2toolsupload.py

esptool.py v3.0
Serial port COM17

Now we can grab a lot of information; first, the file

[LittleFS] upload  : C:UsersrenzoAppDataLocalTemparduino_build_649994/ArduinoOTAesp8266_fs_http_update.mklittlefs.bin

Create sketch

Now we are going to modify the sketch already used for firmware.

/*
 * Sketch for update of filesystem with version control
 *
 * Renzo Mischianti <www.mischianti.org>
 *
 * https://www.mischianti.org
*/

#include <Arduino.h>
#include "LittleFS.h"

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

#include <ESP8266HTTPClient.h>
#include <ESP8266httpUpdate.h>

#ifndef APSSID
#define APSSID "<YOUR-SSID>"
#define APPSK  "<YOUR-PASSWD>"
#endif

ESP8266WiFiMulti WiFiMulti;

#define FIRMWARE_VERSION "0.2"
String FILESYSTEM_VERSION = "0.0";

void update_started() {
  Serial.println("CALLBACK:  HTTP update process started");
}

void update_finished() {
  Serial.println("CALLBACK:  HTTP update process finished");
}

void update_progress(int cur, int total) {
  Serial.printf("CALLBACK:  HTTP update process at %d of %d bytes...n", cur, total);
}

void update_error(int err) {
  Serial.printf("CALLBACK:  HTTP update fatal error code %dn", err);
}

void setup() {

  Serial.begin(115200);
//   Serial.setDebugOutput(true);

  Serial.println();
  Serial.println();
  Serial.println();

  for (uint8_t t = 4; t > 0; t--) {
    Serial.printf("[SETUP] WAIT %d...n", t);
    Serial.flush();
    delay(1000);
  }

  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP(APSSID, APPSK);

  Serial.print(F("Firmware version "));
  Serial.println(FIRMWARE_VERSION);

  Serial.print(F("Inizializing FS..."));
  if (LittleFS.begin()){
      Serial.println(F("done."));
  }else{
      Serial.println(F("fail."));
  }

  Serial.print(F("FileSystem version "));
  File versionFile = LittleFS.open(F("/version.txt"), "r");
  if (versionFile) {
	  FILESYSTEM_VERSION = versionFile.readString();
	  versionFile.close();
  }
  Serial.println(FILESYSTEM_VERSION);

  delay(2000);
}


void loop() {
    // wait for WiFi connection
  if ((WiFiMulti.run() == WL_CONNECTED)) {

    WiFiClient client;

    // The line below is optional. It can be used to blink the LED on the board during flashing
    // The LED will be on during download of one buffer of data from the network. The LED will
    // be off during writing that buffer to flash
    // On a good connection the LED should flash regularly. On a bad connection the LED will be
    // on much longer than it will be off. Other pins than LED_BUILTIN may be used. The second
    // value is used to put the LED on. If the LED is on with HIGH, that value should be passed
    ESPhttpUpdate.setLedPin(LED_BUILTIN, LOW);

    // Add optional callback notifiers
    ESPhttpUpdate.onStart(update_started);
    ESPhttpUpdate.onEnd(update_finished);
    ESPhttpUpdate.onProgress(update_progress);
    ESPhttpUpdate.onError(update_error);

    ESPhttpUpdate.rebootOnUpdate(false); // remove automatic update

    Serial.println(F("Update start now!"));

    // t_httpUpdate_return ret = ESPhttpUpdate.update(client, "http://192.168.1.70:3000/firmware/httpUpdateNew.bin");
    // Or:
    t_httpUpdate_return ret = ESPhttpUpdate.updateFS(client, "http://192.168.1.70:3000/updateFS", FILESYSTEM_VERSION);

    switch (ret) {
      case HTTP_UPDATE_FAILED:
        Serial.printf("HTTP_UPDATE_FAILD Error (%d): %sn", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str());
        Serial.println(F("Retry in 10secs!"));
        delay(10000); // Wait 10secs
        break;

      case HTTP_UPDATE_NO_UPDATES:
        Serial.println("HTTP_UPDATE_NO_UPDATES");
        Serial.println("Your code is up to date!");
          delay(10000); // Wait 10secs
        break;

      case HTTP_UPDATE_OK:
        Serial.println("HTTP_UPDATE_OK");
        delay(1000); // Wait a second and restart
        ESP.restart();
        break;
    }
  }
}

I retrieve the version of the filesystem from version.txt file and put It on FILESYSTEM_VERSION variable.

  Serial.print(F("Inizializing FS..."));
  if (LittleFS.begin()){
      Serial.println(F("done."));
  }else{
      Serial.println(F("fail."));
  }

  Serial.print(F("FileSystem version "));
  File versionFile = LittleFS.open(F("/version.txt"), "r");
  if (versionFile) {
	  FILESYSTEM_VERSION = versionFile.readString();
	  versionFile.close();
  }
  Serial.println(FILESYSTEM_VERSION);

Create the endpoint on the server

Now we are going to create a new endpoint /updateFS in GET that checks the filesystem version retrieved from version.txt with the variable LAST_FS_VERSION.

const express = require('express');
const { networkInterfaces } = require('os');
const path = require('path');

const app = express();
const nets = networkInterfaces();

// Server port
const PORT = 3000;

app.get('/', (request, response) => response.send('Hello from www.mischianti.org!'));

let downloadCounter = 1;
const LAST_VERSION = 0.3;
app.get('/update', (request, response) => {
    const version = (request.header("x-esp8266-version"))?parseFloat(request.header("x-esp8266-version")):Infinity;

    if (version<LAST_VERSION){
        // If you need an update go here
        response.status(200).download(path.join(__dirname, 'firmware/httpUpdateNew.bin'), 'httpUpdateNew.bin', (err)=>{
            if (err) {
                console.error("Problem on download firmware: ", err)
            }else{
                downloadCounter++;
            }
        });
        console.log('Your file has been downloaded '+downloadCounter+' times!')
    }else{
        response.status(304).send('No update needed!')
    }
});

let downloadFSCounter = 1;
const LAST_FS_VERSION = 0.3;
app.get('/updateFS', (request, response) => {
    const version = (request.header("x-esp8266-version"))?parseFloat(request.header("x-esp8266-version")):Infinity;

    if (version<LAST_FS_VERSION){
        // If you need an update go here
        response.status(200).download(path.join(__dirname, 'filesystem/httpUpdateNewFS.bin'), 'httpUpdateNewFS.bin', (err)=>{
            if (err) {
                console.error("Problem on download filesystem: ", err)
            }else{
                downloadFSCounter++;
            }
        });
        console.log('Your file FS has been downloaded '+downloadFSCounter+' times!')
    }else{
        response.status(304).send('No FS update needed!')
    }
});

app.listen(PORT, () => {
    const results = {}; // Or just '{}', an empty object

    for (const name of Object.keys(nets)) {
        for (const net of nets[name]) {
            // Skip over non-IPv4 and internal (i.e. 127.0.0.1) addresses
            if (net.family === 'IPv4' && !net.internal) {
                if (!results[name]) {
                    results[name] = [];
                }
                results[name].push(net.address);
            }
        }
    }

    console.log('Listening on port '+PORT+'n', results)
});

Now we are going to modify the file version.txt with version 0.2 then upload to the device

  1. In OTAServer create the folder filesystem,
  2. Change version to 0.3 in version.txt, regenerate without upload, and copy the file ArduinoOTAesp8266_fs_update.mklittlefs.bin to the folder
  3. Rename in httpUpdateNewFS.bin.

The result in serial output becomes like so.

[SETUP] WAIT 4...
[SETUP] WAIT 3...
[SETUP] WAIT 2...
[SETUP] WAIT 1...
Firmware version 0.2
Inizializing FS...done.
FileSystem version 0.2
Update start now!
CALLBACK:  HTTP update process started
CALLBACK:  HTTP update process at 0 of 2072576 bytes...
CALLBACK:  HTTP update process at 0 of 2072576 bytes...
CALLBACK:  HTTP update process at 4096 of 2072576 bytes...
CALLBACK:  HTTP update process at 8192 of 2072576 bytes...
CALLBACK:  HTTP update process at 12288 of 2072576 bytes...
CALLBACK:  HTTP update process at 16384 of 2072576 bytes...
CALLBACK:  HTTP update process at 20480 of 2072576 bytes...
CALLBACK:  HTTP update process at 24576 of 2072576 bytes...

[...]

CALLBACK:  HTTP update process at 2031616 of 2072576 bytes...
CALLBACK:  HTTP update process at 2035712 of 2072576 bytes...
CALLBACK:  HTTP update process at 2039808 of 2072576 bytes...
CALLBACK:  HTTP update process at 2043904 of 2072576 bytes...
CALLBACK:  HTTP update process at 2048000 of 2072576 bytes...
CALLBACK:  HTTP update process at 2052096 of 2072576 bytes...
CALLBACK:  HTTP update process at 2056192 of 2072576 bytes...
CALLBACK:  HTTP update process at 2060288 of 2072576 bytes...
CALLBACK:  HTTP update process at 2064384 of 2072576 bytes...
CALLBACK:  HTTP update process at 2068480 of 2072576 bytes...
CALLBACK:  HTTP update process at 2072576 of 2072576 bytes...
CALLBACK:  HTTP update process at 2072576 of 2072576 bytes...
CALLBACK:  HTTP update process at 2072576 of 2072576 bytes...
CALLBACK:  HTTP update process finished
HTTP_UPDATE_OK

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 3460, room 16 
tail 4
chksum 0xcc
load 0x3fff20b8, len 40, room 4 
tail 4
chksum 0xc9
csum 0xc9
v000650f0
~ld



[SETUP] WAIT 4...
[SETUP] WAIT 3...
[SETUP] WAIT 2...
[SETUP] WAIT 1...
Firmware version 0.2
Inizializing FS...done.
FileSystem version 0.3
Update start now!
HTTP_UPDATE_NO_UPDATES
Your code is up to date!

Thanks

  1. Firmware management
    1. esp8266: flash firmware binary (.bin) compiled and signed
    2. esp8266: flash firmware and filesystem binary (.bin) compiled with GUI tools
  2. OTA update with Arduino IDE
    1. esp8266 OTA update with Arduino IDE: filesystem, signed and password
  3. OTA update with Web Browser
    1. esp8266 OTA update with Web Browser: firmware, filesystem and authentication
    2. esp8266 OTA update with Web Browser: sign the firmware and HTTPS (SSL/TLS)
    3. esp8266 OTA update with Web Browser: custom web interface
  4. Self OTA uptate from HTTP server
    1. esp8266 self OTA update firmware from server
    2. esp8266 self OTA update firmware from server with version check
    3. esp8266 self OTA update in HTTPS (SSL/TLS) with trusted self signed certificate
  5. Non standard Firmware update
    1. esp8266 firmware and filesystem update from SD card
    1. esp8266 firmware and filesystem update with FTP client

Понравилась статья? Поделить с друзьями:
  • Firmware image check failed error code 118
  • Firmware error перевод
  • Firmware download error
  • Flash comparison error
  • Flash cmds error asus