- Нужна помощь Esp вылетает при попытке подключения к WIFI
- lsm
- nikolz
- gerkimuyda
- Ewanse
- enjoynering
- enjoynering
- gerkimuyda
- enjoynering
- gerkimuyda
- enjoynering
- gerkimuyda
- Esp8266 отключается от wifi
- Причины, из-за которых невозможно зайти на веб интерфейс (модуль не пингуется):
- Решение проблем с зависанием и перезапуском модуля
- Частые причины зависаний и перезапуска:
- Решение проблем с обрывами связи WI-FI
Нужна помощь Esp вылетает при попытке подключения к WIFI
Подключаю esp-8266 к роутеру, по началу все работает. Через несколько дней, esp отключается и уходит в бесконечную перезагрузку. Перезагрузка происходит только во время подключения к wifi. Ошибок в коде нет, код не меняется, если не дать esp подключиться к роутеру, все продолжает работать, не перезагружаясь. Можно перепрошить, но как только вновь вводишь логин-пароль роутера устройство начинает вылетать.
Проблему решает только перезагрузка самого роутера. После перезагрузки роутера esp работает еще пару дней.
Причем с роутер работает как ни в чем не бывало. Ноуты и телефоны конектятся без проблем. Вылетает только esp с mongoose. На других прошивках этого не наблюдал.
Можно ли както получить подробный лог ошибки чтобы отправить разработчикам?
Может быть в какойто момент роутер шлет неправильный пакет который проглатывается всеми устройствами но крашит mongoose?
lsm
Разработчик Smart.js
В UART должен вывалиться лог с крешдампом, его сохраните и сделайте анализ как тут написано:
Mongoose OS Documentation
Когда получите GDB консоль, сделайте там `bt` и пришлите получившийся бек-трейс.
nikolz
Well-known member
Подключаю esp-8266 к роутеру, по началу все работает. Через несколько дней, esp отключается и уходит в бесконечную перезагрузку. Перезагрузка происходит только во время подключения к wifi. Ошибок в коде нет, код не меняется, если не дать esp подключиться к роутеру, все продолжает работать, не перезагружаясь. Можно перепрошить, но как только вновь вводишь логин-пароль роутера устройство начинает вылетать.
Проблему решает только перезагрузка самого роутера. После перезагрузки роутера esp работает еще пару дней.
Причем с роутер работает как ни в чем не бывало. Ноуты и телефоны конектятся без проблем. Вылетает только esp с mongoose. На других прошивках этого не наблюдал.
Можно ли както получить подробный лог ошибки чтобы отправить разработчикам?
Может быть в какойто момент роутер шлет неправильный пакет который проглатывается всеми устройствами но крашит mongoose?
Предположу,
У Вас логическая ошибка в программе.
Два варианта ошибки:
1) При потере соединения Вы пытаетесь установить его снова и тратите на это память, не освобождая ее. В результате наступает нехватка памяти и постоянный кирдык.
2) Есть цикл с ожиданием. В результате бесконечного ожидания срабатывает WD и наступает кирдык опять же.
gerkimuyda
New member
Еще хочу напомнить, что надо следить за переполнением счетчика времени. Стандартный millis() переполняется каждую 72 минуту. И если реализовывать проверку типа
timeout = millis() + 1000;
if( timeout < millis() )
можно неожиданно наткнутся на неправильное исполнение команд и получить глюк.
Чтобы уйти от 32-битности таймера к 64-битному, используют код:
#define MAC_TIMER64BIT_COUNT_ADDR 0x3ff21048 uint64 ICACHE_FLASH_ATTR get_mac_time(void) < union < volatile uint32 dw[2]; uint64 dd; >ux; volatile uint32 * ptr = (volatile uint32 *)MAC_TIMER64BIT_COUNT_ADDR; ux.dw[0] = ptr[0]; ux.dw[1] = ptr[1]; if(ux.dw[1] != ptr[1]) < ux.dw[0] = ptr[0]; ux.dw[1] = ptr[1]; >return ux.dd; >
Не факт, что это ваш случай, но просто напомнило именно подобный глюк. Да и текст пусть будет на форуме, если кто-то столкнется с таймером и будет искать решение.
Ewanse
New member
Спасибо, с логом ошибок от esp придется подождать некоторое время, пока не отвалится снова.
Тут все зависит от роутера)
enjoynering
Well-known member
Еще хочу напомнить, что надо следить за переполнением счетчика времени. Стандартный millis() переполняется каждую 72 минуту.
millis() возвращает uint32_t, а это на минуточку 4249967295 миллисекунд или 4249967.295 секунд или 70832.78825 минут или 1180.54647083 часов или 49.189 дня
enjoynering
Well-known member
gerkimuyda
New member
millis() on ESP8266 has a roll over of 72 minutes. (Based on microsecond tick.)
millis() on Arduino (AVR) has a roll over of 49 days. (Based on millisecond tick.)
the «problem» currently is, that millis() relies on system_get_time() from espressif SDK which is a 32bit Integer and cannot be changed.
Или вы забыли, что тема не в ветке Arduino IDE, и подразумевает функции SDK, а тут другие правила?
Проверяется просто — скомпилируйте и оставьте на 3 часа. Потом сообщите о результатах
И да — 49 дней тоже малопригодно для «не светодиодом помигать»
enjoynering
Well-known member
Простите не посмотрел что это ветка про native SDK.
Но ардуино код построен вокруг native SDK. Значит и там такая же баг/фича с переполнением счетчика millis после 72 минут?
gerkimuyda
New member
Но ардуино код построен вокруг native SDK. Значит и там такая же баг/фича с переполнением счетчика millis после 72 минут?
Нет. Ведь там не микросекунды отдаются, а миллисекунды. И в Arduino IDE все получается именно так, как вы написали выше. Да обойти это ограничение в SDK ведь не сложно (встречал варианты с введением второй переменной, в которую складируют количество переполнений (а ля старший регистр))
А если рассказать про мой случай — то само по себе переполнение не вызывало ошибку. Но неправильная работа (из-за переполнения) приводила к многократному исполнению кода, который нуждался в дополнительной памяти, и освобождал ее он чуть попозже. Вот и получалось, что все работало идеально два часа, а потом резко Exception.
Тут подробно описали про переполнение, ардуину и способы сравнений:
How can I handle the millis() rollover?
enjoynering
Well-known member
Да обойти это ограничение в SDK ведь не сложно (встречал варианты с введением второй переменной, в которую складируют количество переполнений (а ля старший регистр))
угу я так делаю, для подсчета uptime модуля на arduino ide.
uint32_t NTP_Client::getUptime() < uint32_t uptime = 0; bool expectedOverflow = false; uptime = millis() / NTP_MILLISECONDS_IN_SECOND; //convert msec to sec if (uptime >= 4294907UL) //timer is going to overflow in 1 min/60sec < expectedOverflow = true; //set overflow flag >if (expectedOverflow == true && uptime _overflowCounter++; //each overflow = 4,294,967 seconds with costant error +0.295 seconds expectedOverflow = false; //clear overflow flag > uptime = this->_overflowCounter * 4294967UL + uptime; return uptime; >
я почему влез в тему, щас пишу ntp клиента на arduino и модуль постоянно виснет через ~30 минут в районе udp запроса. пямять не утекает — хип постоянен. в лог ничего не валится. голову сломал. а тут вы про 72 минуты. думал вот моя ошибка и начал уточнять. оказывается нет.
gerkimuyda
New member
А зачем его писать, если он есть в SDK готовый? На событие по получению IP адреса (после подключения вайфая) ставите инициализацию.
sntp_stop(); sntp_set_update_delay(1800000); //30 min sntp_setservername(0,"time.windows.net"); sntp_set_timezone(2); //GMT+2 sntp_init();
uint32 time = sntp_get_current_timestamp(); if(time == 0) < time = get_mac_time() / 1000000; >
unsigned long unixTime = 0; unsigned long millisTime = 0; unsigned long currentTime = 0; unsigned long periodNTP = 1800000; //time between NTP time-synchronize unsigned long millisNTP = 0; byte packetBuffer[48]; //NTP buffer to hold incoming and outgoing packets unsigned long inline ntpUnixTime (UDP &udp) ICACHE_FLASH_ATTR < int udpInited = udp.begin(2390); if(!udpInited)< udp.stop(); return 0; >memset(packetBuffer, 0, 48); packetBuffer[0] = 0b11100011;/* LI, Version, Mode */ packetBuffer[1] = 0;/* Stratum, or type of clock */ packetBuffer[2] = 6;/* Polling Interval */ packetBuffer[3] = 0xEC;/* Peer Clock Precision */ // 8 bytes of zero for Root Delay & Root Dispersion packetBuffer[12] = 49; packetBuffer[13] = 0x4E; packetBuffer[14] = 49; packetBuffer[15] = 52; udp.flush(); udp.beginPacket(CFG_TIME, 123); udp.write(packetBuffer, 48); udp.endPacket(); delay(1000); if(udp.parsePacket()) < udp.read(packetBuffer, 48); udp.flush(); udp.stop(); unsigned long highWord = word(packetBuffer[40], packetBuffer[41]); unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]); unsigned long secsSince1900 = highWord else < udp.flush(); udp.stop(); return 0; >> void mainNTP(boolean force=false) ICACHE_FLASH_ATTR < if( (millisTime - millisNTP < periodNTP)&&(!force) ) < return; >Serial.print( print_time()+" NTP: Time synchronization "); unsigned long unixTimeUpdate=ntpUnixTime(udp); millisTime = millis(); if(unixTimeUpdate>0) < unixTime=unixTimeUpdate; Serial.print("- done. ["+print_time(unixTime)+"]\n"); millisNTP = millisTime; >else < Serial.print("failed!\n"); >currentTime = unixTime + (millisTime - (unixTime>1500000000?millisNTP:0))/1000; >
Ардуиновский прошу не рассматривать, давно это было и его надо переделывать. Но функция получения времени по udp мной использовалась ранее другая, которая была глючной и через какой-то период начинала выдавать неправильное время!
Попробуйте эту функцию объединить с вышеприведенной get_mac_time() вместо millis() и тогда не надо будет заботится о переполнениях. Или используйте встроенный sntp в sdk, но там есть одна особенность, после sntp_init() надо дать пару секунд, пока в фоне SDK получит время. Именно в фоне (т.е. нельзя блокировать процессы). И отследить этот момент — нет возможности. (только на таймер повесить проверку)
Esp8266 отключается от wifi
Здесь я постараюсь описывать варианты решения проблем со стабильностью прошивки. Если у вас есть что добавить, то отписываемся через обратную связь.
При некоторых ситуациях ESP8266 может работать не стабильно, то теряется связь, то зависает или перезагружается. Нормальное состояние работы прошивки — это когда время работы модуля исчисляется месяцами, если конечно электрики не подведут..
Причины, из-за которых невозможно зайти на веб интерфейс (модуль не пингуется):
1. Модуль завис или постоянно перезапускается.
Как определить какая именно причина недоступности модуля в Вашем случае ? :
Если причина в связи Wi-Fi , то на дисплеях данные будут меняться, так же будут отрабатываться функции модуля, например функция KEY у прерываний. Термостат и Логический модуль будут отрабатывать действия при изменений внешних условий.
При обрыве связи Wi-FI время работы(Uptime) не сбрасывается.
Решение проблем с зависанием и перезапуском модуля
Хотя в модуле реализован механизм перезапуска при зависании (Watchdog), но в некоторых случаях он не спасает. Чаще этот механизм работает и модуль просто перезапускается.
Частые причины зависаний и перезапуска:
1. Не хватает тока от блока питания, требуется не менее 300мА.
2. Помехи по питанию. Спасает подключение электролита рядом с модулем на 200 мкф и больше. Рекомендуется установка керамического конденсатора на 0.1 мкф.
3. Импульсные помехи вблизи модуля. Необходимы как можно короткие провода к устройствам и/или оптическая развязка.
4. Мало свободного ОЗУ. Не старайтесь собирать прошивку с максимальным количеством функций. Если объём свободного ОЗУ меньше 12кб (для SSL функций меньше 25кб) , то возможны проблемы в работе.
5. Ошибка в работе какой либо опции в прошивке. Может встречаться в Beta а так же новых опциях проекта. Для решения проблемы необходимо написать сообщение администратору проекта с указанием установленных функций и при каких обстоятельствах происходит проблема.
Решение проблем с обрывами связи WI-FI
1. Низкое качество сигнала. На вкладке http://[ip_adr]/debug можно посмотреть уровень сигнала от роутера. Менее -80 db это уже не стабильная связь (число отрицательное, т.е. -50 это лучше, чем -80) . Необходимо так же смотреть уровень сигнала от модуля со стороны роутера. Проблему можно решить подключением антенны к ESP.
2. Конфликт IP адресов в сети. Попробуйте задать другой IP адрес вручную в настройках модуля.
3. Роутер отключает wifi связь устройству из-за бездействия. Помогает включение какой либо отправки на сервисы статистики.
4. Плохая совместимость с роутером. Точных данных по этой проблеме нет. Может помочь настройка параметров роутера, к сожалению эта настройка уменьшает скорость работы сети Wi-Fi:
-Ширина канала ставится 20мбит/с вместо автовыбора 20/40.
-Уменьшаем скорость сети путем выбора стандарта WI-FI вместо IEEE 802.11n ставим IEEE 802.11g или даже IEEE 802.11b.
В некоторых случаях более новый SDK может работать стабильнее, чем рекомендуемый SDK 1.3.0. Но последние SDK более ресурсоёмкие и количество полезных функций влазит меньше в прошивку.
Самый оптимальный вариант — это использовать отдельный роутер для сети модулей ESP8266, например купив в китае 3G/4G Router за $ 7 .