Очень медленное подключение к WiFi с ESP32 (минуты, а не секунды)
У меня возникли некоторые проблемы с подключением к WiFi с помощью платы ESP32. Она очень медленная. Первые несколько раз, когда я пробовал, я оставлял ее в покое на 20 минут, и она все равно не могла подключиться. Поэтому я подумал, что это не работает. Поэтому я попробовал использовать MicroPython и ESP-IDF, и они оба сработали, хотя MicroPython был немного медленным (~10-20 секунд), но ESP-IDF был мгновенным. Затем я вернулся к Arduino, и на этот раз она в конечном итоге подключилась через 260 секунд (> 4 минуты). Другая попытка заняла 420 секунд (7 минут). Кто-нибудь еще сталкивался с подобными проблемами?
Что я пробовал:
- Попробовал другую плату той же модели, чтобы убедиться, что она не бракованная.
- Попробовал другую точку доступа WiFi с тем же результатом.
Хотя MicroPython и фреймворк ESP-IDF работают отлично, я все же надеюсь остановиться на Arduino из-за его простоты и моей ненависти к Python, но не держите на меня зла, если он вам нравится :-).
Моя доска: ESP-WROOM-32(https://www.amazon.com/gp/product/B0B764963C). В Arduino IDE я выбираю «ESP32-WROOM-DA Module». Я также пробовал «uPesy ESP32 Wroom DevKit» с теми же результатами.
Основная версия — «esp32 by Espressif Systems» 2.0.11.
Мои сетевые настройки: TP-Link EAP225, работает как выделенная точка доступа, а не маршрутизатор. Мой маршрутизатор — Linksys WRT1900ACS, работающий на OpenWrt 19.07.2 r10947-65030d81f3.
Другая настройка, которую я попробовал, — это D-Link DIR-842, работающий и как точка доступа, и как маршрутизатор, хотя я не подключал восходящий порт.
Мой код:
#include <WiFi.h>
const char* ssid = "delingtest";
const char* password = "XxxxxYyyy00";
void setup() {
Serial.begin(115200);
Serial.println(millis()); // Для измерения времени соединения
Serial.print("Connecting to WiFi network ");
Serial.print(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
do {
Serial.print(".");
delay(5000);
} while (!WiFi.isConnected());
Serial.println("done.");
Serial.println(millis()); // Для измерения времени соединения
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}
void loop() {
}
Дополнительная информация:
- Когда я использовал MicroPython, я подключался интерактивно. Ссылка: https://docs.micropython.org/en/latest/esp8266/tutorial/network_basics.html
- Для ESP-IDF я использовал пример кода здесь: https://github.com/espressif/esp-idf/tree/master/examples/wifi/getting_started/station
- Я проверил журнал на DHCP-сервере (работающем под управлением OpenWRT), время между получением DHCP-запроса и предложением IP-адреса было коротким (см. ниже).
Wed Mar 13 16:57:55 2024 daemon.info dnsmasq-dhcp[13394]: DHCPDISCOVER(br-lan) 40:22:d8:78:7a:38
Wed Mar 13 16:57:55 2024 daemon.info dnsmasq-dhcp[13394]: DHCPOFFER(br-lan) 192.168.1.145 40:22:d8:78:7a:38
Wed Mar 13 16:57:55 2024 daemon.info dnsmasq-dhcp[13394]: DHCPREQUEST(br-lan) 192.168.1.145 40:22:d8:78:7a:38
Wed Mar 13 16:57:55 2024 daemon.info dnsmasq-dhcp[13394]: DHCPACK(br-lan) 192.168.1.145 40:22:d8:78:7a:38 esp32-787A38
Редактировать:
Я добавил код для отправки ping-запроса на шлюз после установления соединения:
IPAddress ip (192, 168, 1, 1);
bool ret = Ping.ping(ip);
И засек время. Каждый пинг занимал около 4-5 секунд. Так что это не просто медленное подключение к сети WiFi, это также очень медленное выполнение пинга, и, вероятно, все остальное.
Правка при редактировании:
После включения подробного ведения журнала я понял, что на самом деле ping
делает то же самое, что и ping -c 5
, с 1 секундой между пингами. Так что, это занимает 4 секунды, несмотря ни на что. Изначально я думал, что он отправляет только один пинг за вызов.
@Deling Ren, 👍2
Обсуждение1 ответ
Лучший ответ:
Хм, я только что попробовал третью плату и, кажется, нашел первопричину. Если плата вставлена в макетную плату. Она медлееееедленно или вообще не может подключиться. Но если я ее вытащу, она, кажется, подключается за несколько секунд. Так что, полагаю, проблема действительно в том, что макетная плата мешает встроенной антенне. Мне, вероятно, понадобится 32U с разъемом для внешней антенны для конечного продукта.
это очень хороший способ устранения неполадок... если конечный продукт не содержит крупных металлических деталей, то внешняя антенна может не потребоваться, @jsotola
Спасибо. Я работаю над открывателем гаража, поэтому его нужно будет разместить близко к двигателю, который закреплен на потолке с помощью угловых балок. И сигнал WiFi, вероятно, не самый лучший в доме. Сначала я разберусь с программной частью. Посмотрим., @Deling Ren
- ESP32 - "Детектор Браунаута был активирован" при запуске Wi-Fi
- Контакты RX и TX на esp32
- Почему OTA не работает с платой ESP32-CAM Ai-Thinker?
- ESP32 открывает "captive portal" при подключении
- Аналоговое чтение не работает при использовании WiFi
- Автоматическая веб-страница ESP32 AP
- Чтение данных из Google Таблиц с помощью Nodemcu
- WiFiClient::connected() не работает
Понял. Спасибо. Это "esp32 by Espressif Systems" 2.0.11, @Deling Ren
Добро пожаловать в SE/Arduino! Пожалуйста, пройдите [тур], чтобы узнать, как работает этот сайт, и прочитайте несколько страниц [помощи]. Является ли ваш комментарий решением вашей проблемы? Если да, пожалуйста, напишите реальный ответ и отметьте его как принятый. Это не форум., @the busybee
@thebusybee *"Является ли ваш комментарий решением вашей проблемы?"* Комментарии были удалены, так что вам было бы легче понять, что это не ответ на их вопрос. Это ответ на вопрос о версии ядра, которую они использовали, а затем им объяснили этот вопрос о версии ядра, что они затем поняли ("понял") и ответили ("2.0.11")., @timemage
@timemage Теперь, после того как я добавил эту информацию в вопрос, где ей место, этот вводящий в заблуждение комментарий тоже можно удалить., @the busybee
Это, вероятно, должен был сделать тот, кто удалил комментарии. В основном я просто не хотел, чтобы они боролись за повторное открытие из-за путаницы., @timemage