Esp32 таймаут при ошибке подключения к wifi

Добрый день господа! Подскажите пожалуйста, почему при подключении к WiFi контроллер работает в штатном режиме, но если соединение с точкой доступа не установлено, например я отключаю роутер на момент старта, ESP32 начинает работать с тайм-аутом в 5 сек. В чем может быть проблема?
Формально код не мой, но суть та же, я испытываю ту же проблему.

void setupWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("Подключение...");
  delay(3000);
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("WiFi подключён!");
  d1.setText("WiFi connected!");
       if (client.connect(servername, 80)) {
          Serial.println("Соединение с интернетом установленно");
          Serial.print("Хост: ");
          Serial.println(servername);
          Serial.println("ESP IP address: ");
          Serial.println(WiFi.localIP());
          d2.setText("Internet connected!");
        } else {
           client.stop();
           Serial.println("Нет соединения с интернетом");
           d2.setText("Internet not connected!");
        }
  }
  else {
  Serial.println("WiFi не подключён!");
  d1.setText("WiFi not connected!");
  d2.setText("Internet not connected!");
  client.stop();
  WiFi.disconnect(false);
  WiFi.mode(WIFI_OFF);
  }
}

ну точно не в этом коде видимо

Тем не менее, проблема существует и хотелось бы понять почему…

Так он ищет соединение с роутером, а его нет, вот и постоянный тайаут. Избавится возможно сделав дисоннект ну например после 20 попытки подключится.

Получается параллельной работы модуля WiFi и основного кода программы добиться невозможно в этом случае?

Они как раз работают параллельно, только задачи крутятся на разных ядрах микроконтроллера. Второе ядро по умолчанию отдано сетевым технологиям.

Именно по этому, прочитав описание работы WiFi модуля на втором ядре, я и затеял эту тему. Мне казалось что попытки подключения к сети модуля WiFi никак не должны влиять на работу первого ядра, но на деле получаются затыки каждые 5 сек.

откуда видно. что ты крутишь всё остальное на втором ядре?

Разработчики WiFi библиотеки всё правильно сделали, когда приостанавливают работу основного кода во время сетевого подключения. Ведь неизвестно какие потребители энергии автор кода будет в это время включать/выключать, а для стабильного коннекта, нужно стабильное питание. Вот и рулят кодом юзера, чтобы был гарантированный зацеп.

если вы не поняли, то это был намек что надо выкладывать полный код, а не какие-то обрывки.

Не совсем понимаю вопрос, ты хочешь сказать, что если далее идёт банальный

void loop() { 
...
} 

то этого категорически не достаточно, чтобы основной цикл был на одном ядре а обслуга сети на другом?

конечно недостаточно

А как же то что написал SAB?
:

Именно это “по умолчанию” меня и смущает…

видимо надо обратиться к пояснениям

Что то меня кидает в

500 Internal Server Error

ссылка правильная?

Ссылка у меня один фиг не открывается, но я нашёл эту страницу просто по содержимому. Да, я читал это и примеры видел, но, на Гитхаб да и не только, чёрным по белому пишут вот это:
Ядро 0 (PRO) — это то место, где Arduino по умолчанию размещает задачи WiFi и BLE.
Ядро 1 (APP) — это то место, где по умолчанию запускаются приложения Arduino.

Если в то же время, что и закрепленное приложение, запущены BLE или WiFi, любая задача в ядре 0 будет при необходимости вытеснена задачами BLE/WiFi, имеющими высокий приоритет и также чувствительными ко времени.

без использования дополнительных костылей.
Однако и мою проблему описывают много где…

я использую таски. проблем у меня нет

1 лайк