Как связать две esp8266
В данном руководстве мы рассмотрим организацию двусторонней передачи данных между двумя платами ESP8266 с помощью протокола ESP-NOW. Рассмотрим работу нашего проекта на примере обмена данными с датчика влажности и температуры (DHT).
У нас также есть и другие руководства по ESP8266:
Что такое ESP-NOW?
ESP-NOW – это протокол беспроводной связи от Espressif для обмена небольшими пакетами данных. Он позволяет нескольким устройствам взаимодействовать друг с другом без подключения к Wi-Fi.
Скорость обмена данными достаточно высокая, однако размер пакета ограничен 250 байтами, кроме того, протокол делает возможным как односторонний, так и двусторонний обмен данными. Последнее мы и рассмотрим в данном руководстве.
Обзор проекта
В данном проекте используется две платы ESP8266, к каждой и которых подключен датчик влажности и температуры. Каждая плата снимает показания с соответствующих датчиков и отправляет их другой плате по протоколу ESP-NOW.
В примере мы используем две платы, однако, вы можете подключить и больше.
Что нужно для проекта?
Перед началом работы убедитесь, что в среде Arduino установлена плата ESP8266. Также нам потребуется установить библиотеки для датчиков DHT.
Установка требуемых библиотек
Мы используем библиотеку Adafruit для работы с датчиками влажности и температуры. Однако, для работы с ней требуется также установить библиотеку Adafruit Unified Sensor. Для их установки выполните следующие действия:
- Откройте менеджер библиотек (Скетч>Подключить библиотеку…>Менеджер библиотек);
- Найдите «DHT» и установите данную библиотеку:
- После установки введите в поле поиска «AdafruitUnifiedSensor», пролистайте до самого низа и установите библиотеку:
После установки требуется перезагрузка среды Arduino.
Требуемые компоненты
Для проекта потребуются следующие детали:
-
;
- 2 датчика температуры и влажности DHT22 или DHT11 ; ; .
Получение MAC-адреса платы
Чтобы отправлять данные через ESP-NOW, вам нужно знать MAC-адрес плат. Каждая плата имеет уникальный MAC-адрес
В этом руководстве мы рассмотрим, как отправлять данные с ESP8266 NodeMCU на несколько плат ESP8266 (конфигурация «one-master-multi-slave») с помощью протокола ESP-NOW. Платы будем программировать используя среду разработки Arduino.
Обзор
В этом руководстве рассматриваются две задачи:
Что нам нужно?
Мы запрограммируем платы ESP8266 в среде разработки Arduino, поэтому перед тем, как продолжить, убедитесь, что эти платы установлены в вашей Arduino IDE.
Вам также понадобится несколько плат ESP8266.
Получение MAC-адреса платы
Загрузите следующий код на каждую плату-приемник, чтобы получить их MAC-адреса.
После загрузки кода нажмите кнопку RST / EN, и 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-порта, к которому подключен отправитель.
Если вы используете PuTTY, выберите «Последовательная связь», введите номер COM-порта и скорость передачи (115200), как показано ниже, и нажмите «Открыть».
Заключение
В этом руководстве вы узнали, как отправлять данные на несколько плат ESP8266 с помощью ESP-NOW (конфигурация один-ко-многим). Используйте данное руководство как базу для создания более серьезных проектов.
В данном руководстве рассмотрим, как настроить пересылку данных по схеме one-slave-multi-master на платах ESP-8266 с помощью протокола ESP-NOW. Данная конфигурация удобна, когда требуется получать данные с нескольких нод на одну плату. Платы будем программировать в среде Arduino.
У нас также есть и другие руководства по ESP-NOW на ESP8266:
Обзор проекта
Настроим плату ESP8266 для получения данных с нескольких таких же плат с использованием протокола ESP-NOW по следующей схеме:
Что будет реализовано в ходе проекта?
– Одна плата ESP8266 работает в режиме получателя;
– Несколько плат работают в режиме отправителей. В данном руководстве мы будем использовать две платы в этой роли. Но вы, конечно, можете использовать и больше;
Примечание: В документации к ESP-NOW нет таких понятий, как «отправитель/ведущий» и «получатель/ведомый», так как каждая плата может выполнять обе эти роли.
Что нам нужно для проекта?
Платы мы будем программировать в среде Arduino, а следовательно перед тем, как начать работу, убедитесь, что дополнения для ESP8266 установлены в вашей среде Arduino.
Получение МАС-адреса платы
Для того, чтобы отправлять данные по протоколу ESP-NOW вам необходимо знать МАС-адрес получателя (у каждой платы он уникален).
Вопрос в следующем: имеются 2 модуля нужно их между собой связать.
Uart -> esp -> Wifi -> esp -> uart
Я точно уверен, что это реально, но готовых реализаций не смог найти.
Поделитесь ссылочкой, кто находил.
Оценить 3 комментария
Первый - wifi AP, а второй - клиент этой wifi сети.
Как настроить esp в режиме AP и в режиме клиента, есть в примерах.
Насколько я помню, соединить 2 готовых девайса по UART посредством ESP8266 (с родной прошивкой) не так-то просто, т.к. прошивка соединяемых устройств должна быть адаптирована под использование ESP8266.
Если адаптировать прошивку соединяемых оконечных устройств нет возможности (или желания), то придётся прошивать сами модули ESP8266.
Например, этими прошивками:
После перешивки и предварительной настройки (параметры соединений запоминаются) пару ESP8266 можно использовать как прозрачный удлинитель UART (transparent bridge).
Здравствуйте! У меня есть вопрос. Как можно связать два модуля esp8266. Приведу простой пример работы этой системы.
У нас есть два Wi-Fi модуля например один находится в одном городе, а второй модуль в другом. У меня есть задача управлять сервоприводом через переменный резистор. Соответственно резистор(физический) и сервопривод находятся в разных городах и каждый подключен к wi-fi модулю. Можно ли это осуществить? Как создать между ними связь? Я знаю что можно всем этим делом управлять через телефон и через разные приложение Blynk и тому подобное. Но мне нужно так как я описал выше! Спасибо!
Средний 2 комментария
Даже если бы ваши модули были в одной комнате вы не смогли бы их связать (скорее всего) без WiFi роутера.
А если есть роутер, то сделаем еще шаг и у вас будет интернет. Все, круг замкнулся. Одинаковая схема в обоих городах. Кроме роутера подключенного к интернет нужен еще белый статический адрес на роутере в одной из точек (в той которая будет принимать подключения второй).
Кстати в вашей схеме не хватает еще управляющего устройства (или двух), которое будет собирать показания резистора и управлять сервоприводом. Сам резистор и сервопривод вряд ли справятся с передачей данных через интернет.
1. прямая дальность связи вайфай несколько сот метров. если дальше то юзай тырнетик.
2. пишешь прошивку, которая принимакет тырнет-пакеты и управляет внешними устройствами через gpio.
3. пишешь приложения на телефон которое посылает пакетики управления в твой есп.
плюс куча подводных камней.
Здесь вопрос больше по сетям, а не ESP. Как можно управлять одной есп с другой, если они подключены к одному роутеру или одна - точка доступа, а другая - её клиент? Например, слать get запрос на ip-адрес. Но сделать это через интернет сложнее, так как ip адрес ЕСП маскируется натом роутера, а ip роутера - натом провайдера. Если провайдер позволит, то покупает белый ip адрес (избавляемся от ната провайдера, роутер смотрит в инет напрямую) и настраиваем проброс портов на роутере. Тогда вторая есп будет слать тот же get запрос на белый ip роутера, роутер передаст запрос первой есп, а она выполнит команду или ответит. Но если провайдер ни на одной точке не дает белый ip (мобильные обычно не дают), то Вам нужен сервер-ретранслятор в интернете. Этим сервером при использовании blynk является сервер разработчиков, но делать связь двух есп на нем я не пробовал. Если с blynk не получится, то или искать альтернативу (например, iocontrol, или смотреть в сторону протокола MQTT и бесплатного борокера в интернете), или поднимать собственный сервер и настраивать его с нуля.
Так и свяжи их через Blynk, там телефон только для получения токена нужен, дальше они сами могут с его помощью общаться.
Читайте также: