Esp32 не подключается к Wi-Fi
Обновлено: 21.11.2024
Здравствуйте,
мой ESP32 (я использую макетную плату: на самом чипе написано ESP-WROOM 32) не всегда подключается к моему Wi-Fi.
При использовании Arduino Ide:
подключается в 50% случаев. Часто подключается с первой попытки но потом при сбросе не подключается. Затем с третьей попытки снова подключается и так далее. Я не проверял, всегда ли это так. Но часто бывает так.
С платформой ввода-вывода в VS Code:
Однажды у меня сработало. Но с тех пор (3 часа попыток) это снова не сработало.
Он работает каждый второй раз, когда я нажимаю сброс (на самом деле он всегда автоматически перезагружается после первого сбоя). Возможно, не хватает времени между отключением и подключением при нажатии кнопки сброса на макетной плате.
Я знаю, что многие люди сталкивались с подобными проблемами, но я не смог найти решения. Кто-нибудь знает, почему он не работает/почему он такой непоследовательный?
У меня возникла та же проблема, и я просто реализовал тайм-аут в процедуре подключения, чтобы вызвать функцию повторного подключения после некоторых попыток.
Таким образом, я всегда получаю подключение к Wi-Fi за считанные секунды и без необходимости перезагрузки.
вот пример фрагмента:
ошибка: неправильное использование this в функции, не являющейся членом
это относится к чему?
Я предполагаю, что это всего лишь фрагмент кода, иллюстрирующий, как он решает проблему, а не то, что вы можете/должны скопировать/вставить в свою собственную программу.
Я только что боролся с интернет-соединением на своем первом esp32 с похожей проблемой и просто добавил еще одну функцию Wifi.begin внутри цикла while:
while (WiFi.status() != WL_CONNECTED) Serial.print ("WL не подключен, повторная попытка.");
WiFi.begin(ssid, пароль);
задержка(1000);
Вырежьте и вставьте это, и он будет продолжать попытки, пока не подключится.
дополнительное объяснение:
цикл while означает, что он продолжает делать это до тех пор, пока условие не изменится, != означает не-равно-
на простом английском это будет выглядеть так:
в то время как состояние Wi-Fi не равно WL подключено, продолжайте делать следующее
напечатайте "*****"
попробуйте снова подключиться к Интернету, используя имя пользователя "ssid" и пароль "password"
затем подождите 1000 единиц времени
Дополнительный бонус: узнайте, как создать счетчик циклов, и после определенного количества попыток введите сообщение об ошибке и выполните сброс, не особенно сложный код для поиска и научит вас некоторым очень полезным навыкам программирования.
увеличить время ожидания до 5000
delay(5000);
Еще один вариант расследования:
Я не проверял дважды, но изменение с 1 с на 5 с улучшило количество ошибок.
На самом деле, я пытаюсь 4-5 раз с задержкой в 1 секунду, затем я пытаюсь еще 5 раз с задержкой в 5 секунд. Если все эти попытки не увенчаются успехом, я продолжу.
Дополнительный бонус: узнайте, как создать счетчик циклов, и после определенного количества попыток введите сообщение об ошибке и выполните сброс, не особенно сложный код для поиска и научит вас некоторым очень полезным навыкам программирования.
Это обсуждение сильно напоминает мне длинную тему на github ESP32 WiFi.begin работает только каждый второй раз. Там суть в том, что в большинстве современных Fritz! Boxes - хотя и не исключительно - требуется двойной подход для установления WiFi-соединения. То есть вы делаете первую попытку, которая почти всегда терпит неудачу, затем повторяете попытку, которая почти всегда оказывается успешной. Мой Fritz!Box — 7490, и он ведет себя так >95% всех случаев.
Другие мои маршрутизаторы, в том числе старые FritzBox, почти всегда подключаются с первой попытки с тем же набором оборудования и кода ESP32.
В этой теме нет упоминания об используемом маршрутизаторе. Интересно, это тоже FritzBox?
Позже было указано, что текущая версия ESP_IDF 4.x, а Arduino по-прежнему использует версию 3.x.
Итак, какую версию IDF вы используете прямо или косвенно?
Я тут совсем запутался. Недавно я увлекся микроконтроллерами для хобби (arduino), и как только я почувствовал себя очень комфортно, я купил себе плату ESP32 в стиле arduino. Я был очень, очень взволнован, чтобы попробовать его с его богатым набором функций. Однако после тестирования контактов и настройки esp32 для IDE Arduino у меня почти сразу начались проблемы с подключением к моему домашнему Wi-Fi. Я писал на stackoverflow, arduino stackexchange, форумах arduino и esp32, почти без результатов или даже предложений. Вот вся информация, которая у меня есть:
ESP32 не подключается к домашнему WiFi. Домашний Wi-Fi работает на частотах 2,4 ГГц и 5 ГГц. Я попытался разделить их на два разных SSIDS и подключиться только к 2.4. Это не сработало. Я попытался изменить пароль на все буквы нижнего регистра. Это не сработало. Я пытался использовать WPS для подключения - это не сработало.
Когда я использую свой телефон в качестве мобильной точки доступа, ESP32 работает просто отлично. Я использовал пример HelloServer для тестирования.
Я также запустил сканирование с помощью ESP32, чтобы проверить, обнаруживает ли он вообще мой домашний WiFi. Он обнаружил мой домашний Wi-Fi.
Мой маршрутизатор представляет собой встроенную комбинацию маршрутизатора и модема xfinity. Я боюсь, что это проблема ... но я не понимаю, почему он будет работать иначе, чем любой другой маршрутизатор. У меня никогда не было проблем с подключением устройства к нему — это включает в себя устройства IOT, такие как точки Alexa и некоторые другие ненужные вещи, которые я получил в подарок. (извините)
Конечно, я проверял SSID и пароль миллион раз, так что это не просто случай безумного дурака.
Очень надеюсь, что смогу решить эту проблему. Если это не решаемо. Что я должен делать? Мой текущий план состоит в том, чтобы купить Raspberry Pi 3 B+, подключить его к маршрутизатору и заставить его транслировать собственный сигнал для использования ESP32, так как у меня есть проект, который я действительно хотел бы начать для ESP32.
Большое спасибо
EDIT: все выглядит очень мрачно. Есть ли у кого-нибудь идеи, как я могу дешево получить сигнал Wi-Fi, который, как известно, совместим с ESP32? Может через удлинитель WiFi? Или я думал об использовании Raspberry Pi 3. Или, может быть, даже другого ESP с каким-то модулем Ethernet? Дайте мне знать. Я очень, очень хочу полюбить свой ESP32 — он такой мощный и многофункциональный, но при этом маленький и эффективный.
РЕДАКТИРОВАНИЕ 2. Даже прошел через трудности с настройкой официальной цепочки инструментов ESP IDF. Он по-прежнему не может подключиться.
EDIT 3: я вернулся к последней стабильной версии ESP IDF. Нет.
EDIT 4: Собираюсь попросить у провайдера новый роутер/модем. Обычно они поставляют это бесплатно. Посмотрим, решит ли это мою проблему.
БОЛЬШОЕ ОБНОВЛЕНИЕ: ESP8266 отлично подключается к Wi-Fi. Спасибо swipecat за предложение купить несколько для тестирования. Очень интересно. Придется провести еще несколько тестов - в конечном итоге я могу просто использовать другой чип для усиления моего Wi-Fi, и, предположительно, он будет нормально работать с трудным esp32
В этом руководстве мы узнаем, как повторно подключить плату ESP32 к сети WIFI, когда она временно теряет соединение. С помощью различных методов мы продемонстрируем эту функциональность. Следовательно, это руководство будет очень полезно, чтобы избежать неприятностей, связанных с постоянной потерей сетевого соединения по многим причинам, таким как перезапуск маршрутизатора WiFi, ESP32 вне зоны действия маршрутизатора WiFi, потеря питания и перезапуск маршрутизатора.
У нас есть аналогичное руководство для ESP8266 NodeMCU:
Как упоминалось ранее, мы будем использовать различные методы для повторного подключения ESP32 к WiFi-соединению после потери соединения. Вы можете использовать любой подходящий из списка, приведенного ниже:
1-й метод: функция WiFi.reconnect()
В скетче Arduino используйте функцию WiFi.connect(), чтобы восстановить подключение к сети, к которой ранее была подключена плата ESP32.
- Имя вашей сети WIFI, известное как SSID, является первым аргументом.
- Второй аргумент — это пароль связанной с вами сети WIFI. Обязательно указывайте функции в правильной последовательности.
2-й метод: ESP.restart()
Альтернативный способ повторного подключения к Wi-Fi — перезапустить устройство ESP32. Используя функцию ESP.restart(), мы можем перезапустить плату разработки ESP32. Это может восстановить потерянное сетевое соединение.
Внедрите функцию ESP.restart() внутри функции loop(), чтобы проверить, подключен ли ваш модуль ESP к WiFi. Если соединение потеряно, оно восстанавливается с помощью функции WiFi.reconnect().
Эскиз Arduino
Следуйте приведенному ниже эскизу Arduino. Функция бесконечного цикла() будет выполнять вышеупомянутые функции. Через каждые 20 секунд он будет проверять, подключена ли плата к WIFI или нет. Если нет, то он попытается повторно подключиться, сначала отключившись, а затем попытавшись снова подключиться.
Вы можете увеличить время перепроверки, изменив значение задержки в следующей строке:
Этот метод является хорошим решением для повторного подключения Wi-Fi к ESP32 в случае случайной потери соединения. Но с помощью этого метода мы должны опрашивать условие if ((WiFi.status() != WL_CONNECTED) && (current_time – previous_time >=delay)) при каждом выполнении цикла().
Альтернативой методу loop() является использование событий ESP32 WIFI. Мы подробно покажем еще одну полезную функцию, известную как WIFI Events. Это поможет в обнаружении потерянного сетевого соединения. Кроме того, будет вызвана функция для управления успешным переподключением. Это обсуждается в разделе ниже.
3-й метод: события Wi-Fi ESP32
Упомянутый выше метод бесконечного цикла () поможет восстановить потерянное соединение WIFI, но он немного неудобен и приводит к пустой трате ресурсов ESP32.Для лучшего подхода мы попытаемся вместо этого использовать события ESP32 WIFI. События WIFI напрямую обнаружат отсутствие WIFI. Кроме того, он одновременно вызовет функцию обработки для повторного подключения к сети.
- SYSTEM_EVENT_STA_CONNECTED: ESP32 находится в режиме станции и подключен к точке доступа (AP).
- SYSTEM_EVENT_STA_DISCONNECTED: ESP32 находится в режиме станции и отключен от точки доступа (AP).
Мы будем использовать эскиз Arduino, чтобы объяснить, как будут работать события WIFI. Благодаря этим событиям ESP32 сможет мгновенно восстановить соединение с маршрутизатором после потери соединения. В связи с этим мы будем использовать два вышеупомянутых события.
Эскиз Arduino
Откройте IDE Arduino и выберите «Файл» > «Создать», чтобы открыть новый файл. Скопируйте приведенный ниже код в этот файл. Этот код будет работать для вашей платы разработки ESP32. Вы должны заменить учетные данные сети.
Как работает код?
Во-первых, мы включим библиотеку WiFi.h. Эта библиотека поможет установить соединение между нашим модулем ESP32 и беспроводной сетью.
Далее мы создадим две глобальные переменные, одну для SSID, а другую для пароля. В них будут храниться наши сетевые учетные данные, которые будут использоваться для подключения к нашей беспроводной сети. Замените их оба своими учетными данными, чтобы обеспечить успешное подключение.
Пользовательские функции
Затем мы определим некоторые функции, которые нам нужно будет вызывать позже в коде. Во-первых, мы определим функцию Wifi_connected(). Эта функция будет вызываться, когда наш ESP32 подключится к точке доступа через событие SYSTEM_EVENT_STA_CONNECTED. Эта функция напечатает: «Успешно подключено к точке доступа» в нашем последовательном мониторе.
Во-вторых, мы определим функцию Get_IPAddress(). Это будет вызвано, когда наша плата ESP32 будет использовать событие SYSTEM_EVENT_STA_GOT_IP для доступа к своему IP-адресу. С помощью этой функции Get_IPAddress() мы напечатаем «WIFI подключен!» и IP-адрес нашего модуля на последовательном мониторе.
Наконец мы определим функцию Wifi_disconnected(). Эта функция будет вызываться, когда наш ESP32 отключится от точки доступа через событие SYSTEM_EVENT_STA_DISCONNECTED. Эта функция напечатает «Отключено от точки доступа WIFI». Также в кодовом номере будет указана причина отключения. Кроме того, он также попытается повторно подключиться к сети с помощью функции WiFi.begin().
Функция настройки()
Внутри функции setup() мы открываем последовательную связь со скоростью 115200 бод.
Затем мы вызовем функцию WiFi.disconnect() с параметром true внутри нее. Это удалит все предыдущие сетевые учетные данные, сохраненные на доске.
Далее мы вызовем функцию WiFi.onEvent() для всех трех событий WIFI. Это будут SYSTEM_EVENT_STA_CONNECTED, SYSTEM_EVENT_STA_GOT_IP и SYSTEM_EVENT_STA_DISCONNECTED. Мы будем передавать их по отдельности в качестве вторых параметров внутри функции WiFi.onEvent(). Ранее определенные пользователем функции будут выступать в качестве первых параметров.
Затем мы подключим нашу плату ESP32 к точке доступа через функцию WiFi.begin().
Демонстрация
Перед загрузкой кода на плату убедитесь, что вы выбрали правильную плату и COM-порт. Перейдите в «Инструменты» > «Плата» и выберите «Модуль разработчика ESP32». Затем перейдите в «Инструменты» > «Порт» и выберите соответствующий порт, через который подключена ваша плата.
Нажмите кнопку загрузки, чтобы загрузить код на плату разработки ESP32.
После того, как вы загрузили свой код на макетной плате, нажмите ее кнопку ВКЛЮЧИТЬ.
Откройте последовательный монитор со скоростью 115 200 бод. Теперь подключитесь к локальной сети WIFI. Прервите соединение. Программный код /автоматически обнаружит его и переподключится.
В этом руководстве мы обсудили три различных метода повторного подключения ESP32 к сети Wi-Fi после потери соединения. Возможность повторного подключения ESP32 к WiFi делает его полезным для проектов веб-сервера.
Для большинства из нас ESP32 является первым приоритетом в наших проектах Интернета вещей. Благодаря своей расширенной функциональности при простом использовании.
Среди всех функциональных возможностей сегодня мы обсудим одну из них, которая выведет ваш IoT-проект на новый уровень.
Знаете ли вы, что в ESP32 можно хранить несколько учетных данных WiFi?
Не только сохранение ESP32 может автоматически подключаться к самой надежной сети Wi-Fi среди них.
Обзор проекта
В основе Интернета вещей лежит подключение к Интернету, и до сих пор мы зависели только от одного удостоверения Wi-Fi, хранящегося в нашем ESP32. Но зависимости от одной сети WiFi недостаточно для надежной работы.
В этом руководстве мы обсудим, как мы можем хранить несколько учетных данных WiFi в нашем коде ESP32. И среди всех сетей Wi-Fi ESP32 автоматически подключится к лучшей сети.
Таким образом, мы можем обеспечить наилучшее подключение к Интернету для наших IoT-проектов на основе ESP32.
Необходимые детали
В этом руководстве мы будем использовать следующие части:
Предпосылки
Мы будем использовать Arduino IDE для программирования ESP32. Если вы не знакомы с Arduino IDE, ознакомьтесь с нашим руководством по
Кроме того, нам потребуется установить пакет платы ESP32 в Arduino IDE, следуйте нашему руководству
Вы можете пропустить оба шага, если делали это раньше.
Автоматическое подключение к лучшей сети Wi-Fi
Мы будем использовать предварительно созданную библиотеку espressif WiFiMulti для хранения нескольких сетей Wi-Fi и выбора лучшей из них.
Для использования этого кода необходимо внести следующие изменения:
- Добавьте все свои имена SSID в ssid0, ssid1….. и т. д.
- Добавьте свои пароли в pass0, pass1….. и т. д.
Если вы не хотите исправлять учетные данные WiFi в своем коде, ознакомьтесь с нашим руководством по
Вот код:
Как работает код
Во-первых, нам нужно инициализировать необходимые библиотеки. Нам понадобятся WiFi.h и WiFiMulti.h. Обе эти библиотеки предустановлены вместе с пакетом ESP32.
Теперь мы инициализируем wifiMulti как новый класс WiFiMulti.
Мы определим WiFi_timeoutWiFi_timeout; это установит максимальное время ожидания для подключения к сети WiFi. Мы установили его на 10000 миллисекунд (10 секунд). При необходимости вы можете уменьшить или увеличить его.
Для этого руководства мы определили четыре разных учетных данных Wi-Fi, которые у вас могут быть в большей или меньшей степени в вашем случае. Поэтому мы определили их все как const char* и назвали их от ssid0, pass0 до ssid3, pass3. Вы можете использовать другое имя, если хотите.
Примечание. Длина вашего SSID и пароля не должна превышать 31 и 64.
настройка()
Сначала мы инициализируем последовательную связь, чтобы мы могли видеть данные в мониторе последовательного порта. Мы использовали скорость передачи 115 200 бод. И добавили небольшую задержку.
Теперь мы воспользуемся функцией addAP из библиотеки WiFiMulti, чтобы добавить все учетные данные WiFi следующим образом.
У нас есть четыре разных учетных данных WiFi; поэтому нам нужно использовать эту функцию четыре раза и передавать ее с разными учетными данными WiFi. Если у вас больше или меньше сетей Wi-Fi, вы можете использовать эту функцию соответствующим образом.
Наконец, нам нужно использовать функцию запуска с предыдущим значением WiFi_timeoutWiFi_timeout. Эта функция позаботится о выборе лучшей сети Wi-Fi из всех возможных. Эта функция проверит все доступные сети с сильными сторонами и выберет среди них самую сильную.
Если эта функция подключится к WiFi в течение указанного времени ожидания, мы напечатаем IP-адрес подключенной сети WiFi.
И если не подключен ни к какому WiFi, мы будем последовательно печатать «WiFi не подключен» в серийном монитор.
цикл()
В циклической функции мы будем проверять только каждый раз, когда WiFi подключен или нет. Если он не подключен, он попытается подключиться к Wi-Fi с тайм-аутом по умолчанию, равным 5 секундам.
Это все, что нам нужно сделать, чтобы включить эту замечательную функцию ESP32. Вы можете пропустить последнюю часть этого руководства. Но если вы хотите знать, что именно делает эта библиотека, оставайтесь с нами.
Давайте копнем глубже
Давайте разберемся, что именно делает эта библиотека в фоновом режиме. Для этого мы включим подробный вывод.
Для этого выберите Инструменты > Базовый уровень отладки > Подробно
А теперь загрузите код.
Таким образом, библиотека будет печатать все дополнительные данные в фоновом режиме на последовательном мониторе. И вы увидите, что ESP32 будет печатать много данных в последовательном терминале.
Первое, что мы увидим, библиотека добавила все четыре SSID, которые мы передали с помощью функции addAP.
Далее библиотека просканировала все доступные сети Wi-Fi, находящиеся в пределах досягаемости. И как мы видим, найдены три сети.
Квадратные скобки обозначают канал WiFi данного конкретного SSID.
Мы видим, что первые два SSID находятся в нашем коде.Вот почему они помечены как *.
И в скобках это значение RSSI для всех доступных сетей Wi-Fi. Мы знаем, что значение RSSI, ближайшее к 0, имеет наибольшую силу сети. В нашем случае это SSID0 с именем TechTOnions, который имеет значение -62 и является самым сильным среди двух доступных сетей.
Поэтому он подключен к TechTOnions и будет отображать IP- и MAC-адрес сети WiFi.
Подведение итогов
В этом руководстве вы узнали, как легко мы можем хранить несколько учетных данных WiFi в нашем проекте ESP32 и позволять ESP32 самому решать, какую сеть лучше всего использовать. Таким образом, наш проект на основе ESP32 всегда будет подключаться к самой надежной доступной сети Wi-Fi на основе значения RSSI.
Мы надеемся, что сегодня вы узнали что-то новое и попробуете. Если вам нравится наш учебник и вы хотите больше подобных руководств по ESP32, рассмотрите возможность подписки на нашу еженедельную рассылку новостей.
И не забудьте оставить нам комментарий после того, как попробуете этот проект с вашим ESP32.
Читайте также: