Как связать две esp8266

Обновлено: 19.04.2024

В данном руководстве мы рассмотрим организацию двусторонней передачи данных между двумя платами ESP8266 с помощью протокола ESP-NOW. Рассмотрим работу нашего проекта на примере обмена данными с датчика влажности и температуры (DHT).

title

У нас также есть и другие руководства по ESP8266:

Что такое ESP-NOW?

ESP-NOW – это протокол беспроводной связи от Espressif для обмена небольшими пакетами данных. Он позволяет нескольким устройствам взаимодействовать друг с другом без подключения к Wi-Fi.

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

overview

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

overview+mac

В данном проекте используется две платы ESP8266, к каждой и которых подключен датчик влажности и температуры. Каждая плата снимает показания с соответствующих датчиков и отправляет их другой плате по протоколу ESP-NOW.

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

Что нужно для проекта?

Перед началом работы убедитесь, что в среде Arduino установлена плата ESP8266. Также нам потребуется установить библиотеки для датчиков DHT.

Установка требуемых библиотек

Мы используем библиотеку Adafruit для работы с датчиками влажности и температуры. Однако, для работы с ней требуется также установить библиотеку Adafruit Unified Sensor. Для их установки выполните следующие действия:

  • Откройте менеджер библиотек (Скетч>Подключить библиотеку…>Менеджер библиотек);
  • Найдите «DHT» и установите данную библиотеку:

DHT_library

  • После установки введите в поле поиска «AdafruitUnifiedSensor», пролистайте до самого низа и установите библиотеку:

ADAfruit_library

После установки требуется перезагрузка среды Arduino.

Требуемые компоненты

Для проекта потребуются следующие детали:

    • ;
    • 2 датчика температуры и влажности DHT22 или DHT11 ; ; .

    Получение MAC-адреса платы

    Чтобы отправлять данные через ESP-NOW, вам нужно знать MAC-адрес плат. Каждая плата имеет уникальный MAC-адрес

    В этом руководстве мы рассмотрим, как отправлять данные с ESP8266 NodeMCU на несколько плат ESP8266 (конфигурация «one-master-multi-slave») с помощью протокола ESP-NOW. Платы будем программировать используя среду разработки Arduino.

    title

    Обзор

    esp-now

    В этом руководстве рассматриваются две задачи:

    Что нам нужно?

    Мы запрограммируем платы ESP8266 в среде разработки Arduino, поэтому перед тем, как продолжить, убедитесь, что эти платы установлены в вашей Arduino IDE.

    Вам также понадобится несколько плат ESP8266.

    Получение MAC-адреса платы

    Загрузите следующий код на каждую плату-приемник, чтобы получить их MAC-адреса.

    После загрузки кода нажмите кнопку RST / EN, и MAC-адрес должен отобразиться на мониторе порта.

    mac-address

    Стоит записать MAC-адрес платы на бирке, чтобы было удобнее идентифицировать каждую плату.

    mac

    Код для платы-отправителя

    Следующий код отправляет данные нескольким (в нашем случае, двум) платам ESP по протоколу ESP-NOW. В коде нужно указать MAC-адрес ваших плат-приемников, а также добавить или удалить строки кода в зависимости от количества плат-приемников.

    mac_addr [ 0 ] , mac_addr [ 1 ] , mac_addr [ 2 ] , mac_addr [ 3 ] , mac_addr [ 4 ] , mac_addr [ 5 ] ) ;

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

    Подключаем библиотеки espnow.h и ESP8266WiFi.h

    Записываем МАС-адреса получателей

    В нашем случае – два получателя.

    Затем создаем структуру, в которой находятся наши данные. Мы ее назвали test_struct и она содержит две целочисленные переменные.

    Создаем новую переменную в test_struct и называем ее test, в ней будут храниться значения переменных.

    Функция OnDataSent()

    mac_addr [ 0 ] , mac_addr [ 1 ] , mac_addr [ 2 ] , mac_addr [ 3 ] , mac_addr [ 4 ] , mac_addr [ 5 ] ) ;

    setup()

    В функции setup(), запускаем монитор порта для отладки:

    Выставляем режим клиента WiFi:

    Запускаем протокол ESP-NOW:

    Указываем назначение платы. В этом случае ESP8266 – отправитель, поэтому указываем:

    После инициализации протокола определяем действия при отправке. В данном случае указываем ранее созданную функцию OnDataSent().

    Добавляем пиры

    Если у вас больше плат – скопируйте строки выше и укажите ее МАС-адрес:

    loop()

    Присваиваем значение каждой переменной:

    Отправка одинаковых данных на несколько плат

    Цикл loop() выполняется каждые 2000мс (2 секунды)

    Отправка разных данных на платы

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

    Если вы хотите отправлять разные данные, нужно создать несколько структур, например:

    В данном случае структура одного вида (test_struct), однако, возможно отправлять и структуры разных видов.

    Далее, присваиваем рандомные числа переменным их наших структур.

    И наконец, нужно вызвать функцию esp_now_send() для каждого получателя.

    Для примера, отправляем данные из структуры на плату с MAC-адресом broadcastAddress1.

    Отправляем данные из test2 на вторую плату:

    mac_addr [ 0 ] , mac_addr [ 1 ] , mac_addr [ 2 ] , mac_addr [ 3 ] , mac_addr [ 4 ] , mac_addr [ 5 ] ) ;

    Код для платы-приемника

    Загрузите следующий код на платы-приемники (в нашем случае используются две платы-приемника).

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

    Аналогично отправителю, сначала подключаем библиотеки:

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

    Создаем переменную test_struct с названием myData.

    Копируем данные из переменной incomingData и записываем в myData.

    Итак, структура myData содержит несколько переменных со значениями, полученных от платы-отправителя. Для доступа, например к переменной x, вызовите функцию myData.x.

    В функции setup(), запускаем монитор порта.

    Выставляем режим клиента WiFi.

    Запускаем протокол ESP-NOW:

    Указываем, что ESP8266 – получатель.

    Регистрируем callback-функцию. В данном случае – OnDataRecv(), которую мы создали ранее.

    Демонстрация

    Включите все платы, откройте монитор порта Arduino для COM-порта, к которому подключен отправитель.

    delivery_success

    delivery_fail

    Если вы используете PuTTY, выберите «Последовательная связь», введите номер COM-порта и скорость передачи (115200), как показано ниже, и нажмите «Открыть».

    putty


    Заключение

    В этом руководстве вы узнали, как отправлять данные на несколько плат ESP8266 с помощью ESP-NOW (конфигурация один-ко-многим). Используйте данное руководство как базу для создания более серьезных проектов.

    В данном руководстве рассмотрим, как настроить пересылку данных по схеме one-slave-multi-master на платах ESP-8266 с помощью протокола ESP-NOW. Данная конфигурация удобна, когда требуется получать данные с нескольких нод на одну плату. Платы будем программировать в среде Arduino.

    title

    У нас также есть и другие руководства по ESP-NOW на ESP8266:

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

    Настроим плату ESP8266 для получения данных с нескольких таких же плат с использованием протокола ESP-NOW по следующей схеме:

    one-slave-multiple-masters-ESP8266

    Что будет реализовано в ходе проекта?

    – Одна плата ESP8266 работает в режиме получателя;

    – Несколько плат работают в режиме отправителей. В данном руководстве мы будем использовать две платы в этой роли. Но вы, конечно, можете использовать и больше;

    Примечание: В документации к ESP-NOW нет таких понятий, как «отправитель/ведущий» и «получатель/ведомый», так как каждая плата может выполнять обе эти роли.

    Что нам нужно для проекта?

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

    Получение МАС-адреса платы

    Для того, чтобы отправлять данные по протоколу ESP-NOW вам необходимо знать МАС-адрес получателя (у каждой платы он уникален).

    Вопрос в следующем: имеются 2 модуля нужно их между собой связать.
    Uart -> esp -> Wifi -> esp -> uart
    Я точно уверен, что это реально, но готовых реализаций не смог найти.
    Поделитесь ссылочкой, кто находил.

    Оценить 3 комментария

    vitfil

    vitfil

    Первый - wifi AP, а второй - клиент этой wifi сети.
    Как настроить esp в режиме AP и в режиме клиента, есть в примерах.

    0crash0

    Насколько я помню, соединить 2 готовых девайса по UART посредством ESP8266 (с родной прошивкой) не так-то просто, т.к. прошивка соединяемых устройств должна быть адаптирована под использование ESP8266.

    Если адаптировать прошивку соединяемых оконечных устройств нет возможности (или желания), то придётся прошивать сами модули ESP8266.

    Например, этими прошивками:

    После перешивки и предварительной настройки (параметры соединений запоминаются) пару ESP8266 можно использовать как прозрачный удлинитель UART (transparent bridge).

    Здравствуйте! У меня есть вопрос. Как можно связать два модуля esp8266. Приведу простой пример работы этой системы.
    У нас есть два Wi-Fi модуля например один находится в одном городе, а второй модуль в другом. У меня есть задача управлять сервоприводом через переменный резистор. Соответственно резистор(физический) и сервопривод находятся в разных городах и каждый подключен к wi-fi модулю. Можно ли это осуществить? Как создать между ними связь? Я знаю что можно всем этим делом управлять через телефон и через разные приложение Blynk и тому подобное. Но мне нужно так как я описал выше! Спасибо!

    Средний 2 комментария

    gbg

    Даже если бы ваши модули были в одной комнате вы не смогли бы их связать (скорее всего) без WiFi роутера.
    А если есть роутер, то сделаем еще шаг и у вас будет интернет. Все, круг замкнулся. Одинаковая схема в обоих городах. Кроме роутера подключенного к интернет нужен еще белый статический адрес на роутере в одной из точек (в той которая будет принимать подключения второй).
    Кстати в вашей схеме не хватает еще управляющего устройства (или двух), которое будет собирать показания резистора и управлять сервоприводом. Сам резистор и сервопривод вряд ли справятся с передачей данных через интернет.

    Zarom

    1. прямая дальность связи вайфай несколько сот метров. если дальше то юзай тырнетик.
    2. пишешь прошивку, которая принимакет тырнет-пакеты и управляет внешними устройствами через gpio.
    3. пишешь приложения на телефон которое посылает пакетики управления в твой есп.
    плюс куча подводных камней.

    Здесь вопрос больше по сетям, а не ESP. Как можно управлять одной есп с другой, если они подключены к одному роутеру или одна - точка доступа, а другая - её клиент? Например, слать get запрос на ip-адрес. Но сделать это через интернет сложнее, так как ip адрес ЕСП маскируется натом роутера, а ip роутера - натом провайдера. Если провайдер позволит, то покупает белый ip адрес (избавляемся от ната провайдера, роутер смотрит в инет напрямую) и настраиваем проброс портов на роутере. Тогда вторая есп будет слать тот же get запрос на белый ip роутера, роутер передаст запрос первой есп, а она выполнит команду или ответит. Но если провайдер ни на одной точке не дает белый ip (мобильные обычно не дают), то Вам нужен сервер-ретранслятор в интернете. Этим сервером при использовании blynk является сервер разработчиков, но делать связь двух есп на нем я не пробовал. Если с blynk не получится, то или искать альтернативу (например, iocontrol, или смотреть в сторону протокола MQTT и бесплатного борокера в интернете), или поднимать собственный сервер и настраивать его с нуля.

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

    Читайте также: