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

Как стабильно работать с таймером при дисконнекте Wi-Fi ?

Shrotnet

New member
опишу ситуацию на примере NodeMCU:

- есть система где Blynk постоянно связан со своим сервером

- есть цифровой выход, который работает как генератор частотой 1 Гц.
timer.setInterval(500L, blinkLedWidget); // обращаемся к генератору каждую секунду

и вдруг когда плохой вайфай, генератор импульсов по таймеру срывается, замолкает и ждёт коннекта, потом когда есть коннект, генератор вдруг лупит с частотой 2...5 Гц, быстро перемаргивает светодиодом раз 10...20 .... и тогда уже наступает опять генерация 1 Гц.

пробовал:

void loop()
{
timer.run();

if (Blynk.connected()){
Blynk.run();
}

else {


Serial.println("✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕");
Serial.println(" WIFI потеря связи с ИНТЕРНЕТОМ ... ");
Serial.println("✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕ ✕");

// wdt_reset(); не работает
// resetFunc(); не работает

ESP.reset(); // wdt reset - пишет, и висит прога ваще ... но после кнопки RES вроде начала работать прога ... странно надо делать один ресет после прошивки ...

// ESP.restart(); данные всех регистров и таймеров сохраняются, счетчик времени работы прогрммы растет до миллионов !

}

}

но это спасает только от паразитной генерации 2...5 Гц, быстрого перемаргивания светодиодом раз 10...20 .... а генерацию всё равно срывает ... КАК СДЕЛАТЬ ТАК, ЧТО-БЫ - при пропадании интернета и реконнекта вайфая, мой генератор стабильно работал на частоте 1 Гц, и не зависал ???
 

Shrotnet

New member
"в ESP есть софтовый ШИМ - процом по прерываниям. И его работа прерывается некоторыми процедурами WiFi." вот так пишут здесь ребята на форуме ... если ШИМ прерывается, тогда скорее всего и таймеры приостанавливаются ... А ЭТО ПОХОЖЕ ТУПИК ..... я прав ?
 

AndrF

Active member
А завести 1 герц с соответствующего выхода DS3231 не проще? Будет вам стабильная частота 1 Гц с часами впридачу.
 

Shrotnet

New member
А завести 1 герц с соответствующего выхода DS3231 не проще? Будет вам стабильная частота 1 Гц с часами впридачу.
1 Гц я использую для автомобильного зарядного, для десульфатации пластин, когда высокий уровень 0,1...0,2 секунды, идёт бомбёжка током 25 Ампер, когда низкий уровень 0,8 секунды, идёт разрядка током 5 Ампер. Прибор работает только при стабильном вайфае. Когда вдруг пропадает вайфай именно в тот момент что запущено на аккум 25А, то процесс рестарта NodeMCU длится 7...30 секунд, за 30 секунд аккуму будет заворот кишок от такого тока. Без вайфая схема работала идеально чётко, но я же хочу на мобилке всё наблюдать-управлять. Задействовал вайфай, и смотрю можно попасть на неприятности. Или скажем есть какая то схема, где надо чётко всегда генерить какие то сигналы. И тут дисконнект, и вся генерёжка коту под хвост, даже внутренние ШИМы перестают генерить, пока вафля законнектится. ПОБЕДИТЬ СКОРЕЕ ЭТО НЕЛЬЗЯ ...
 
Последнее редактирование:

Сергей_Ф

Moderator
Команда форума
@Shrotnet победить можно либо отключив wifi, либо использовав внешний генератор, как вам уже предложили. Если нужно управление в любой момент, то управляемый генератор со своей логикой. Например, на основе avr мини или нано. Базовую логику пихаете в Ардуино, расширенную и связь в esp.
 

Юрий Ботов

Moderator
Команда форума
Разумное решение ИМХО: всегда разделять в устройствах фукции управления реального времени и функции связи с потенциальным таймаутом/отображения - этим должны заниматься разные устройства(контроллеры).
 

AndrF

Active member
У него где-то торчит все тормозящий цикл. Скорей всего он ждет пока система подключится к WiFi, а этого не надо делать. Как не надо и перезапускать модуль для того чтобы система восстановила соединение.
 

Shrotnet

New member
2017-11-02_211147.jpg

1. Вот как у меня сделано подключение вайфай, абсолютно стандартным образом.

2. Почему я жму кнопку V40 на смартфоне, и она первый раз читается 1010101 , а второй раз в таймере, она всегда 0 0 0 0 ??? что за фантастика ???

P.S. загрузить код не могу, потому что не знаю как, а расширенный режим у меня не работает изза блокировки яндекса.
 
Последнее редактирование:

gerkimuyda

New member
int SHARE_BUTTON в функции BLYNK_WRITE - это локальная переменная, область действия которой - функция BLYNK_WRITE. По завершению работы функции - переменная удаляется. И она никак не связана с глобальной переменной с таким-же именем.

Область видимости переменных в C++ для начинающих | C++ для начинающих

И это не "повторное чтение" т.к. в переменную повторно ничего ниоткуда не читается. Правильно называть это, как "повторный вывод значения переменной"
 

Shrotnet

New member
  1. int CHARGE_BUTTON;

  2. BLYNK_WRITE(V40)
  3. { int Button_V40 = param.asInt();
  4. Blynk.setProperty(V40, "color", "#FF0000");
  5. CHARGE_BUTTON = Button_V40;
  6. }
значит надо делать вот так ???
 
Последнее редактирование:

gerkimuyda

New member
Можно делать как вы раньше делали, просто не надо повторно инициализировать переменную
int CHARGE_BUTTON = param.asInt();
а просто использовать ее
CHARGE_BUTTON = param.asInt();

----
А код пишется в тегах [ code=C++]program's code[ /code] без пробелов внутри квадратных скобок
 

Shrotnet

New member
извините, не понял насчет code=C++ , я же использую среду ARDUINO IDE, зачем мне использовать тэги для написания кода ?
 

CodeNameHawk

Moderator
Команда форума
На форуме, вставляя текст с кодом, используйте теги. Есть такая кнопка Код.
 

Shrotnet

New member
насчёт вставки кода понял, спасибо !
насчёт стабильности работы любого устройства, нужно юзать надёжную материнскую основу.
А всякие там вайфаи, и прочие ЖСМ премудрости, нужно вешать на отдельные платы.
Работает в даный момент стабильно MEGA_2560 , повесить рядом через I2C шину ESP8266 NodeMCU, и пусть коннектится.
 

Cadil

New member
Разумное решение ИМХО: всегда разделять в устройствах фукции управления реального времени и функции связи с потенциальным таймаутом/отображения - этим должны заниматься разные устройства(контроллеры).
На форуме BLynk нашел по вашему подходу решение этой проблемы с разделением функций между двумя контроллерами - тут и решение в чистом виде - здесь. Цитирую (под спойлером):
Я использую эту процедуру запуска и повторного соединения с моей компиляцией Mega / ESP-01 ... кажется, работает нормально.

В предварительной настройке

#include <ESP8266_Lib.h> // ESP-01 Link
#include <BlynkSimpleShieldEsp8266.h> // ESP-01 Link

В моем void setup()

wifi.setDHCP(1, 1, 1); //Enable dhcp in station mode and save in flash of esp8266
Blynk.config(wifi, auth, server, port);
if (Blynk.connectWiFi(ssid, pass)) {
Blynk.connect();
}

В void loop()

void loop() {
timer.run();

if (Blynk.connected()) { // If connected run as normal
Blynk.run();
} else if (ReCnctFlag == 0) { // If NOT connected and not already tring to reconnect, set timer to try to reconnect in 30 seconds
ReCnctFlag = 1; // Set reconnection Flag
Serial.println("Starting reconnection timer in 30 seconds...");
timer.setTimeout(30000L, []() { // Lambda Reconnection Timer Function
ReCnctFlag = 0; // Reset reconnection Flag
ReCnctCount++; // Increment reconnection Counter
Serial.print("Attempting reconnection #");
Serial.println(ReCnctCount);
wifi.setDHCP(1, 1, 1); //Enable dhcp in station mode and save in flash of esp8266
Blynk.config(wifi, auth, server, port);
Blynk.connect(); // Try to reconnect to the server
if (Blynk.connectWiFi(ssid, pass)) {
Blynk.connect();
}
}); // END Timer Function
}
}
У автора два контроллера Mega и ESP, а скетч он приводит только для ESP.
Как управляется второй контроллер - Mega?
Помогите разобраться.
Я столкнулся с этой проблемой в конфигурации: ESP8266+DS3231+Blynk.
 
Сверху Снизу