Взаимодействие Wi-Fi клиент-сервер между двумя платами NodeMCU ESP8266


В этой статье мы рассмотрим как установить соединение Wi-Fi (HTTP) между двумя платами ESP8266 NodeMCU для обмена данными без необходимости подключения к Интернету (вам не нужен маршрутизатор).

Мы установим один ESP8266 как точку доступа (сервер), а другой ESP8266 как станцию ​​(клиент). Затем сервер и клиент будут обмениваться данными (показаниями датчиков) через HTTP-запросы. Мы запрограммируем платы ESP8266 с помощью Arduino IDE.

Взаимодействие Wi-Fi клиент-сервер между двумя платами NodeMCU ESP8266

В этом примере мы отправим показания датчика BME280 с одной платы на другую. Приемник отобразит показания на OLED-дисплее.

Необходимые компоненты

  1. NodeMCU ESP8266 (2 шт.) (купить на AliExpress).
  2. Датчик BME280 (купить на AliExpress).
  3. Модуль OLED дисплея с диагональю 0.96 дюйма и интерфейсом I2C (купить на AliExpress).
  4. Макетная плата.
  5. Соединительные провода.

Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158

Обзор проекта

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

Схема, демонстрирующая взаимодействие Wi-Fi клиент-сервер между двумя платами NodeMCU ESP8266

  • Сервер ESP8266 создает собственную беспроводную сеть ( ESP8266 Soft-Access Point ). Таким образом, другие устройства Wi-Fi могут подключаться к этой сети ( SSID: ESP8266-Access-Point, Пароль: 123456789).
  • Клиент ESP8266 настроен как станция. Таким образом, он может подключаться к беспроводной сети сервера ESP8266.
  • Клиент может делать запросы HTTP GET к серверу, чтобы запросить данные датчика или любую другую информацию. Ему просто нужно использовать IP-адрес сервера, чтобы сделать запрос по определенному маршруту: /temperature (температура)/humidity (влажность) или /pressure (давление).
  • Сервер прослушивает входящие запросы и отправляет соответствующий ответ с показаниями.
  • Клиент получает показания и отображает их на OLED-дисплее.

Например, клиент ESP8266 запрашивает температуру, влажность и давление на сервере, отправляя запросы на IP-адрес сервера, за которым следует /температура ,/влажность и /давление, соответственно (HTTP GET).

Сервер ESP8266 прослушивает эти маршруты и при поступлении запроса отправляет соответствующие показания датчика через HTTP-ответ.

Собранная конструкция проекта показана на следующем рисунке.

Собранная конструкция проекта

Установка библиотек

Для этого урока вам необходимо установить следующие библиотеки:

Библиотеки асинхронного веб-сервера

Для обработки HTTP-запросов мы будем использовать следующие библиотеки:

Эти библиотеки не доступны для установки через Library Manager. Поэтому вам нужно распаковать библиотеки и переместить их в папку библиотек установки Arduino IDE.

Либо вы можете перейти в  меню Sketch  >  Подключить библиотеку  >  Добавить библиотеку .ZIP…  и выбрать библиотеки, которые вы только что скачали.

Библиотеки BME280

Следующие библиотеки можно установить через Arduino Library Manager. Перейдите в  Sketch  >  Include Library >  Manage Libraries  и найдите имя библиотеки.

Библиотеки I2C SSD1306 OLED

Для взаимодействия с OLED-дисплеем вам понадобятся следующие библиотеки. Их можно установить через Arduino Library Manager. Перейдите в Sketch > Include Library > Manage Libraries и найдите имя библиотеки.

#1 Сервер ESP8266 (Точка доступа)

Собранная конструкция сервера на ESP8266

Сервер ESP8266 — это точка доступа (AP), которая прослушивает запросы на /temperature (температура)/humidity (влажность) или /pressure (давление) по заданным URL-адресам. Когда он получает запросы по этим URL-адресам, он отправляет последние показания датчика BME280.

Для тестирования мы используем датчик BME280, но вы можете использовать любой другой датчик, изменив несколько строк кода (например: DHT11/DHT22 или DS18B20 ).

Принципиальная схема

Подключите ESP8266 к датчику BME280, как показано на следующей принципиальной схеме.

Принципиальная схема подключения ESP8266 к датчику BME280

BME280 ESP8266
VIN/VCC 3.3V
GND GND
SCL GPIO 5 (D1)
SDA GPIO 4 (D2)

Как видите, соединения достаточно просты.

Скетч Arduino для сервера ESP8266 №1

Загрузите следующий код на свою плату.

Как работает код

Начните с подключения необходимых библиотек. Подключите библиотеку ESP8266WiFi.h и библиотеку ESPAsyncWebServer.h для обработки входящих HTTP-запросов.

Включите следующие библиотеки для взаимодействия с датчиком BME280.

В следующих переменных определите сетевые учетные данные вашей точки доступа:

Мы устанавливаем SSID на ESP8266-Access-Point, но вы можете дать ему любое другое имя. Вы также можете изменить пароль. По умолчанию он установлен на123456789.

Создайте экземпляр для датчика BME280 под названием bme.

Создайте асинхронный веб-сервер на порту 80.

Затем создайте три функции, которые возвращают температуру, влажность и давление в виде строковых переменных.

В функции setup() инициализируйте последовательный монитор для демонстрационных целей.

Настройте ESP8266 как точку доступа с указанным ранее именем SSID и паролем.

Затем обработайте маршруты, на которых ESP8266 будет прослушивать входящие запросы.

Например, когда сервер ESP8266 получает запрос /temperature, он отправляет температуру, возвращаемую функцией readTemp() в виде символов (вот почему мы используем метод c_str()).

То же самое происходит, когда ESP получает запрос на /humidity и /pressure.

Следующие строки инициализируют датчик BME280.

Наконец, запустите сервер.

Поскольку это асинхронный веб-сервер, то в функции loop() у него ничего нет.

Тестирование сервера ESP8266

Загрузите код на плату и откройте Serial Monitor. Вы должны получить что-то вроде этого:

Тестирование сервера ESP8266 в окне монитора последовательной связи

Это означает, что точка доступа настроена успешно.

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

В смартфоне зайдите в настройки Wi-Fi и подключитесь к ESP8266-Access-Point . Пароль — 123456789.

Подключение смартфона к точке доступа на ESP8266

Подключившись к точке доступа, откройте браузер и введите 192.168.4.1/temperature.

Вы должны получить значение температуры в своем браузере:

Значение температуры в браузере

Попробуйте этот URL-адрес для влажности - 192.168.4.1/humidity.

Значение влажности в браузере

Наконец, перейдите к 192.168.4.1/pressure.

Значение давления в браузере

Если вы получаете правильные показания, это значит, что все работает правильно. Теперь вам нужно подготовить другую плату ESP8266 (клиент), чтобы она делала эти запросы для вас и отображала их на OLED-дисплее.

#2 Клиент ESP8266 (Станция)

Собранная конструкция сервера на ESP8266

Клиент ESP8266 — это станция Wi-Fi, которая подключается к серверу ESP8266. Клиент запрашивает температуру, влажность и давление с сервера, отправляя запросы HTTP GET на URL-маршруты /temperature/humidity и /pressure. Затем он отображает показания на OLED-дисплее.

Принципиальная схема

Подключите OLED-дисплей к плате ESP8266, как показано на следующей принципиальной схеме.

Принципиальная схема подключения OLED-дисплея к плате ESP8266

OLED-дисплей ESP8266
Vin 3.3В
GND GND
SCL GPIO 5 (D1)
SDA GPIO 4 (D2)

Как видите, соединения крайне просты.

Скетч Arduino для клиента ESP8266

Загрузите следующий код на другую плату ESP8266 (клиент):

Как работает код

Подключите необходимые библиотеки для подключения по Wi-Fi и выполнения HTTP-запросов:

Вам необходимо создать объект WiFiMulti.

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

Затем сохраните URL-адреса, по которым клиент будет делать HTTP-запросы. Сервер ESP8266 имеет IP-адрес 192.168.4.1, и мы будем делать запросы по URL-адресам с /temperature/humidity и /pressure.

Включите библиотеки для взаимодействия с OLED-дисплеем:

Установите размер OLED-дисплея:

Создайте объект для работы с дисплеем с размером, который вы определили ранее, и с протоколом связи I2C.

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

Установите временной интервал между каждым запросом. По умолчанию он установлен на 5 секунд, но вы можете изменить его на любой другой интервал.

В функции setup() инициализируйте OLED-дисплей:

Примечание: если ваш OLED-дисплей не работает, проверьте его адрес I2C с помощью скетча сканера I2C и измените код соответствующим образом.

Подключите клиент ESP8266 к сети сервера ESP8266.

В функции loop() мы делаем HTTP GET запросы. Мы создали функцию под названием httpGETRequest(), которая принимает в качестве аргумента URL-путь, по которому мы хотим сделать запрос, и возвращает ответ в виде строки.

Для упрощения кода вы можете использовать в своих проектах следующую функцию:

Мы используем эту функцию для получения показаний температуры, влажности и давления с сервера.

Распечатайте эти показания в последовательном мониторе для отладки.

Затем отобразите температуру на OLED-дисплее:

Влажность:

Наконец, показания давления:

Мы используем таймеры вместо задержек, чтобы делать запрос каждые x секунд. Вот почему у нас есть переменные previousMillis, currentMillis и функция millis().

Загрузите скетч на #2 ESP8266 (клиент), чтобы проверить, все ли работает правильно.

Тестирование клиента ESP8266

Расположив обе платы достаточно близко и включив питание, вы увидите, что ESP №2 получает новые показания температуры, влажности и давления каждые 5 секунд от ESP №1.

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

Тестирование работы клиента ESP8266 в окне монитора последовательной связи

Показания датчика также отображаются на OLED-дисплее.

Тестирование клиента ESP8266 на экране OLED дисплея

Вот и все! Ваши две платы ESP8266 общаются друг с другом.

Подведение итогов

В этом уроке мы показали вам, как отправлять данные с одной платы ESP8266 на другую с помощью HTTP-запросов. Этот проект может быть очень полезен, если вам нужно настроить беспроводную связь между двумя или более платами, а поблизости нет маршрутизатора.

Для демонстрационных целей мы показали, как отправлять показания датчика BME280, но вы можете использовать любой другой датчик или отправлять любые другие данные.

(Проголосуй первым!)
Загрузка...
56 просмотров

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

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