• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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. Единственная просьба если есть на русском кинь ссылочку.
 
Сверху Снизу