• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

При отключении от WiFi время цикла увеличивается вплоть до 8ми секунд.

Доброго дня.
Делаю автоматику для маленького проточного подогревателя. WiFi штука вторичная.
При исчезновении WiFi цикл увеличивается.
Идея в том, что бы при включении подключиться, выдать эвент, поднять сервер. Если WiFi пропал, не париться и проверить через время (10-15 минут).
Бьюсь неделю и всё никак. Помогите пожалуйста.
 

aZholtikov

Active member
Доброго дня.
Делаю автоматику для маленького проточного подогревателя. WiFi штука вторичная.
При исчезновении WiFi цикл увеличивается.
Идея в том, что бы при включении подключиться, выдать эвент, поднять сервер. Если WiFi пропал, не париться и проверить через время (10-15 минут).
Бьюсь неделю и всё никак. Помогите пожалуйста.
Код "в студию"! :)
 
Код такой. Прошу прощения за грязь. Чисто я ещё не умею.
Вырезал куски актуальные под спойлер.
C++:
#include <AsyncElegantOTA.h>
#include <elegantWebpage.h>
#include <Hash.h>
#include <LittleFS.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <ESP8266WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>        //NTP client
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>

#define WIFI_SSID "Mi MIX 2S"
#define WIFI_PASSWORD "987654321"

//#define WIFI_SSID "Gosha_SmartHome"
//#define WIFI_PASSWORD "MySmartHome"

WiFiEventHandler gotIpEventHandler, disconnectedEventHandler, stationConnectedHandler;

void WIFI_connect()
{
  WiFi.mode(WIFI_STA);
  wifi_station_set_hostname("Atmor_kitchen");      //he hostname may be changed using the following function: WiFi.hostname(aHostname)  Input parameter aHostname may be a type of char*, const char* or String. Maximum length of assigned hostname is 32 characters.
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Connecting to AP");
  // while (WiFi.status() != WL_CONNECTED && (millis() - start_Time) <= 10000) // try for 10 seconds
  // {
  //   delay(500);
  //   Serial.print(".");
  // }
//  Serial.println("");
//  if (WiFi.status() != WL_CONNECTED)
//  {
//    Serial.println("without WIFI");
//   
//  }
//  else
//  {
//    Serial.println("Server started");
//    Serial.println(WiFi.localIP());                 // Вывод полученного IP адреса
//    Serial.print("RRSI: ");    Serial.println(WiFi.RSSI());
//    Serial.print("Hostname - "); Serial.println(WiFi.hostname());
//  }
}



void onWifiConnect(const WiFiEventStationModeGotIP& event) {
  Serial.println("Connected to Wi-Fi sucessfully.");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) {
  Serial.println("Disconnected from Wi-Fi");
  WiFi.mode(WIFI_OFF);
  WiFi.printDiag(Serial); //Serial.println(WiFi.mode);
}

void check_WiFi()
{
  if ((WiFi.status() != WL_CONNECTED) && (currentMillis - previous_wifi_check >= wifi_check))
  {
    Serial.println("check_wifi_connection");
    previous_wifi_check = currentMillis;
    WiFi.mode(WIFI_STA);
  }
}

void setup() {
     gotIpEventHandler = WiFi.onStationModeGotIP([](const WiFiEventStationModeGotIP & event)
  {
    Serial.print("Station connected, IP: ");
    Serial.println(WiFi.localIP());
  });

  disconnectedEventHandler = WiFi.onStationModeDisconnected([](const WiFiEventStationModeDisconnected & event)
  {
    Serial.println("Station disconnected");
    WiFi.mode(WIFI_OFF);
  });
  stationConnectedHandler = WiFi.onStationModeConnected([](const WiFiEventStationModeConnected & event)
  {
    Serial.println("Connected event");
  });

  // WIFI_connect();
  WiFi.mode(WIFI_STA);
  WiFi.setAutoReconnect(false);
  wifi_station_set_hostname("Atmor_kitchen");
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
}   
    
    void loop() {
  currentMillis = millis();
  one_cycle_time = millis();             //for calculation cycle time
  timeClient.update();                      //NTP server update
  led_blink();                              //board alive check
  flow_meter();                              //Flow meter
  temperature_C =  temperature_measure();
  //  temperatureC_string = readDSTemperatureC();
  temperatureC_string =  String(temperature_C);

  all_logic(temperature_C);
  check_WiFi();
    }
На всякий случай приложил ещё и текстовые файлы.
 

Вложения

CodeNameHawk

Moderator
Команда форума
Проверку сети делаете, но без толку.

Вот так уже что то.
if ((WiFi.status() == WL_CONNECTED) timeClient.update(); //NTP server update
С сетью работать, только когда сеть есть.
И не надо так часто долбиться туда.
 
Проверку сети делаете, но без толку.

Вот так уже что то.
if ((WiFi.status() == WL_CONNECTED) timeClient.update(); //NTP server update
С сетью работать, только когда сеть есть.
И не надо так часто долбиться туда.
Спасибо! Про чертов NTC server я не подумал.
Добавил так же обновление раз в 12 часов.
Может есть ещё хорошие советы? Почему-то во всех примерах, что бродят по сети нет никаких оптимизаций. Я год баловался ESP прежде чем увидел, что есть эвенты и не нужно дурацкое ожидание сети. Даже вариант с таймаутом и количеством попыток, и тот случайно нашёлся в процессе поиска решения зависания. Но как его например интегрировать в свой код я не знаю. И не понимаю, нужно ли.
 
И кажется я намудрил где-то ещё.
При проверке check_wifi_connection я поставил проверку диагностики и вижу что WiFi.mode(WIFI_OFF), то при эвенте Disconnected выполняется отключение WiFi.
После включается функция WIFI_connect (), WiFi.mode(WIFI_STA) - и вывод диагностики, вижу что включилось. И перезагружается.
 

CodeNameHawk

Moderator
Команда форума
Может есть ещё хорошие советы?
Вам не нужны эти эвенты, установите autoconect и autoreconect.
И главное
С сетью работать, только когда сеть есть.
т.е. делать проверку перед каждым обращением в сеть(можно одну на цикл).
Если есп сама посылает что то в сеть, то делать это через промежутки времени, достаточные для получения ответа сервера,
где то не чаще раза в 30 сек.
Если сеть есть нормальная работа, если нет только автономные задачи (опрос датчиков, вывод на дисплей и.т.д.).
 
Вам не нужны эти эвенты, установите autoconect и autoreconect.
Почему же? Можно при подключении не устраивать дурацкий delay, как во всех примерах.
WiFi.setAutoReconnect(false); установлен в сетапе.

Из общения с сетью - есть только NTP и собственный веб-сервер (<ESPAsyncWebServer.h>). В NTP проверку я добавил. В веб-сервер вроде не надо, хотя возможно я ошибаюсь. А если и надо - то я, если честно, совсем не понимаю, как это делается. Это же не в лупе.

Покаже получается следующая фигня:
07:16:47.471 -> Cycle time:0.00
07:16:50.425 -> Cycle time:0.00
07:16:52.431 -> check_wifi_connection
07:16:52.431 -> Mode: NULL
07:16:52.431 -> PHY mode: N
07:16:52.431 -> Channel: 1
07:16:52.431 -> AP id: 0
07:16:52.431 -> Status: 255
07:16:52.431 -> Auto connect: 1
07:16:52.484 -> SSID (9): Mi MIX 2S
07:16:52.484 -> Passphrase (9): 987654321
07:16:52.484 -> BSSID set: 0

07:16:52.531 -> Mode: STA
07:16:52.531 -> PHY mode: N
07:16:52.531 -> Channel: 1
07:16:52.531 -> AP id: 0
07:16:52.531 -> Status: 0
07:16:52.531 -> Auto connect: 1
07:16:52.585 -> SSID (9): Mi MIX 2S
07:16:52.585 -> Passphrase (9): 987654321
07:16:52.585 -> BSSID set: 0
07:17:00.086 -> "@qA|⸮@⸮⸮v⸮X⸮(⸮Q⸮sYI⸮8⸮t⸮/⸮yt1T⸮-⸮))d⸮UQ@⸮⸮*⸮⸮⸮⸮nZA⸮)⸮~1)⸮⸮*⸮RtQ@cA.)5y*1 ⸮^|⸮)i⸮^⸮PZ⸮~1PZ⸮P⸮Ev ⸮\'⸮I`m alive
07:17:00.457 -> Mode: STA
07:17:00.457 -> PHY mode: N
07:17:00.457 -> Channel: 1
07:17:00.457 -> AP id: 0
07:17:00.457 -> Status: 0
07:17:00.457 -> Auto connect: 1
07:17:00.457 -> SSID (0):
07:17:00.457 -> Passphrase (0):
07:17:00.457 -> BSSID set: 0
07:17:00.457 -> Connecting to AP*** Your T_on: 23.00
07:17:00.457 -> Reading file: /T_off.txt.txt
07:17:00.503 -> - empty file or failed to open file
07:17:00.503 -> *** Your T_off: 0.00
07:17:03.108 -> Cycle time:0.00
07:17:03.362 -> Station disconnected
То есть проверяется подключние, пробует переподключиться, на WiFi.begin(WIFI_SSID, WIFI_PASSWORD); перегружается.
Код:
void WIFI_connect()
{
  WiFi.mode(WIFI_STA);
  WiFi.printDiag(Serial);
  wifi_station_set_hostname("Atmor_kitchen");      //he hostname may be changed using the following function: WiFi.hostname(aHostname)  Input parameter aHostname may be a type of char*, const char* or String. Maximum length of assigned hostname is 32 characters.
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("Connecting to AP");
}

void check_WiFi()
{
  if ((WiFi.status() != WL_CONNECTED) && (currentMillis - previous_wifi_check >= wifi_check))
  {
    Serial.println("check_wifi_connection");
    WiFi.printDiag(Serial);
    previous_wifi_check = currentMillis;
    WIFI_connect();
  }
}
WiFi.setAutoReconnect(false); WiFi.setAutoСonnect(false); присутствуют в Setup.
Где косяк?
 

CodeNameHawk

Moderator
Команда форума
установите autoconect и autoreconect.
Это как бы должно быть в true, иначе я бы написал, что они должны быть сброшены.
Создайте пустой скетч с подключением к сети, atoconect и autoreconect оставьте пока как у вас в false.
Но вначале добавьте wifi.mode(wifi_off).
 
Это как бы должно быть в true, иначе я бы написал, что они должны быть сброшены.
Создайте пустой скетч с подключением к сети, atoconect и autoreconect оставьте пока как у вас в false.
Но вначале добавьте wifi.mode(wifi_off).
Если я Вас правильно понял, то я сделал следующее.
Набросал новый скетчик. И запустил его.
C++:
#include <ESP8266WiFi.h>


#define WIFI_SSID "Mi MIX 2S"
#define WIFI_PASSWORD "987654321"

//#define WIFI_SSID "Gosha_SmartHome"
//#define WIFI_PASSWORD "MySmartHome"

WiFiEventHandler gotIpEventHandler, disconnectedEventHandler, stationConnectedHandler;


// constants won't change. Used here to set a pin number:
const int ledPin =  LED_BUILTIN;// the number of the LED pin

// Variables will change:
int ledState = LOW;             // ledState used to set the LED
unsigned long currentMillis;
// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;        // will store last time LED was updated
unsigned long previous_wifi_check = 0;

// constants won't change:
const long interval = 400;           // interval at which to blink (milliseconds)
const long wifi_check = 60000;

void WIFI_connect()
{
  WiFi.mode(WIFI_OFF);
  WiFi.mode(WIFI_STA);
  WiFi.printDiag(Serial);
  wifi_station_set_hostname("Atmor_kitchen");      //he hostname may be changed using the following function: WiFi.hostname(aHostname)  Input parameter aHostname may be a type of char*, const char* or String. Maximum length of assigned hostname is 32 characters.
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.println("Connecting to AP");
}

void onWifiConnect(const WiFiEventStationModeGotIP& event) {
  Serial.println("Connected to Wi-Fi sucessfully.");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  // timeClient.forceUpdate();
  Serial.println("Server started");
  Serial.println(WiFi.localIP());                 // Вывод полученного IP адреса
  Serial.print("RRSI: ");    Serial.println(WiFi.RSSI());
  Serial.print("Hostname - "); Serial.println(WiFi.hostname());

}

void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) {
  Serial.println("Disconnected from Wi-Fi");
  WiFi.mode(WIFI_OFF);
  WiFi.printDiag(Serial);
}

void check_WiFi()
{
  if ((WiFi.status() != WL_CONNECTED) && (currentMillis - previous_wifi_check >= wifi_check))
  {
    Serial.println("check_wifi_connection");
    WiFi.printDiag(Serial);
    previous_wifi_check = currentMillis;
    WIFI_connect();
  }
}




void setup() {
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);
  Serial.begin(74880);  //115200 Start the Serial Monitor
  delay (100);
  Serial.println("I`m alive");
  WiFi.setAutoReconnect(false);
  WiFi.setAutoConnect(false);
  WIFI_connect();
gotIpEventHandler = WiFi.onStationModeGotIP([](const WiFiEventStationModeGotIP & event)
{
  Serial.print("Station connected, IP: ");
  Serial.println(WiFi.localIP());
});

disconnectedEventHandler = WiFi.onStationModeDisconnected([](const WiFiEventStationModeDisconnected & event)
{
  Serial.println("Station disconnected");
  WiFi.mode(WIFI_OFF);
});
stationConnectedHandler = WiFi.onStationModeConnected([](const WiFiEventStationModeConnected & event)
{
  Serial.println("Connected event");
});

}

void loop() {
  currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }
  check_WiFi();
}

На выходе после третьей итерации на другом контроллере - тоже перегрузился.

15:45:16.721 -> chksum 0x2b
15:45:16.721 -> csum 0x2b
15:45:16.721 -> v00044ce0
15:45:16.721 -> ~ld
15:45:16.910 -> I`m alive
15:45:17.004 -> Mode: STA
15:45:17.004 -> PHY mode: N
15:45:17.004 -> Channel: 1
15:45:17.004 -> AP id: 0
15:45:17.004 -> Status: 0
15:45:17.004 -> Auto connect: 1
15:45:17.004 -> SSID (0):
15:45:17.004 -> Passphrase (0):
15:45:17.004 -> BSSID set: 0
15:45:17.004 -> Connecting to AP
15:45:20.782 -> Connected event
15:45:26.803 -> Station connected, IP: 192.168.43.198
15:46:57.254 -> Mode: STA
15:46:57.254 -> PHY mode: N
15:46:57.254 -> Channel: 1
15:46:57.254 -> AP id: 0
15:46:57.254 -> Status: 0
15:46:57.254 -> Auto connect: 1
15:46:57.254 -> SSID (0):
15:46:57.254 -> Passphrase (0):
15:46:57.254 -> BSSID set: 0
15:46:57.254 -> Connecting to AP
15:47:01.972 -> Station disconnected
15:51:03.649 -> Mode: STA
15:51:03.649 -> PHY mode: N
15:51:03.649 -> Channel: 1
15:51:03.649 -> AP id: 0
15:51:03.649 -> Status: 0
15:51:03.649 -> Auto connect: 1
15:51:03.649 -> SSID (0):
15:51:03.649 -> Passphrase (0):
15:51:03.649 -> BSSID set: 0
15:51:03.649 -> Connecting to AP
15:51:07.434 -> Connected event
15:51:12.933 -> Station connected, IP: 192.168.43.198
15:52:34.928 -> Station disconnected
15:52:34.928 -> Station disconnected
15:52:34.928 -> check_wifi_connection
15:52:34.928 -> Mode: NULL
15:52:34.928 -> PHY mode: N
15:52:34.928 -> Channel: 6
15:52:34.928 -> AP id: 0
15:52:34.928 -> Status: 255
15:52:34.928 -> Auto connect: 1
15:52:34.975 -> SSID (9): Mi MIX 2S
15:52:34.975 -> Passphrase (9): 987654321
15:52:34.975 -> BSSID set: 0
15:52:35.069 -> Mode: STA
15:52:35.069 -> PHY mode: N
15:52:35.069 -> Channel: 6
15:52:35.069 -> AP id: 0
15:52:35.069 -> Status: 0
15:52:35.069 -> Auto connect: 1
15:52:35.069 -> SSID (9): Mi MIX 2S
15:52:35.069 -> Passphrase (9): 987654321
15:52:35.069 -> BSSID set: 0
15:52:35.069 -> Connecting to AP
15:52:38.804 -> Station disconnected
15:53:34.931 -> check_wifi_connection
15:53:34.931 -> Mode: NULL
15:53:34.931 -> PHY mode: N
15:53:34.931 -> Channel: 6
15:53:34.931 -> AP id: 0
15:53:34.931 -> Status: 255
15:53:34.931 -> Auto connect: 1
15:53:34.931 -> SSID (9): Mi MIX 2S
15:53:34.931 -> Passphrase (9): 987654321
15:53:34.931 -> BSSID set: 0
15:53:35.024 -> Mode: STA
15:53:35.024 -> PHY mode: N
15:53:35.024 -> Channel: 6
15:53:35.024 -> AP id: 0
15:53:35.024 -> Status: 0
15:53:35.024 -> Auto connect: 1
15:53:35.072 -> SSID (9): Mi MIX 2S
15:53:35.072 -> Passphrase (9): 987654321
15:53:35.072 -> BSSID set: 0
15:53:35.072 -> Connecting to AP
15:53:38.851 -> Station disconnected
15:54:34.947 -> check_wifi_connection
15:54:34.947 -> Mode: NULL
15:54:34.947 -> PHY mode: N
15:54:34.947 -> Channel: 6
15:54:34.947 -> AP id: 0
15:54:34.947 -> Status: 255
15:54:34.947 -> Auto connect: 1
15:54:34.947 -> SSID (9): Mi MIX 2S
15:54:34.947 -> Passphrase (9): 987654321
15:54:34.947 -> BSSID set: 0
15:54:35.042 -> Mode: STA
15:54:35.042 -> PHY mode: N
15:54:35.042 -> Channel: 6
15:54:35.042 -> AP id: 0
15:54:35.042 -> Status: 0
15:54:35.042 -> Auto connect: 1
15:54:35.042 -> SSID (9): Mi MIX 2S
15:54:35.042 -> Passphrase (9): 987654321
15:54:35.042 -> BSSID set: 0
15:54:35.042 -> Connecting to AP
15:54:46.201 -> "@tA|!⸮D5⸮⸮⸮vX⸮⸮~Qh⸮cII⸮⸮8t⸮N/⸮⸮I*⸮T⸮⸮⸮⸮)D⸮QQ@⸮⸮*⸮⸮⸮nzAl )⸮~1⸮⸮⸮*⸮Rt@wA.)5⸮*⸮⸮⸮|⸮⸮)⸮~1PZ⸮⸮~⸮PZ⸮P⸮E]l /Ѣ⸮I`m alive
15:54:46.527 -> Mode: STA
15:54:46.527 -> PHY mode: N
15:54:46.527 -> Channel: 1
15:54:46.527 -> AP id: 0
15:54:46.527 -> Status: 0
15:54:46.527 -> Auto connect: 1
15:54:46.527 -> SSID (0):
15:54:46.527 -> Passphrase (0):
15:54:46.527 -> BSSID set: 0
15:54:46.527 -> Connecting to AP
15:54:50.257 -> Station disconnected
15:55:46.254 -> check_wifi_connection
15:55:46.254 -> Mode: NULL
15:55:46.254 -> PHY mode: N
15:55:46.254 -> Channel: 6
15:55:46.254 -> AP id: 0
15:55:46.254 -> Status: 255
15:55:46.254 -> Auto connect: 1
15:55:46.254 -> SSID (9): Mi MIX 2S
15:55:46.254 -> Passphrase (9): 987654321
15:55:46.254 -> BSSID set: 0
15:55:46.348 -> Mode: STA
15:55:46.348 -> PHY mode: N
15:55:46.348 -> Channel: 6
15:55:46.348 -> AP id: 0
15:55:46.348 -> Status: 0
15:55:46.348 -> Auto connect: 1
15:55:46.348 -> SSID (9): Mi MIX 2S
15:55:46.348 -> Passphrase (9): 987654321
15:55:46.348 -> BSSID set: 0
15:55:46.348 -> Connecting to AP
15:55:50.081 -> Station disconnected
 

CodeNameHawk

Moderator
Команда форума
Если я Вас правильно понял
Это как бы должно быть в true
Ну я не знаю, как вы это понимаете.
Создайте пустой скетч с подключением к сети, atoconect и autoreconect оставьте пока как у вас в false.
Но вначале добавьте wifi.mode(wifi_off).
Объясните как вы это понимаете.
 
Объясните как вы это понимаете.
Перед WiFi.begin(WIFI_SSID, WIFI_PASSWORD); добавить WiFi.mode(WIFI_OFF); WiFi.mode(WIFI_STA);
Оставить как у меня в false - WiFi.setAutoReconnect(false); WiFi.setAutoConnect(false);

Но и WiFi.setAutoReconnect(true); WiFi.setAutoConnect(true); даёт такой же результат. После третьей итерации - перезагрузка.
 

CodeNameHawk

Moderator
Команда форума
Создайте пустой скетч...
Добавьте подключение к сети в стиле ардуино, никаких событий не надо, работает?
Если да, добавьте автоподключение, работает?
 
Последнее редактирование:
Да. Работает. Оставил эвенты, чтобы при перезапуске не ждать подключения, а в сериал показывало IP.
Всё поубирал, оставил, как Вы и сказали, обновление NTP только при наличии подключения и раз в 12 часов.
Работает.
Спасибо большое.
 
Сверху Снизу