Микроконтроллер esp32 примечателен многим, однако его наиболее известной характеристикой (которая, кстати, вполне себе «перевернула» рынок в своё время) является встроенная возможность осуществления связи по bluetooth и wi-fi. Эти способы коммуникации позволяют микроконтроллеру осуществлять как скоростную связь с устройствами, так и энергосберегающую. Именно об этих способах мы и поговорим в этой статье.
Достаточно часто перед использующими этот микроконтроллер встаёт задача связи его с другими аналогичными устройствами. Поэтому мне показалось, что будет достаточно полезным рассмотреть 2 достаточно распространённых способа коммуникации устройств. Начнём мы с энергоэффективного протокола BLE.
Что такое Bluetooth? Это беспроводной стандарт связи для обмена данными на коротком расстоянии. Как и WiFi, Bluetooth работает на частоте 2.4 ГГц.
Управление ESP8266 (ESP-01/ESP-12) через Интернет. Как настроить?
Источник картинки: wikihandbk.com
Bluetooth применяется во множестве разных ситуаций, где требуется беспроводное управление и передача данных. Например:
- Передача аудиоданных в наушники или аудиосистему автомобиля
- Коммуникация между периферийными устройствами и ПК
- Передача данных между Bluetooth-устройствами
Что такое Bluetooth Low Energy (BLE)? – это энергосберегающий вариант Bluetooth, и его главная область применения – это передача маленьких порций данных на короткие расстояния. Этот стандарт предназначен для очень маломощных проектов, питаемых от батареек-таблеток.
Источник картинки: wikihandbk.com
В отличие от Bluetooth, который включён постоянно, BLE-устройство постоянно находится в спящем режиме, кроме ситуаций, когда оно подключено к другим устройствам. Благодаря этому BLE-устройства потребляют очень мало питания. Эта функция крайне полезна для коммуникации типа M2M (англ. «machine-to-machine», т.е. «между машинами»), т.к. позволяет делать проекты из маленьких устройств, питаемых от батареек и работающих очень долгое время.
Из-за этого стандарт BLE идеален для проектов, где требуется периодический обмен небольшими порциями данных – например, в медицине, фитнесе, отслеживании объектов, навигации, безопасности и домашней автоматизации.
О других различиях между Bluetooth и BLE можно посмотреть в таблице ниже:
Bluetooh Low Energy (BLE) | Bluetooh: Базовый режим (Base Rate, BR) / Дополнительный режим (Enhanced Date Rate, EDR) |
|
Оптимизирован для: | Передача данных “короткими очередями” | Постоянный поток данных |
Диапазон частот | ISM-диапазон 2.4 ГГц (2.402 — 2.480 ГГц) |
ISM-диапазон 2.4 ГГц (2.402 — 2.480 ГГц) |
Каналы | 40 каналов с диапазоном 2 МГц (3 канала для оповещений, 37 каналов для данных) |
79 каналов с диапазоном 1 МГц |
Использование каналов |
Псевдослучайная перестройка рабочей частоты (FHSS) |
Псевдослучайная перестройка рабочей частоты (FHSS) |
Модуляция | GFSK | GFSK, π/4 DQPSK, 8DPSK |
Энергопотребление | Примерно от 0.01х до 0.5х относительно опорной величины (зависит от способа применения) |
1 (опорная величина) |
Скорость передачи данных | * LE2М РНУ: 2 Мбит/с * LE1М РНУ: 1 Мбит/с * LE Coded РНУ (S=2): 500 Кбит/с * LE Coded РНУ (s=8): 125 Кбит/с |
* EDR РНУ (8DPSK): 3 Мбит/с * EDR РНУ (п/4 DQPSK): 2 Мбит/с * BR PHY (GFSK): 1 Мбит/с |
Макс. мощность | * Класс 1: 100 мВТ (+20 дБм) * Класс 1.5: 10 мВт (+10 дБм) * Класс 2: 2.5 мВт (+4 дБм) * Класс 3: 1 мВт (0 дБм) |
* Класс 1: 100 мВт (+20 дБм) * Класс 2: 2.5 мВт (+4 дм) * Класс 3: 1 мВт (0 дБм) |
Сетевая топология | * “Точка-точка” (включая “пикосеть”) * Вещание * Ячеистая сеть |
“Точка-точка” (включая “пикосеть”) |
Лучший мод (Immersive Armors) для The Elder Scrolls V: Skyrim Установка мода
В стандарте Bluetooth Low Energy предусмотрено два типа устройств: сервер и клиент.
Сервер оповещает о своём сущестWowании, чтобы его могли найти другие устройства, а также содержит данные для считывания клиентом. Клиент сканирует близлежащие устройства и, найдя искомый сервер, подключается к нему и начинает прослушивать входящие данные. Этот тип коммуникации называют «сквозным» или «точка-точка».
Стандарт BLE предусматривает и другие типы подключения:
- Режим вещания. Сервер передаёт данные нескольким клиентам, подключённым к нему.
- Ячеистая сеть. Все устройства подключены друг к другу. Это тип соединения, когда в сети несколько устройств и у каждого из них по несколько подключений.
GATT — расшифровывается как «generic attributes» («общие атрибуты»). Эта спецификация определяет иерархию данных, которую BLE-устройство демонстрирует другим BLE-устройствам, подключённым к нему. Другими словами, GATT определяет то, как два BLE-устройства отправляют и получают стандартные сообщения.
Источник картинки: wikihandbk.com
На верхнем уровне этой иерархии – профиль, состоящий из одного или более сервисов. Каждый сервис содержит как минимум одну характеристику, а также может отсылать к другим сервисам.
Характеристики всегда находятся внутри сервисов, и это то место, где, собственно, хранятся данные во всей этой GATT-иерархии. Характеристика имеет уникальный идентификатор (UID), значение и свойства.
Кроме того, после значения характеристики могут идти дескрипторы, которые дополняют метаданные, содержащиеся в объявлении характеристики.
Каждый сервис, характеристика и дескриптор имеют собственный UUID (англ. «universally unique identifier», что переводится как «универсальный уникальный идентификатор»). UUID – это уникальное 128-битное (16-байтное) число вроде такого:
Сокращённые UUID для всех сервисов, характеристик, профилей и т.д. можно найти на сайте Bluetooth SIG.
Но если вашему приложению нужен собственный UUID, его можно сгенерировать при помощи этого UUID-генератора.
Итак, теперь, когда мы немного ознакомились с теоретической стороной вопроса, посмотрим, как это можно было бы реализовать на базе esp32.
Так как мы осуществляем связь двух модулей esp32 между собой — нам понадобится серверный и клиентский код.
Посмотрим общий случай такой реализации и начнём с серверной части:
Сначала мы подключаем необходимые библиотеки:
#include #include #include
Генерируем с помощью сервиса, указанного выше, уникальные UUID:
#define SERVICE_UUID «4fafc201-1fb5-459e-8fcc-c5c9c331914b» #define CHARACTERISTIC_UUID «beb5483e-36e1-4688-b7f5-ea07361b26a8»
BLEDevice::init(«Eto moye imya»);
BLEServer *pServer = BLEDevice::createServer();
Создаём сервис и характеристику с указанными UUID:
BLEService *pService = pServer->createService(SERVICE_UUID); BLECharacteristic *pCharacteristic = pService->createCharacteristic( CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE );
После чего устанавливаем начальное значение характеристики, запускаем сервис и начинаем широковещательную рассылку уведомлений:
pCharacteristic->setValue(«Всем привет!»); pService->start(); BLEAdvertising *pAdvertising = BLEDevice::getAdvertising(); pAdvertising->addServiceUUID(SERVICE_UUID); pAdvertising->setScanResponse(true); pAdvertising->setMinPreferred(0x06); pAdvertising->setMinPreferred(0x12); BLEDevice::startAdvertising(); Serial.println(«Характеристика установлена! Теперь вы можете прочитать её на телефоне!»);
После прошивки программы в микроконтроллер в мониторе COM-порта появляются приветственные сообщения:
Теперь посмотрим на клиентскую часть.
Также подключаем необходимую библиотеку:
#include «BLEDevice.h»
Далее указываем UUID сервиса и характеристики (должны совпадать с таковыми на сервере):
static BLEUUID serviceUUID(«4fafc201-1fb5-459e-8fcc-c5c9c331914b»); static BLEUUID charUUID(«beb5483e-36e1-4688-b7f5-ea07361b26a8»);
Так как клиентская часть содержит достаточно большое количество служебного кода, в разы превышающего серверный код, имеет смысл остановиться на главном: после осуществления поиска и успешного соединения с сервером клиент обновляет характеристику сервиса на удалённом сервере:
if (connected) < String newValue = «Time since boot: » + String(millis()/1000); Serial.println(«Setting new characteristic value to «» + newValue + «»»); pRemoteCharacteristic->writeValue(newValue.c_str(), newValue.length()); >else if(doScan)< BLEDevice::getScan()->start(0); >
И в мониторе COM-порта клиента эта картина выглядит следующим образом:
Таким образом, используя энергоэффективный метод связи с использованием BLE, вы можете реализовывать свои интересные применения этого типа связи.
Поговорим теперь и о связи с использованием Wi-Fi
Здесь одно устройство также будет играть роль сервера, а другое — клиента.
Структура вкладок сервер выглядит следующим образом:
Структура вкладок клиента:
Вообще говоря, схема работы выглядит примерно так: «я сам себе и дедушка, и любимый внук» 🙂
То есть: 1) запущена wi-fi сеть; 2) запущен сервер и на клиенте, и на точке доступа;
Подробнее рассмотрим код сервера на точке доступа
Для работы нам понадобятся следующие библиотеки:
#include «WiFi.h» #include «ESPAsyncWebServer.h» #include
Конфигурируем точку доступа, а также определяем адрес сервера на клиенте, куда будем обращаться с точки доступа:
const char* ssid = «ESP32-Access-Point»; const char* password = «123456789»; const char* SlaveServerName = «http://192.168.4.2/post»;
Запускаем сервер на 80 порту:
AsyncWebServer server(80); void setup() < Serial.begin(115200); Serial.println(); Serial.print(«Setting AP (Access Point)…»); WiFi.softAP(ssid, password); IPAddress IP = WiFi.softAPIP(); Serial.print(«AP IP address: «); Serial.println(IP); Server ();//запустили сервер для входящих POST-запросов >
Функция Server () , вызывающаяся в последней строке (выше), служит для прослушивания входящих POST-запросов и реализована во вкладке server :
void Server () < server.on( «/post», HTTP_POST, [](AsyncWebServerRequest * request)<>, NULL, [](AsyncWebServerRequest * request, uint8_t *data, size_t len, size_t index, size_t total) < // IsReadyForRead = false; for (size_t i = 0; i < len; i++) < Serial.write(data[i]); >Serial.println(); request->send(200); >); server.begin(); >
Ну и в методе loop () — мы вызываем тестовую функцию TestSender , которая отсылает сообщение клиенту:
void loop() void TestSender () < WiFiClient client; HTTPClient http; // Your Domain name with URL path or IP address with path http.begin(client, SlaveServerName); // отсылаем то, что получили // If you need an HTTP request with a content type: text/plain http.addHeader(«Content-Type», «text/plain»); int httpResponseCode = http.POST(«Привет!»); Serial.print(«HTTP Response code: «); Serial.println(httpResponseCode); // Освобождаем ресурсы http.end(); >
Теперь рассмотрим код клиента точки доступа
Подключаем необходимые библиотеки:
#include #include #include #include «ESPAsyncWebServer.h»
Задаём логин и пароль точки доступа, к которой будем подключаться:
const char* ssid = «ESP32-Access-Point»; const char* password = «123456789»;
Определяем адрес для обращений на сервере (у точки доступа):
const char* MainServerName = «http://192.168.4.1/post»;
Подключаемся к точке доступа и запускаем сервер для прослушки входящих POST-запросов:
AsyncWebServer server(80); void setup() < Serial.begin(115200); WiFi.begin(ssid, password); Serial.println(«Connecting»); while(WiFi.status() != WL_CONNECTED) < delay(500); Serial.print(«.»); >Serial.println(«»); Serial.print(«Connected to WiFi network with IP Address: «); Serial.println(WiFi.localIP()); Server ();//запустили сервер для входящих POST-запросов >
Функция Server () — в последней строке (выше) полностью аналогична таковой у точки доступа и служит для прослушивания POST-запросов:
void Server () < server.on( «/post», HTTP_POST, [](AsyncWebServerRequest * request)<>, NULL, [](AsyncWebServerRequest * request, uint8_t *data, size_t len, size_t index, size_t total) < // IsReadyForRead = false; for (size_t i = 0; i < len; i++) < Serial.write(data[i]); >Serial.println(); request->send(200); >); server.begin(); >
Ну и в методе loop () — мы вызываем тестовую функцию TestSender () , которая отсылает сообщение на POST-сервер, запущенный на точке доступа:
void loop() void TestSender () < WiFiClient client; HTTPClient http; http.begin(client, MainServerName); // отсылаем то, что получили // If you need an HTTP request with a content type: text/plain http.addHeader(«Content-Type», «text/plain»); int httpResponseCode = http.POST(«И тебе привет!»); Serial.print(«HTTP Response code: «); Serial.println(httpResponseCode); // Освобождаем ресурсы http.end(); >
После включения обоих модулей esp32 вот так эта картина выглядит в мониторе COM-порта точки доступа:
Библиотеку для работы wi-fi варианта можно скачать здесь: ESPAsyncWebServer
Все необходимые библиотеки для работы BLE-варианта устанавливаются автоматически при инсталляции поддержки esp32 в Arduino IDE.
Код сервера и клиента для BLE можно скачать здесь, для wi-fi варианта — тут.
Код для обоих вариантов полностью рабочий и протестирован. «Бери и используй!» 🙂
Вот такими интересными способами вы можете наладить связь между 2-мя и более устройствами esp32. Успехов в проектировании!
НЛО прилетело и оставило здесь промокоды для читателей нашего блога:
— 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS .
Источник: habr.com
Руководство по ESP-NOW
В данном руководстве рассмотрим как использовать протокол беспроводной связи ESP-NOW для обмена короткими пакетами данных между платами ESP32.
Вы также можете ознакомиться с другими руководствами для ESP-NOW с ESP32:
Знакомство с ESP-NOW
После сопряжения устройств друг с другом соединение остается постоянным, то есть при перезапуске платы автоматически подключаются друг к другу.
ESP-NOW поддерживает следующие функции:
- Зашифрованная и незашифрованная одноадресная передача;
- Смешанные зашифрованные и незашифрованные одноранговые сети;
- Полезная нагрузка может составлять до 250 байт ;
- Выполнение обратных функций, которые могут служить для обратной связи.
Технология ESP-NOW также имеет следующие ограничения:
- В режиме станции поддерживается не более 10 зашифрованных одноранговых узлов; Не более 6 в режиме SoftAP или SoftAP + Station;
- Поддерживается несколько незашифрованных одноранговых узлов, однако их общее количество должно быть не больше 20, включая зашифрованные одноранговые узлы;
- Полезная нагрузка ограничена 250 байтами.
Проще говоря, ESP-NOW – это протокол связи, который можно использовать для обмена небольшими сообщениями (до 250 байт) между платами ESP32.
Односторонняя связь ESP-NOW
Рассмотрим пример, когда плата ESP32 отправляет данные на другую плату ESP32.
Эту конфигурацию очень легко реализовать, и она отлично подходит для отправки данных с одной платы на другую, таких как показания датчиков или команды включения и выключения GPIO.
Отправка данных по структуре one-master-multiple-slaves
Одна плата ESP32 отправляет команды на разные платы ESP32. Эта конфигурация идеальна для создания чего-то вроде пульта дистанционного управления. В доме может быть несколько плат ESP32, которые управляются одной основной платой ESP32.
Отправка данных по структуре one-slave-multi-master
Эта конфигурация подходит, если вы хотите собрать данные с нескольких плат на одну. Это может быть конфигурация веб – сервера для отображения данных из других плат, например:
Примечание: в документации ESP-NOW нет такого понятия, как «sender/master» и «receiver/slave». Каждая плата может быть отправителем и получателем. Однако для ясности мы будем использовать термины «отправитель» и «получатель» или «master» и «slave».
Двусторонняя связь ESP-NOW
С ESP-NOW каждая плата может быть отправителем и получателем одновременно.
Например, у вас может быть две платы, взаимодействующие друг с другом.
Вы можете добавить больше плат в эту конфигурацию и получить нечто похожее на сеть (все платы ESP32 будут взаимодейстWowать друг с другом).
Таким образом, ESP-NOW также подходит для построения сети, в которой может быть несколько плат ESP32, обменивающихся данными друг с другом.
Получение MAC-адреса платы
Чтобы отправлять сообщения через ESP-NOW, вам нужно знать MAC-адреса плат. Каждая плата имеет уникальный MAC-адрес
Загрузите следующий код на каждую плату-приемник, чтобы получить их MAC-адреса.
#ifdef ESP32
Serial . begin ( 115200 ) ;
Serial . println ( ) ;
Serial . print ( «ESP Board MAC Address: » ) ;
Serial . println ( WiFi . macAddress ( ) ) ;
После загрузки кода нажмите кнопку RST / EN, и MAC-адрес должен отобразиться в мониторе порта.
Стоит записать MAC-адрес платы на бирке, чтобы было удобнее идентифицировать каждую плату.
Односторонняя связь «точка-точка»
Чтобы ознакомиться с принципом работы беспроводной связи ESP-NOW, создадим простой проект, который будет отправлять сообщение от одной ESP32 к другой. Одна ESP32 будет «отправителем», а другая – «получателем».
- Запуск протокола ESP-NOW;
- Создание обратной функции OnDataSent, которая будет выполняться при отправке сообщения.;
- Добавка MAC-адреса получателя.
- Отправка сообщения.
Со стороны платы №2 в скетче должно быть:
- Запуск протокола ESP-NOW;
- Создание обратной функции OnDataRecv, которая будет выполняться при получении сообщения.;
- Внутри этой функции должно быть реализовано сохранение сообщения в переменной, для выполнения задач с этой информацией.
ESP-NOW работает с обратными функциями, которые вызываются, когда устройство получает сообщение или когда сообщение отправлено.
Полезные функции ESP-NOW
Вот краткое о наиболее важных функциях ESP-NOW:
esp_now_ init() | Инициализирует ESP-NOW. Перед инициализацией ESP-NOW необходимо подключиться к Wi-Fi. |
esp_now_add_ peer() | Требуется, чтобы связать устройство и передать в качестве аргумента MAC-адрес устройства. |
esp_now_ send() | Отправляет данные с помощью ESP-NOW. |
esp_now_register_send_ cb() | Создает обратную функцию, которая вызывается при отправке данных. Когда сообщение отправлено, функция сообщает была ли доставка успешной. |
esp_now_register_rcv_ cb() | Создает обратную функцию, которая вызывается при получении данных. Когда сообщение получено, функция сообщает было ли получение успешным. |
Для получения дополнительной информации об этих функциях прочтите документацию.
Скетч для платы-отправителя ESP32
Вот код для платы-отправителя. Скопируйте код в Arduino IDE, но пока не загружайте его. Вам нужно будет сделать несколько исправлений.
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp-now-esp32-arduino-ide/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
// ЗАМЕНИТЕ МАС-АДРЕСОМ ПЛАТЫ-ПОЛУЧАТЕЛЯ
uint8 _ t broadcastAddress [ ] = < 0xFF , 0xFF , 0xFF , 0xFF , 0xFF , 0xFF >;
// Структура в скетче платы-отправителя
// должна совпадать с оной для получателя
typedef struct struct _ message <
char a [ 32 ] ;
> struct_message ;
// Создаем структуру сообщения myData
struct _ message myData ;
// Обратная функция отправки
void OnDataSent ( const uint8_t * mac_addr , esp_now_send_status _ t status ) <
Serial . print ( «rnLast Packet Send Status:t» ) ;
Serial . println ( status == ESP_NOW_SEND _ SUCCESS ? «Delivery Success» : «Delivery Fail» ) ;
void setup ( ) <
// Запускаем монитор порта
Serial . begin ( 115200 ) ;
// Выбираем режим WiFi
WiFi . mode ( WIFI_STA ) ;
// Запускаем протокол ESP-NOW
if ( esp_now_init ( ) != ESP_OK ) <
Serial . println ( «Error initializing ESP-NOW» ) ;
// Регистрируем отправку сообщения
esp_now_register_send_cb ( OnDataSent ) ;
// Указываем получателя
esp_now_peer_info _ t peerInfo ;
memcpy ( peerInfo . peer_addr , broadcastAddress , 6 ) ;
peerInfo . channel = 0 ;
peerInfo . encrypt = false ;
if ( esp_now_add_peer (
Serial . println ( «Failed to add peer» ) ;
// Указываем данные, которые будем отправлять
strcpy ( myData . a , «THIS IS A CHAR» ) ;
myData . b = random ( 1 , 20 ) ;
myData . c = 1.2 ;
myData . d = «Hello» ;
myData . e = false ;
// Отправляем сообщение
esp_err _ t result = esp_now_send ( broadcastAddress , ( uint8_t * )
if ( result == ESP_OK ) <
Serial . println ( «Sent with success» ) ;
Serial . println ( «Error sending the data» ) ;
delay ( 2000 ) ;
Как работает код?
#include»esp_now.h»;
#include «WiFi.h»;
uint8 _ t broadcastAddress [ ] = < 0x30 , 0xAE , 0xA4 , 0x07 , 0x0D , 0x64 >;
typedef struct struct _ message <
char a [ 32 ] ;
> struct_message ;
struct _ message myData ;
void OnDataSent ( const uint8_t * mac_addr , esp_now_send_status _ t status ) <
Serial . print ( «rnLast Packet Send Status:t» ) ;
Serial . println ( status == ESP_NOW_SEND _ SUCCESS ? «Delivery Success» : «Delivery Fail» ) ;
Serial . begin ( 115200 ) ;
WiFi . mode ( WIFI_STA ) ;
if ( esp_now_init ( ) != ESP_OK ) <
Serial . println ( «Error initializing ESP-NOW» ) ;
esp_now_register_send _ cb ( OnDataSent ) ;
// Зарегистрируем получателя
esp_now_peer_info _ t peerInfo ;
memcpy ( peerInfo . peer_addr , broadcastAddress , 6 ) ;
peerInfo . channel = 0 ;
peerInfo . encrypt = false ;
// Добавляем пира
if ( esp_now_add_peer (
Serial . println ( «Failed to add peer» ) ;
strcpy ( myData . a , «THIS IS A CHAR» ) ;
myData . b = random ( 1 , 20 ) ;
myData . c = 1.2 ;
myData . d = «Hello» ;
myData . e = false ;
esp_err _ t result = esp_now_send ( broadcastAddress , ( uint8_t * )
if ( result == ESP_OK ) <
Serial . println ( «Sent with success» ) ;
Serial . println ( «Error sending the data» ) ;
delay ( 2000 ) ;
Скетч для платы-получателя
Rui Santos
Complete project details at https://RandomNerdTutorials.com/esp-now-esp32-arduino-ide/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
// Структура должна совпадать со структурой
// на плате-отправителе
typedef struct struct _ message <
char a [ 32 ] ;
> struct_message ;
// Создаем myData
struct _ message myData ;
// Обратная функция при получении
void OnDataRecv ( const uint8_t * mac , const uint8_t * incomingData , int len ) <
Serial . print ( «Bytes received: » ) ;
Serial . println ( len ) ;
Serial . print ( «Char: » ) ;
Serial . println ( myData . a ) ;
Serial . print ( «Int: » ) ;
Serial . println ( myData . b ) ;
Serial . print ( «Float: » ) ;
Serial . println ( myData . c ) ;
Serial . print ( «String: » ) ;
Serial . println ( myData . d ) ;
Serial . print ( «Bool: » ) ;
Serial . println ( myData . e ) ;
Serial . println ( ) ;
void setup ( ) <
// Запускаем монитор порта
Serial . begin ( 115200 ) ;
// Выставляем режим работы WiFi
WiFi . mode ( WIFI_STA ) ;
// Запускаем протокол ESP-NOW
if ( esp_now_init ( ) != ESP_OK ) <
Serial . println ( «Error initializing ESP-NOW» ) ;
// Получаем состояние отправки
esp_now_register_recv_cb ( OnDataRecv ) ;
Как работает код?
#include «esp_now.h»;
#include «WiFi.h»;
typedef struct struct _ message <
char a [ 32 ] ;
> struct_message ;
struct _ message myData ;
void OnDataRecv ( const uint8_t * mac , const uint8_t * incomingData , int len ) <
Serial . print ( «Bytes received: » ) ;
Serial . println ( len ) ;
Serial . print ( «Char: » ) ;
Serial . println ( myData . a ) ;
Serial . print ( «Int: » ) ;
Serial . println ( myData . b ) ;
Serial . print ( «Float: » ) ;
Serial . println ( myData . c ) ;
Serial . print ( «String: » ) ;
Serial . println ( myData . d ) ;
Serial . print ( «Bool: » ) ;
Serial . println ( myData . e ) ;
Serial . println ( ) ;
Serial . begin ( 115200 ) ;
WiFi . mode ( WIFI_STA ) ;
if ( esp_now_init ( ) != ESP_OK ) <
Serial . println ( «Error initializing ESP-NOW» ) ;
esp_now_register_recv _ cb ( OnDataRecv ) ;
Демонстрация
Загрузите скетчи на платы ESP32 отправителя, откройте два окна в среде Arduino. Один для получателя, а другой для отправителя. Откройте монитор порта для каждой платы. Для каждой платы должен быть свой COM-порт. Это то, что вы должны получить на стороне отправителя.
И это то, что вы должны получить на стороне приемника. Обратите внимание, что переменная Int изменяется при каждом запуске (потому что мы отправляем рандомное число).
Заключение
Мы постарались сделать примеры максимально простыми, чтобы вы лучше понимали, как все работает. Есть много функций, связанных с ESP-NOW, которые могут быть полезны в ваших проектах, например: управление и удаление пиров, сканирование ведомых устройств и так далее Чтобы просмотреть их все в Arduino IDE перейдите Файл > Примеры > ESP32 > ESPNow и выберите один из скетчей. Кроме того, с ESP-NOW каждая плата может быть отправителем и получателем одновременно, и одна плата может отправлять данные на несколько плат, а также получать данные с нескольких плат. Эти темы будут рассмотрены в будущих руководствах, так что следите за обновлениями. Кстати, максимальное расстояние, при котором можно установить стабильное соединение между платами – 220 метров (без препятствий)
Надеемся, вам понравилось.
Данный материал был переведен с сайта RandomNerdTutorials.com. Авторские права принадлежат ее автору — Rui Santos. Автор продает очень полезные и толковые курсы по ESP8266 / ESP32 (на английском языке), ознакомиться с которыми можно по ссылке.
Вопросы по прошивке и работе с кодом лучше писать напрямую автору в комментариях к статье (на англ. языке)
Источник: voltiq.ru
Как проверить ESP на автомобиле и узнает работает ли система
Как проверить ESP на автомобиле? Подключите тестер или диагностические колодки в машине, чтобы считать неисправности и увидеть актуальные ошибки. Кроме того, проверить работоспособность можно опытным путем. Для этого нужно либо принудительно с кнопки выключить опцию быстро разогнать авто как минимум до 60 км/ч либо с включенной функцией войти в поворот.
В случае с разгоном индикация отключения в нормальной ситуации должна погаснуть. А в случае поворота у Вас возникнет ощущение, что машина самостоятельно подруливает, считывая траекторию дороги. Подробнее, как проверить ESP, продиагностировать неисправности и какие наиболее характерные отказы случают, разберем далее.
Как проверить включена или нет?
ESP отвечает за курсовую устойчивость, т.е. за активную безопасность при эксплуатации на дорогах. Её отказ или принудительное отключение может повлечь за собой повлечь потерю управляемости при входе в повороты и объезде препятствий. Конечно, сразу оговоримся, что за исключением ситуаций, когда отключение оправдано.
Как проверить: работает ли ESP на автомобиле или была деактивирована? Есть несколько способов, которые помогут определить, активна ли функция электронной стабилизации на вашем транспортном средстве:
- Практически на всех авто, оснащённых функций курсовой устойчивости, в салоне на центральной консоли как правило располагается кнопка отключения системы «ESP off«. С целью обеспечения безопасности эксплуатации на некоторых марках и моделях (особенно на отечественных) предусмотрено принудительное включение данной системы. Проверить, работоспособна ЕСП, можно следующим образом: разогнать резко машину и примерно на скорости около 60 км/ч индикация отключения функции курсовой устойчивости должна погаснуть. Таким образом машина даст понять, что опция включилась в общий алгоритм функционирования электронных помощников автомобиля.
- Посредством тестовой поездки. Так как метод не совсем безопасный, лучше всего проводить проверку без других участников дорожного движения. Так как суть работы функции — предотвращение заноса и боковое скольжение машины, то диагностика ESP в этом случае заключается в маневрах на больших скоростях при поворотах. Принцип действия опции заключается в притормаживании одного из колёс, чтобы при создать его центром поворота. Дело в том, что когда машина входит резко в поворот, одинаковый угол колёс создаёт недостаточную поворачиваемость кузова, из-за которой транспортное средства может не вписаться в поворот. А когда одно из колёс заторможено, то у него малый угол поворота, и тогда ТС получает дополнительный запас по углу и траектории. Поэтому для ЕСП проверка системы может состоять в тестовой проездке, когда нужно прислушиваться к своим ощущениям. При резком повороте на рулевом колесе чувствуется невидимая рука, которая помогает подруливать и копировать траекторию поворота.
Как узнать, есть ли в авто?
Другой вопрос, может у Вас и нет опции на машине? Поэтому нужно точно знать, есть ли функция на авто? Проверить наличие достаточно просто:
- Наиболее простой способ узнать о наличии ЕСП в своём автомобиле, это если вы знаете название комплектации. Тогда достаточно ввести её название в поисковик и на экране сразу высветятся опции, доступные для данной модели.
- Наличие или отсутствие функции поддержания устойчивости зашифровано в ВИН-коде транспортного средства. VIN-код — это 17-значный набор букв и цифр, который, как ДНК для человека, поддерживает его уникальность. Его можно найти в паспорте транспортного средства (в настоящее время он заменяется на электронный носитель), а также на кузове автомобиля (очень часто он размещается на информационной табличке в проёмах дверей). В интернете много программ, которые предлагают отчёт комплектации автомобиля по ВИН-коду, однако большинство из них платные. Как вариант, можно обратиться к официальному дилеру, предоставив документы на авто. Как правило, они не отказывают в просьбе владельцам. Дело в том, что заводы производители предоставляют салонам доступ к базе данных, в которой содержатся описания всех автомобилей, официально проданных на территории РФ.
- По информативности щитка приборов. В самом начале запуска на современных автомобилях происходит самодиагностирование электронных всех элементов. На практике это выражается в кратковременном подсвечивании различных значков на панели. Таким образом, если при включении зажигания у вас появляется индикация «ESP» или значок жёлтого цвета «машина+скользкая дорога», а потом тухнет, то ваш автомобиль оснащён сервисом поддержания курсовой устойчивости.
- Если у вас или какого-то знакомого есть диагностический сканер или прибор самодиагностики, то в этом случае наличие ЕСП можно определить по списку электронных систем, которые поддаются сканированию в памяти блока управления.
- На портале подбора запасных частей для автомобиля найти по ВИН-коду свою модель и выпавшем каталоге элементов отыскать ESP или деталь, принадлежащую этой системе. Если каталог выдаёт номер, стоимость и сроки поставки запчасти, то такая система точно входит в комплектацию вашего автомобиля.
Как проверить работоспособность?
Но если Вы уверены в наличии опции на своем авто, но она, на Ваш взгляд не работает, как проверить систему ESP? И желательно так, чтобы не тратить лишних денег и времени на поездку на СТО. Самый лучший вариант, как проверить ЕСП, — прочитать ошибки блока управления. Продиагностировать и проверить работоспособность его можно 2 способами:
- Специального прибора (сканера ошибок). Сканер на основе программного обеспечения официального дилера обеспечивает наиболее точную диагностику, так как оборудование периодически обновляется и свежие прошивки получают от завода-производителя напрямую.
- Диагностические колодки, очень популярные и распространённые в настоящее время. Представляют небольшую коробочку с контактами, которая вставляется в разъём автомобиля. По беспроводной связи на гаджет (планшет, смартфон) выдаётся информационная таблица с кодами ошибок. Также имеется возможность продиагностировать все элементы в онлайн-режиме.
Частые неисправности
Какие наиболее характерные отказы, которые встречаются при диагностике:
- Сканер выдаёт рекомендацию проверить датчик ESP — это колёсный датчик, который предназначен для считывания скорости вращения колеса и передачи информации в блок управления, который на её основании выстраивает алгоритм работы функции. Обычно он находится рядом со ступицей, и поэтому часто подвергается воздействию грязи, осадкам и механическим воздействиям. Поэтому он сам или его проводка является самым слабым звеном системы курсовой устойчивости. Бывает так, проверка ESP не показал ошибку, однако из-за того, что датчик также ещё и относится к ABS, система работает некорректно.
- Датчик угла поворота рулевого колеса — ещё один из информативных элементов. На основании анализа от этого датчика блок принимает решения о притормаживании какого-либо из колёс. Обычно находится в подрулевом шлейфе или на корпусе электроусилителя руля.
Надеемся, что изложенный материал был вам интересен. Ждём ваших комментариев в отзывах.
Источник: avtodigitals.ru