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
-
#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 адресов к себе на комп. Или еще лучше организовал обновление со своего компа и теперь все обновляющиеся будут получать его шпионские прошивки.
-
#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
-
#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?
через какую программу шил?
-
18.7 KB
Просмотры: 9
-
#10
ВНИМАНИЕ!
На картинке выше указано, что вы можете подавать 5V на VCC ESP8266 — на большинстве версий это приведет к выходу ESP8266 из строя!
Подавайте напряжение на VCC не выше 3,6V!
А вот UTXD, URXD на большинстве версий модуля толерантно к 5V TTL. Хотя некоторые источники, включая продавцов модулей и документацию ESP8266EX Datasheet, уверяют что высокие уровни TTL должны быть также не выше 3,6V. Как подключать именно ваш модуль — решаете только вы сами на свой страх и риск.
-
#11
Попробовал обновится из облака, …
а потом посыпался мусор.
Вот-вот, такая же ерунда. Только я при попытке обновления из облака забыл GPIO0 на землю посадить…
Сыпался мусор, а теперь даже порт открыть не могу, не говоря о перепрошивке! Уверяет, что port is busy… Похоже, проще новый 8266 купить, чем этот оживить.
Есть еще какие варианты?
-
#12
Не надо новый модуль покупать.
Просто порт занят терминальной программой — выйдите из нее, а если уже вышли, то перезагрузите комп
-
#13
Виктор,
спасибо большущее! Действительно, терминалка повесилась, и перезагрузка компа решила проблему. Все прекрасно прошилось ESP8266-flasher-ом. Карта живет, цепляется к раутеру, жизнь налаживается!
-
#14
Не надо новый модуль покупать.
Просто порт занят терминальной программой — выйдите из нее, а если уже вышли, то перезагрузите комп
Добрый день
У меня esp8266 — 07
При создании сервера передатчик отказался его создавать
Решил обновить из облака
Прошивка оказалась не официальная
Теперь передатчик сутками шлет по UART цифры
Попытался обновить прошивку через XTCOM — бесполезно
http://www.instructables.com/file/FESNEMYI7IJB2XF
По этой картинке пропаял все ноги — 0 реакции
Помогите Может еще чет надо
-
#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 пробовал шить. Не помогает.
-
#18
Flash Download Tool пробовал шить. Не помогает.
Flash Download Tool логи показывает — посмотрите там COM порт не отваливается?
Как с питанием у вас?
-
#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 m represents the state of three GPIO pins – 15, 0, and 2, and n 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.
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.
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.
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
- In OTAServer create the folder filesystem,
- Change version to
0.3
inversion.txt
, regenerate without upload, and copy the fileArduinoOTAesp8266_fs_update.mklittlefs.bin
to the folder - 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
- Firmware management
- esp8266: flash firmware binary (.bin) compiled and signed
- esp8266: flash firmware and filesystem binary (.bin) compiled with GUI tools
- OTA update with Arduino IDE
- esp8266 OTA update with Arduino IDE: filesystem, signed and password
- OTA update with Web Browser
- esp8266 OTA update with Web Browser: firmware, filesystem and authentication
- esp8266 OTA update with Web Browser: sign the firmware and HTTPS (SSL/TLS)
- esp8266 OTA update with Web Browser: custom web interface
- Self OTA uptate from HTTP server
- esp8266 self OTA update firmware from server
- esp8266 self OTA update firmware from server with version check
- esp8266 self OTA update in HTTPS (SSL/TLS) with trusted self signed certificate
- Non standard Firmware update
- esp8266 firmware and filesystem update from SD card
- esp8266 firmware and filesystem update with FTP client