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

Перезапуск ESP8266

kvs

New member
Доброго времени суток.

Как у ESP8266 esp-12e сделать программный сброс?
Я пробовал так:
void(* resetFunc) (void) = 0;

void loop()
{
……
Условие - resetFunc(); //вызываем reset
……
}
Или так: wdt_reset(); ESP.restart();
Сброс получается не стабильный, так как не все регистры сбрасываются.
Может быть есть сброс стека и переход (типа JMP) на нулевой адрес программы? Или еще что то?
 

nikolz

Well-known member
Доброго времени суток.

Как у ESP8266 esp-12e сделать программный сброс?
Я пробовал так:
void(* resetFunc) (void) = 0;

void loop()
{
……
Условие - resetFunc(); //вызываем reset
……
}
Или так: wdt_reset(); ESP.restart();
Сброс получается не стабильный, так как не все регистры сбрасываются.
Может быть есть сброс стека и переход (типа JMP) на нулевой адрес программы? Или еще что то?
system_restart:
Prototype: void system_restart(void)
Note: The ESP8266 will not restart immediately. Please do not call other functions after calling this API.
 

nikolz

Well-known member
Что не так?
#include <user_interface.h>
void system_restart(void);
void loop()
{
if(WiFi.status() != WL_CONNECTED)
{
system_restart();
delay(2000);
}
//программа...
}
Я в дурине не пишу.
Но судя по описанию там уже есть эта функция
Возможно вам нужно вызвать reset а не restart
посмотрите это:
difference between ESP.reset() and ESP.restart()?
 

kvs1960

New member
Я в дурине не пишу.
Но судя по описанию там уже есть эта функция
Возможно вам нужно вызвать reset а не restart
посмотрите это:
difference between ESP.reset() and ESP.restart()?
Я так уже пробовал, такая же фигня!
Там есть вариант с подвеской элементов, но это как крайний вариант…
 

kvs

New member
WDT не спасает?
--------------------
Не могу представить зачем делать этот сброс.
можете пояснить c какой целью?
Ну если кратко, ситуация такая.
У меня есть “сервер” и несколько ”клиентов”. У клиентов подключено по несколько датчиков и исполнительных устройств типа “умный дом”. Обмен между устройствами написан и работает стабильно. Все это “хозяйство” будет на даче где частенько бывают проблемы с лепестричеством.
Короче когда тестировал, у меня иногда один или два из клиентов не могли подключится к “серверу” и зависали на подключении, хотя остальные в этот момент обменивались с ним данными. Если нажать кнопку сброса, то коннект и обмен возобновляются.
Проблема в том, что я не смог понять почему не происходит коннекта. Короче буду дальше разбираться почему нет коннекта...
А что такое WDT ?
 

CodeNameHawk

Moderator
Команда форума
дальше разбираться почему нет коннекта...
Если работаете в режиме STA, сделайте проверку на наличие соединения(WiFi.status() == WL_CONNECTED) и если нет, новую попутку подключения. А также есть автопереподлючение.
 

nikolz

Well-known member
Ну если кратко, ситуация такая.
У меня есть “сервер” и несколько ”клиентов”. У клиентов подключено по несколько датчиков и исполнительных устройств типа “умный дом”. Обмен между устройствами написан и работает стабильно. Все это “хозяйство” будет на даче где частенько бывают проблемы с лепестричеством.
Короче когда тестировал, у меня иногда один или два из клиентов не могли подключится к “серверу” и зависали на подключении, хотя остальные в этот момент обменивались с ним данными. Если нажать кнопку сброса, то коннект и обмен возобновляются.
Проблема в том, что я не смог понять почему не происходит коннекта. Короче буду дальше разбираться почему нет коннекта...
А что такое WDT ?
Так как я не знаю особенностей Вашего алгоритма, то попробую объяснить на примере своего сервера и клиентов.
-------------------------------
У меня два режима - без WIFI -работа в загрузчике и с WIFI -обычная работа.
-----------------------------
Обычная работа:
Сервер может быть включен или выключен, т е с ним может быть все что угодно.
------------------
При этом клиент всегда работает и его невозможно убить, если есть питание.
------------------
Алгоритм непотопляемой работы следующий (основные моменты)
--------------------------------
1) Обмен клиента с сервером происходит по UDP с подтверждением.
UDP выбран по определенным соображением, которые связаны с идеологией " умный дом" и соответствует известным концепциям.
------------------------------
2) Если устанавливается новое соединение, то клиент ждет не более 6 секунд и после этого сохраняет нужную информацию в памяти RTC и п 7).
3) Если соединение установлено (обычно первичное соединение 4 сек и старое соединение 0.3 сек) клиент посылает сообщение и ждет ответ от сервера 10 мс.
4) Если ответа нет, то посылает повторное сообщение и ждет 10 мс.
5) Если ответа нет вторично , сохраняет нужную информацию в памяти RTC и п 7).
6) Если ответ получен, то п 7)
7) уходит спать.
---------------------------------
 

kvs1960

New member
nikolz, nikolz,
Так как я не знаю особенностей Вашего алгоритма, то попробую объяснить на примере своего сервера и клиентов.
-------------------------------
У меня два режима - без WIFI -работа в загрузчике и с WIFI -обычная работа.
-----------------------------
Обычная работа:
Сервер может быть включен или выключен, т е с ним может быть все что угодно.
------------------
При этом клиент всегда работает и его невозможно убить, если есть питание.
------------------
Алгоритм непотопляемой работы следующий (основные моменты)
--------------------------------
1) Обмен клиента с сервером происходит по UDP с подтверждением.
UDP выбран по определенным соображением, которые связаны с идеологией " умный дом" и соответствует известным концепциям.
------------------------------
2) Если устанавливается новое соединение, то клиент ждет не более 6 секунд и после этого сохраняет нужную информацию в памяти RTC и п 7).
3) Если соединение установлено (обычно первичное соединение 4 сек и старое соединение 0.3 сек) клиент посылает сообщение и ждет ответ от сервера 10 мс.
4) Если ответа нет, то посылает повторное сообщение и ждет 10 мс.
5) Если ответа нет вторично , сохраняет нужную информацию в памяти RTC и п 7).
6) Если ответ получен, то п 7)
7) уходит спать.
---------------------------------
1. Связь сервера с клиентом у меня тоже по UDP. По другому ни как (скорость мала и ...). Когда связь с сервером теряется, я в цикле пытаюсь восстановить связь, а нужно обрабатывать основной алгоритм и пытаться восстановить связь! Переделаю!
2. Сервер у меня дополнительно в режиме АР для связи с телефоном.
3. Почему данные у тебя сохраняются RTC (часах), а не EEPROM ESP8266 ???
4. Какое время у тебя клиент находится в режиме сна? И как в случае необходимости мгновенно отреагировать на команду сервера (например, включить свет)?
У меня нет опыта с режимом сна, буду писать в первый раз. Подскажи как правильно уходить в сон и обратно.
Спасибо.
 

pvvx

Активный участник сообщества
Сброс получается не стабильный, так как не все регистры сбрасываются.
Может быть есть сброс стека и переход (типа JMP) на нулевой адрес программы? Или еще что то?
Всякие soft reset функции в SDK и других приложениях всегда работали нестабильно на ESP8266.
Самый наименее глючный вариант для замены "перезагрузки", которая требуется в Arduino - это использование deep-sleep функции.
Перезагрузка в Arduino требуется очень часто, т.к. большинство либ Arduino не содержат процедур освобождения ресурсов и восстановления системы в первоначальное значение до использования их функций.
Инициализация китайского SDK работает неверно при повторном перезапуске (так-же глючит и неисправленная инициализация в ROM от программеров Espressif), т.к. требует чтобы многие регистры SoC находились в состоянии как при аппаратном сбросе. Deep-sleep дергает за RESET, что и дает нужную реакцию...
 
Последнее редактирование:

nikolz

Well-known member
nikolz, nikolz,

1. Связь сервера с клиентом у меня тоже по UDP. По другому ни как (скорость мала и ...). Когда связь с сервером теряется, я в цикле пытаюсь восстановить связь, а нужно обрабатывать основной алгоритм и пытаться восстановить связь! Переделаю!
2. Сервер у меня дополнительно в режиме АР для связи с телефоном.
3. Почему данные у тебя сохраняются RTC (часах), а не EEPROM ESP8266 ???
4. Какое время у тебя клиент находится в режиме сна? И как в случае необходимости мгновенно отреагировать на команду сервера (например, включить свет)?
У меня нет опыта с режимом сна, буду писать в первый раз. Подскажи как правильно уходить в сон и обратно.
Спасибо.
данные хранятся в памяти RTC на ESP8266, т е как Вы пишите в EEPROM ESP8266.
----------------------------------
Я рассказал алгоритм работы контрольно-измерительных клиентов.
т е когда клиент должен собирать информацию и управлять устройствами по ситуации или программе , посылая информацию на сервер.
В этом случае все изменения в режиме клиента передаются в ответе сервера. т е сервер не может в произвольный момент вмешаться в работу устройства.
При этом клиенты работают от автономного источника питания, поэтому использую deep-sleep от 10 секунд до 10 минут.
-------------------------
В варианте клиентов типа "не очень умная" розетка, выключатель и т д нет надобности в автономном питании. поэтому в этом случае используется Light-sleep.
----------------------------------
Режим Ligh-sleep включается оператором
if (wifi_get_sleep_type ()!= LIGHT_SLEEP_T) wifi_set_sleep_type(LIGHT_SLEEP_T);
Подробнее про режимы можно прочитать здесь:
9b-esp8266-low_power_solutions_en_0.pdf
--------------------------
еще для экономии питания и включения по внешним прерываниям или по таймеру без перезагрузки можно использовать Force Sleep APIs.
 

pvvx

Активный участник сообщества
данные хранятся в памяти RTC на ESP8266, т е как Вы пишите в EEPROM ESP8266.
----------------------------------
Я рассказал алгоритм работы контрольно-измерительных клиентов.
т е когда клиент должен собирать информацию и управлять устройствами по ситуации или программе , посылая информацию на сервер.
В этом случае все изменения в режиме клиента передаются в ответе сервера. т е сервер не может в произвольный момент вмешаться в работу устройства.
При этом клиенты работают от автономного источника питания, поэтому использую deep-sleep от 10 секунд до 10 минут.
-------------------------
В варианте клиентов типа "не очень умная" розетка, выключатель и т д нет надобности в автономном питании. поэтому в этом случае используется Light-sleep.
----------------------------------
Режим Ligh-sleep включается оператором
if (wifi_get_sleep_type ()!= LIGHT_SLEEP_T) wifi_set_sleep_type(LIGHT_SLEEP_T);
Подробнее про режимы можно прочитать здесь:
9b-esp8266-low_power_solutions_en_0.pdf
--------------------------
еще для экономии питания и включения по внешним прерываниям или по таймеру без перезагрузки можно использовать Force Sleep APIs.
А как в режиме Light-sleep сработает ваша предложенная схема обвязки кнопки или срабатывание датчика? Никак? :)
 

pvvx

Активный участник сообщества
1. Связь сервера с клиентом у меня тоже по UDP. По другому ни как (скорость мала и ...). Когда связь с сервером теряется, я в цикле пытаюсь восстановить связь, а нужно обрабатывать основной алгоритм и пытаться восстановить связь! Переделаю!
В режиме Light-sleep у вас будут очень большие потери для UDP.
3. Почему данные у тебя сохраняются RTC (часах), а не EEPROM ESP8266 ???
По тому, что название "EEPROM" при использовании Arduino подразумевает эмуляцию EEPROM в Flash. Память RTC при управлении CH_PD или снятии питания с ESP8266 стирается, а "EEPROM" в Arduino - нет. Почему так назвали функции сохранения данных в Arduino - это чтобы всё путались, другого тут не придумать.
4. Какое время у тебя клиент находится в режиме сна? И как в случае необходимости мгновенно отреагировать на команду сервера (например, включить свет)?
В режиме Light-sleep, если работает STA - пинг будет достигать более 100 мс и потеря первых запросов, посланных с сервера по UDP гарантирована. В режиме deep-sleep - всё время сна никакой связи не будет.
(При 1 Gbit/sec, пока устройство спит, роутер не может держать FIFO-буфер на сотни мегабайт посланных UDP запросов спящему устройству. А т.к. потеря неизбежна, то следствием является - не буферизировать ничего для "спящих", кроме указания о "просыпании").
У меня нет опыта с режимом сна, буду писать в первый раз. Подскажи как правильно уходить в сон и обратно.
ESP.deepSleep(время_в _микросекундах);
 
Последнее редактирование:

nikolz

Well-known member
А как в режиме Light-sleep сработает ваша предложенная схема обвязки кнопки или срабатывание датчика? Никак? :)
--------------------------
многие радиолюбители прошлого века и дурильшики этого века при создании собственной "гениальной" схемы используют старый французский метод РЕКЛЕ (в переводе на русский означает режу -клею).
------------------------------------
метод был изобретен в прошлом веке до появления интернета и компьютеров.
-----------------------------------
суть его заключается в том, что с помощью железного инструмента -ножницы, вырезают из бумажного источника информации журнала "радио" куски чужих схем.
--------------------------------------------
Потом, нарезав много таких интересных кусков,
с помощью жидкого инструмента - клея
склеивают из этих кусков свою гениальную схему.
----------------------
Затем паяют эту схему и, как правило, начинают танцы с бубном.
========
Поэтому Вы уже ответили на свой же вопрос.
кнопки и Light-sleep это железки и функция, которые не связаны между собой.
Добавьте недостающие куски и будет работать так как Вам надо.
-------------------------------
Пилите Шура, Пилите...
 

kvs1960

New member
--------------------------
многие радиолюбители прошлого века и дурильшики этого века при создании собственной "гениальной" схемы используют старый французский метод РЕКЛЕ (в переводе на русский означает режу -клею).
------------------------------------
метод был изобретен в прошлом веке до появления интернета и компьютеров.
-----------------------------------
суть его заключается в том, что с помощью железного инструмента -ножницы, вырезают из бумажного источника информации журнала "радио" куски чужих схем.
--------------------------------------------
Потом, нарезав много таких интересных кусков,
с помощью жидкого инструмента - клея
склеивают из этих кусков свою гениальную схему.
----------------------
Затем паяют эту схему и, как правило, начинают танцы с бубном.
========
Поэтому Вы уже ответили на свой же вопрос.
кнопки и Light-sleep это железки и функция, которые не связаны между собой.
Добавьте недостающие куски и будет работать так как Вам надо.
-------------------------------
Пилите Шура, Пилите...
Ну, тут и без меня весело было!....., хотя отсутствовал всего три дня.

Переподключение с сервером я тогда еще сделал и протестировал со всякими видами пропадания связи, отключения питания с дребезгом по питанию и т.д. Долго проверял, все работает стабильно!

Режим Light-sleep и deep-sleep мне не знаком и буду пробовать только после приезда с 14 мая. Спасибо за ссылку на pdf. Единственная просьба если есть на русском кинь ссылочку.
 
Сверху Снизу