Esp32 не подключается к wifi
Всем привет! Это уже пятая часть цикла "Знакомимся с ESP32". В этой части мы разберём Wi-Fi, в следующей части - подключение OLED дисплея, а затем соберём свой первый проект: часы с режимом энергосбережения и подкачкой времени через Wi-Fi. Поехали!
В первой части я упомянул, что у ESP32 два ядра. Для чего это нужно? Те, кто работали мучились с ESP8266 знают, что такое Wi-Fi. Это такая штука, которая даёт доступ в интернет, но пожирает всё процессорное время. В ESP32 эта проблема решена: одно ядро занимается задачами Wi-Fi, а на другом крутится прошивка.
Кто ещё не понял преимущество ESP32 перед Arduino: Arduino Mega стоит 600 рублей, Ethernet Shield - ещё 500. А за 300-400 рублей вы можете получить 240 МГц процессор и Wi-Fi. И кучу других прибамбасов (ну, ЦАП, например).
Но вернёмся к нашим баранам. Как я уже сказал ранее, ожидать, пока ESP достучится до сервера нам не придётся: этим займётся другое ядро. Для примера вот небольшой скетч, который реализует сервер Wi-Fi. Вот ещё, который ищет сети Wi-Fi и пишет их в Serial.
На этом пока всё. Ждите 6 часть!
Arduino & Pi
1.1K поста 18.1K подписчиков
Правила сообщества
В нашем сообществе запрещается:
• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)
• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском
• Рассуждать на темы политики
Исходные материалы данного урока тут.
На основе полученных данных можно сделать более интересные вещи.
- Веб-сервер ESP32 (ESP8266) в среде Arduino IDE
Исходные материалы данного урока тут.
- Подключаем DHT11, DHT22 к ESP32, ESP8266. Выводим показание на веб-странице.
Исходные материалы данного урока тут.
- ESP32 и ESP8266 выводим статус на веб страницу и на OLED дисплей
Исходные материалы данного урока тут.
Надеюсь моя информация будет полезной.
Спасибо! Всем добра!
Esp8266 нужен совет
Прошу совета у ардуинщиков и еспешников.
Второй год занимаюсь с соседскими детьми Ардуинками частным образом. Дети от 6 до 9 класса. Ребята уже соображают лучше меня.
В основном собирают метеоприборы, но есть и другое. Работаем с уно, нано, мега. В прошлом году закупил esp32 и esp8266. Несколько esp32 использовали для светодиодных матриц 2812b. Другие для сбора данных с датчиков bme280, 1750, uv и других. Через телефон или на дисплей. Короче все работало по sda и scl.
Этим летом разобрали большинство собранных устройств, начали собирать другие. И вот тут столкнулись с проблемой.
Релюшки управляемые нулем и единицей отказываются переключаться от esp8266 и d1 mini. От есп32, меги, уно, нано работают.
Для проверки подключили адресные матрицы. Результат ноль. Сажали рабочии светодиоды через резисторы на землю - не управляются.
Даже самый примитивный код типа:
void setup() <
pinMode(13, OUTPUT);
>
void loop() digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
>
не работает. На еsp8266 нумерация gpio не совпадает с d или пином. Проверяли разные номера. Подключали к разным пинам. Например, ставили пин 4, цепляли рабочий светодиод ко всем выводам, кроме питания и земли поочередно. Ставили принтлайн, в мониторе порта показывается переключение.
Несколько детей и я ищем решение по тематическим форумам. Везде указывают на несоответствие gpio нумерации и нумерации пинов. Например gpio2 это пин 4.
Контроллеры и датчики через i2c работают отлично. А вот на пинах пусто.
Проблема еще в том, что сейчас нано, уно подорожали сильно. Закупил для ребят с Али больше 10 esp8266 версии 340 (у меня 2101).
Ребята получат контроллеры, которыми не смогут выдавать сигналы на пины.
Куда копать, как заставить esp8266 менять состояние пинов? Вернеее не так. Как определить какой именно номер d будет переключаться по команде на пин 2?
Плату в АрдуиноИДЕ версии 1.8.5 я выбираю правильно. Порт и скорост так же.
В сетях Wi-Fi микроконтроллер ESP32 может работать и как станция, и как точка доступа, и в обоих режимах одновременно. В этом руководстве мы покажем, как настроить ESP32 в качестве точки доступа с использованием среды программирования Arduino IDE.
В большинстве проектов мы подключали микроконтроллер ESP32 к беспроводному маршрутизатору. При этом появляется доступ к ESP32 через локальную сеть. Тогда маршрутизатор служил точкой доступа, а ESP32 был настроен как станция. А для управления микроконтроллером ESP32 необходимо было подключиться к маршрутизатору (локальной сети).
Но если вы настроите микроконтроллер ESP32 как точку доступа (как в местах общественного беспроводного доступа), вы сможете подключиться к ESP32 с помощью любого устройства с интерфейсом Wi-Fi без необходимости соединения с маршрутизатором.
Простыми словами, когда вы настраиваете ESP32 как точку доступа, вы создаёте свою собственную сеть Wi-Fi, а находящиеся поблизости устройства с интерфейсом Wi-Fi (станции) могут подсоединяться к микроконтроллеру (например, смартфон или компьютер).
Здесь мы покажем, как настроить ESP32 как точку доступа для своего проекта с веб-сервером. В этом случае вам не понадобится подключаться к маршрутизатору для управления микроконтроллером ESP32. Так как ESP32 не подключается далее к более широкой сети (в отличие от маршрутизатора), она называется мягкая точка доступа (soft Access Point).
Установка ESP32 в Arduino IDE
Для среды Arduino IDE существует дополнение, которое позволяет программировать микросхему ESP32 посредством этой среды и её языка программирования.
Код для создания точки доступа на ESP32
В этом примере мы модифицируем веб-сервер на микроконтроллере ESP32 из прошлого руководства, чтобы добавить возможность работы в качестве точки доступа. То, что мы здесь представим, должно отлично работать с любым примером, представляющим собой веб-сервер на ESP32.
Загрузите приведённый ниже код, чтобы настроить микроконтроллер ESP32 как точку доступа.
Для работы с Wi-Fi понадобится встроенная библиотека WiFi.h (исходники). В большинстве примеров вам надо знать имя сети и пароль от него. После окончания работы желательно вызывать метод WiFi.disconnect(true);.
Базовый минимальный пример
Сначала рассмотрим базовый пример для общего понимания. Все пояснения в комментариях.
Теперь можно писать более сложные примеры.
Получить IP-адреса
В пассивном режиме без входа в сеть вы получите IP-адрес, равный 0.0.0.0. Если нужно получить реальный адрес, то скетч нужно переписать. Добавим возможность входа в сеть, используя учётные данные.
Теперь вы получите реальный IP-адрес. Узнав адрес через WiFi.localIP(), вы можете в командной строке ввести команду ping ESP_ADDRESS (подставьте ваш адрес), чтобы убедиться, что устройство находится в сети. Пригодится для отладки примеров.
Метод WiFi.getHostname() возвращает имя платы espressif. По идее по этому имени тоже можно обращаться через команду ping espressif, но у меня этот вариант не заработал.
Также привёл другие вызовы функций, которые встречаются в библиотеке.
Другой вариант получения IP-адреса через лямбда-функции.
Ещё один пример получения IP-адреса разными способами. На этот раз обойдёмся без лямбда-функции. Как и в предыдущем примере мы отслеживаем событие SYSTEM_EVENT_STA_GOT_IP и при его наступлении вычисляем адрес.
Адрес вычисляем тремя способами. Первый способ самый простой, вызываем функцию localIP() и получаем готовый результат. Второй способ - получаем информацию из WiFiEventInfo_t через его поле got_ip. Третий способ - используем класс IPAddress. Два последних способа даны для общего развития, пользуйтесь первым.
Узнать настройки Wi-Fi модуля
Для скетча нам не понадобится вводить пароль от Wi-Fi, достаточно просто включить сам Wi-Fi на плате и узнать его Mac-адрес, запустить диагностику, узнать локальный адрес.
WiFiScan
Встроенный пример Examples/WiFi/WiFiScan служит для сканирования WiFi-сети. Выводит число найденных точек и их названия.
В скетче используются следующие функции:
- WiFi.mode(WIFI_STA) - устанавливает нужный режим
- WiFi.disconnect() - завершает соединение
- WiFi.scanNetworks() - сканирует сети и возвращает число найденных точек доступа
- WiFi.RSSI(i) - возвращает уровень сигнала по индексу
- WiFi.SSID(i) - возвращает имя точки доступа по индексу
Сканируем WiFi-сеть. Расширенный вариант
Чтобы просканировать текущую WiFi-сеть, нам понадобятся учётная запись для входа в неё (идентификатор и пароль). После успешного входа запускаем сканирование через функцию WiFi.scanNetworks(), которая вернёт информацию о всех точках доступа с сопутствующими свойствами.
Для удобства часть кода поместим в отдельные функции: scanNetworks() и connectToNetwork() (её можно использовать при использовании контроллера в качестве веб-клиента.
Обратите внимание, что мы получаем IP-адрес два раза. Первый раз при выходе в интернет, а второй раз - когда закрываем WiFi-соединение. Во втором случае IP-адрес будет равен 0.0.0.0
В мониторе порта выводится следующая информация (часть данных я убрал в целях безопасности).
Точка доступа
Плата ESP32 может работать как точка доступа. Для первого знакомства получим базовую информацию о точке доступа через доступные функции. Мы можем установить собственные значения для SSID и пароля (пароль можно даже не указывать, чтобы сеть была открытой).
После загрузки скетча мы получим IP-адрес платы. В настройках компьютера или смартфона должна появиться созданная точка доступа. Кстати, когда пробовал вариант с паролем, то точка доступа не создалась почему-то.
Отслеживаем момент подключения и отключения устройства к точке доступа
За соответствующие события отвечают SYSTEM_EVENT_AP_STACONNECTED и SYSTEM_EVENT_AP_STADISCONNECTED.
Mac-адрес для точки доступа
В первом примере с получением настроек модуля мы вычисляли Mac-адрес через функцию WiFi.macAddress. Существует также функция WiFi.softAPmacAddress(), когда плата работает в режиме точки доступа.
Включаем поддержку IPv6
Мы можем включить поддержку IPv6 и получить адрес в этом формате. Включение поддержки IPv6 происходит при помощи функции softAPenableIpV6(). Вызовем функцию при событии SYSTEM_EVENT_AP_START, когда активируется точка доступа.
После включения поддержки в событии SYSTEM_EVENT_AP_STA_GOT_IP6 (получение адреса) узнаём IPv6-адрес.
Сколько устройств подключено к точке доступа
Узнать число устройств, которые в данный момент подключены к точке доступа, можно через функцию softAPgetStationNum(). После запуска скетча подключите телефон и другие устройства к точке доступа, чтобы увидеть изменения.
Это черновик статьи.
Здесь я постараюсь описывать варианты решения проблем со стабильностью прошивки. Если у вас есть что добавить, то отписываемся через обратную связь.
При некоторых ситуациях ESP8266 может работать не стабильно, то теряется связь, то зависает или перезагружается. Нормальное состояние работы прошивки - это когда время работы модуля исчисляется месяцами, если конечно электрики не подведут..
Причины, из-за которых невозможно зайти на веб интерфейс (модуль не пингуется):
1. Модуль завис или постоянно перезапускается.
2. Потеряна связь по WI-FI.
Как определить какая именно причина недоступности модуля в Вашем случае ? :
Если причина в связи Wi-Fi , то на дисплеях данные будут меняться, так же будут отрабатываться функции модуля, например функция KEY у прерываний. Термостат и Логический модуль будут отрабатывать действия при изменений внешних условий.
При обрыве связи Wi-FI время работы(Uptime) не сбрасывается.
Решение проблем с зависанием и перезапуском модуля
Хотя в модуле реализован механизм перезапуска при зависании (Watchdog), но в некоторых случаях он не спасает. Чаще этот механизм работает и модуль просто перезапускается.
Частые причины зависаний и перезапуска:
1. Не хватает тока от блока питания, требуется не менее 300мА.
2. Помехи по питанию. Спасает подключение электролита рядом с модулем на 200 мкф и больше. Рекомендуется установка керамического конденсатора на 0.1 мкф.
3. Импульсные помехи вблизи модуля. Необходимы как можно короткие провода к устройствам и/или оптическая развязка.
4. Мало свободного ОЗУ. Не старайтесь собирать прошивку с максимальным количеством функций. Если объём свободного ОЗУ меньше 12кб (для SSL функций меньше 25кб) , то возможны проблемы в работе.
Решение проблем с обрывами связи WI-FI
2. Конфликт IP адресов в сети. Попробуйте задать другой IP адрес вручную в настройках модуля.
3. Роутер отключает wifi связь устройству из-за бездействия. Помогает включение какой либо отправки на сервисы статистики.
4. Плохая совместимость с роутером. Точных данных по этой проблеме нет. Может помочь настройка параметров роутера, к сожалению эта настройка уменьшает скорость работы сети Wi-Fi:
-Ширина канала ставится 20мбит/с вместо автовыбора 20/40.
-Уменьшаем скорость сети путем выбора стандарта WI-FI вместо IEEE 802.11n ставим IEEE 802.11g или даже IEEE 802.11b.
В некоторых случаях более новый SDK может работать стабильнее, чем рекомендуемый SDK 1.3.0. Но последние SDK более ресурсоёмкие и количество полезных функций влазит меньше в прошивку.
Самый оптимальный вариант - это использовать отдельный роутер для сети модулей ESP8266, например купив в китае 3G/4G Router за $ 7 .
Читайте также: