• Система автоматизации с открытым исходным кодом на базе 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 часов.
Работает.
Спасибо большое.
 
Сверху Снизу