ESP32 Урок 19. Wi-Fi. Режим STA (Станция)



Ну вот, наконец-то, дошли мы до той темы, которую, я думаю, многие ждали — это приём и передача данных при помощи возможностей ESP32 по беспроводной сети Wi-Fi.

С данной темой мы уже работали с применением контроллера ESP8266, причём используя различные протоколы передачи данных модели OSI, поэтому нам будет намного легче.

Мы также подробно не будем изучать протокол Wi-Fi, так как с ним работает наш контроллер аппаратно. Также помогает в этом комплект IDF. Режимы работы WiFi контроллера — это станция (или кратко STA) и точка доступа (AP). Также мы можем одновременно использовать четыре виртуальных интерфейса WiFi.

Самым простым из этих режимов является первый — режим станции.

Режим станции (STA) — это такой режим, в котором контроллер не создает собственную сеть, а подключается к любой существующей сети Wi-Fi, например, к существующей локальной сети или к другому устройству, работающему в режиме точки доступа (AP).

На данном уроке мы настроим режим станции и попробуем подключиться к существующей точке доступа, например к роутеру, который раздаёт Wi-Fi по дому. Роутер от просто точки доступа отличается тем, что трафик, идущий от станций, подключенных к нему, он транслирует во внешнюю сеть и наоборот.

Схема у нас будет простейшая — отладочная плата, подключенная к USB компьютера

 

 

А проект мы на этот раз создадим новый. Как создавать новый проект, мы знаем из урока 3.

Но тем не менее я этот процесс покажу.

Где-нибудь в районе дерева проекта вызовем контекстное меню (правый щелчок мыши) и выберем пункт New->Espressif IDF Project

 

 

Придумаем имя и жмём Finish

 

 

Как обычно, мы получим готовый проект с неким кодом в файле main.c.

Также если мы откроем файл Kconfig.projbuild, то мы также там увидим два пункта для конфигурирования имени точки доступа, к которой мы подключаемся, а также для пароля (или ключа) подключения к точке доступа.  Выше пункта ESP_WIFI_SSID добавим пункт по настройке светодиода, так как он нам пригодится для сигнализации подключения к точке доступа

 

 

А ниже пункта ESP_WIFI_PASSWORD добавим пункт для настройке максимального количества попыток подключения к точке доступа

 

 

Сохраним данный файл и добавим в дерево файл main.h следующего содержания

 

 

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

 

 

Удалим функцию event_handler вместе с телом а в функции app_main оставим только бесконечный цикл с задержкой, которую немного увеличим

 

 

Попробуем собрать проект, он скорей всего соберётся. Также зайдём в конфигуратор, проверим, что у нас правильный порт для светодиода, а также сразу в данные поля можем занести имя точки доступа и пароль

 

 

Объявим глобальный указатель для имени в логах

 

 

В функции app_main объявим переменную типа структуры для получения свойств соединения впоследствии

 

 

Код скорей всего не соберётся. Но так как мы основной код по работе с WiFi вынесем в отдельный модуль, то в нём и подключим необходимые библиотеки, которые будут видны и здесь. Поэтому давайте данный модуль создадим. Это будут два файла следующего содержания

 

 

 

Не забываем также подключить модуль в файле CMakeLists.txt, находящемся в каталоге main

 

set(COMPONENT_SRCS "main.c wifi.c")

 

Также подключим наш модуль в файле main.h

 

 

Теперь код скорей всего соберётся.

Вернёмся в файл main.c и в функции app_main произведём первичную инициализацию ножки GPIO для светодиода

 

 

Инициализируем память NVS, произведя её очистку в случае нехватки памяти или обнаружения новой версии

 

 

NVS — это такой раздел памяти контроллера, в котором хранятся некоторые настройки или свойства, так как это такая файловая система, основанная на конструкциях ключ-значение. Думаю, впоследствии будет смысл познакомиться с данной памятью поподробнее и посвятить ей отдельный урок.

Перейдём в файл wifi.c и добавим функцию инициализации WiFi, в которой произведём сначала первичную инициализацию стека TCP/IP при помощи специальной функции

 

 

Мы используем здесь макрос ESP_ERROR_CHECK вместо привычного возврата результата кода ошибки и отображения его в логе. Данный макрос проверяет возврат из функции кода ошибки, и при нехорошем результате приостанавливает работу программы, для чего внутри используется утверждение assert. Также данный макрос выведет соответствующее сообщение в терминал.

Объявим для данной функции прототип в заголовочном файле и вызовем её в функции app_main файла main.c

 

 

Вернёмся в файл wifi.c в тело функции инициализации wifi_init_sta, в котором при помощи определённой функции IDF создадим цикл событий по умолчанию и с помощью другой функции произведём инициализацию станции по умолчанию

 

 

Затем объявим и проинициализируем переменную типа структуры управления настройками WiFi, такими так буфер RX/TX, структура WiFi NVS и т. д, после чего инициализируем WiFi данными настройками

 

 

Далее объявим две переменных-идентификатора экземпляров зарегистрированных обработчиков событий. Один идентификатор нужен будет для обработки любого события, другой — для обработки события получения IP, а, следовательно, и удачного соединения с точкой доступа

 

 

Выше функции wifi_init_sta добавим функцию-обработчик событий

 

 

Пусть пока будет пустотелый. Вернёмся в функцию wifi_init_sta и зарегистрируем обработчики для наших событий

 

 

А так как имя функции-обработчика в параметрах у нас одно и то же, то и функция будет одна.

 

 

Далее объявим и проинициализируем переменную типа структуры для свойств станции, полям которой мы присвоим SSID и пароль, которые мы добавили в конфигураторе, а также зададим режим шифрования

 

 

Установим режим работы WiFi как станции

 

 

Установим нормальный режим работы WiFI, иначе по умолчанию это один из энергосберегающих режимов

 

 

Применяем конфигурационные установки для нашей станции

 

 

Добавим глобальный указатель для имени лога

 

 

Вернёмся в функцию wifi_init_sta и запустим станцию, о чём сообщаем в логе

 

 

А вот теперь нам пригодятся знания, полученные на прошлом уроке по работе с группами событий в системе реального времени FreeRTOS.

Для этого сначала в файле wifi.h подключим необходимый заголовочный файл

 

 

Вернёмся в файл wifi.c и объявим глобальную переменную типа структуры для группы событий, а также макросы для двух событий

 

 

Перейдём в пока ещё пустотелый обработчик событий event_handler и при условии, что мы попали в обработчик именно в момент старта WiFi, вызовем нужную функцию

 

 

Объявим глобальную переменную для подсчёта количества попыток соединения

 

 

Вернёмся в обработчик  и добавим ещё одну ветку в наше условие на случай, если мы сюда попадём в случае отсутствия соединения. Мы здесь будем наращивать счётчик попыток и сравнивать его с нашим максимальным числом из конфигуратора, если ещё не достигли, то будем заново пытаться соединиться, а если достигли, то установим соответствующий бит в группе событий

 

 

Добавим ещё одну ветку, в которую мы попадём в случае если у нас произошло удачное соединение и мы получили адрес IP. Если мы попадём в данную ветку, то получим указатель на структуру события, отобразим полученный адрес в терминале, сбросим количество попыток соединения, установим соответствующий бит в группе событий и зажжём светодиод

 

 

Вернёмся в нашу функцию инициализации wifi_init_sta и создадим группу событий

 

 

Пока не тестируя наши биты, соберём код и прошьём контроллер. Если всё нормально, то у нас произойдёт успешное соединение с точкой доступа

 

 

Также мы видим, что светодиод загорелся

 

 

В случае потери соединения с точкой доступа произойдёт пять попыток повторного соединения

 

 

А вот если связь возобновится по истечении пяти попыток, то мы уже скорей всего не соединимся с точкой доступа. С этим мы сейчас и поработаем.

Но для начала вернёмся в функцию инициализации wifi_init_sta и протестируем наши биты

 

 

Именно протестируем, так как третий параметр у нас pdFalse, который, как мы уже прекрасно знаем отвечает за сброс битов и мы их не сбрасываем, а оставляем в том состоянии, в каком они есть. Также pdFalse в четвёртом параметре мы также хорошо знаем что означает. Благодаря ему мы ждём (наша задача находится в блокированном состоянии), когда будет установлен любой из битов, что означает, что наступило хотя бы одно событие.

Отобразим в логе смысл обнаруженного события

 

 

Разрегистрируем наши обработчики и удалим группу событий

 

 

Если мы проверим работу кода сейчас, то скорей всего при разрыве соединения у нас вообще не будет попыток соединения, так как произойдёт второе событие и мы провалимся вниз и уйдём из функции.

Теперь перейдём в функцию app_main файла main.c и в бесконечном цикле попробуем отследить состояние нашего соединения

 

 

При нулевом статусе мы просто покажем SSID, а при другом — погасим светодиод и попробуем ещё раз запустить функцию инициализации для повторного соединения

 

 

Если кто-то испугается, что такой множественный способ инициализации будет отъедать кучу, то можно это проверить в самом начале бесконечного цикла

 

 

Соберём код, прошьём контроллер.

Всё у нас также нормально соединится, если есть точка доступа и совпал пароль.

Запомним размер кучи

 

 

Посмотрим, что произойдёт при потере соединения.

Во-первых, у нас погаснет светодиод

 

 

Во-вторых, в терминале мы увидим, что у нас идут постоянные перезапуски инициализации и попытки соединения.

А при возобновлении соединения мы опять нормально соединимся и получим нормальный статус соединения

 

 

Размер кучи у нас также остался прежним (даже немного убавился).

Попробуем также обратиться к нашему узлу, так сказать, попинговать его

 

 

Итак, на данном уроке нам удалось соединиться с WiFi-роутером, создав соединение в режиме STA, что, надеюсь, в дальнейшем нам позволит работать с многими сетевыми протоколами и обеспечить беспроводную передачу данных с использованием контроллера ESP32.

Всем спасибо за внимание!

 

Данная статья в Дзен.

 

 

Предыдущий урок Программирование МК ESP32 Следующий урок

 

Исходный код

 

 

Недорогие отладочные платы ESP32 можно купить здесь: Недорогие отладочные платы ESP32

 

 

Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)

ESP32 Wi-Fi. Режим STA (Станция)

 

Смотреть ВИДЕОУРОК в Дзен (нажмите на картинку)

ESP32 Wi-Fi. Режим STA (Станция)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*