КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

Обмен данными по UDP (Piranha ESP32 в качестве клиента)

Общие сведения:

В этом проекте Piranha ESP32 будет подключаться к точке доступа WiFi и посылать данные по UDP протоколу. При нажатии на подключенную кнопку будет послан байт со значением 0x1, при отжатии кнопки - байт со значением 0x0. Нажмите здесь для перехода на страницу проекта сервера

При использовании двух Piranha ESP32, на одной из которых работает проект сервера, а на другой проект клиента (этот проект), будет загораться светодиод подключенный к одной Piranha ESP32 при нажатии на модуль кнопки подключенный к другой Piranha ESP32.

Для работы этого проекта необходимо использовать библиотеку AsyncUDP. Библиотека устанавливается вместе с пакетом поддержки ESP32 для Arduino IDE. Если у Вас ещё не установлена поддержка ESP32, то узнать как это сделать можно по этой ссылке.

Сервер UDP работает асинхронно, для обработки пакетов достаточно один раз вызвать метод udp.onPacket() указав в качестве параметра указатель на функцию обработки пакета (в данном случае функция parsePacket). Функция parsePacket() будет вызываться каждый раз при получении нового пакета UDP.

UDP (англ. User Datagram Protocol) — протокол пользовательских датаграмм. UDP предоставляет ненадёжный сервис, и датаграммы могут прийти не по порядку, дублироваться или вовсе исчезнуть без следа. UDP подразумевает, что проверка ошибок и исправление либо не нужны, либо должны исполняться в приложении.

Видео:

редактируется ...

Нам понадобится:

Подключение:

Модуль Кнопка Piranha ESP32
G GND
V 5V
S 1

Скетч проекта:

// Подключаем библиотеки
#include "WiFi.h"
#include "AsyncUDP.h"

// Определяем вывод кнопки
const uint8_t KEY_PIN = 1;

// Создаём переменную состояния кнопки
bool keyState = false;

// Определяем название и пароль точки доступа
const char *ssid = "esp32asAP";
const char *password = "password12345";

// Определяем порт
const uint16_t port = 49152;

// Создаём объект с IP-адресом точки доступа
IPAddress addr(192, 168, 4, 1);

// Создаём объект UDP соединения
AsyncUDP udp;

// Определяем callback функцию обработки пакета
void parsePacket(AsyncUDPPacket packet)
{
    // Выводи в последовательный порт все полученные данные
    Serial.write(packet.data(), packet.length());
    Serial.println();
}

void setup()
{
    // Инициируем последовательный порт
    Serial.begin(115200);

    // Устанавливаем режим работы в качестве клиента
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);

    // Ждём подключения WiFi
    while (WiFi.waitForConnectResult() != WL_CONNECTED) {
        Serial.print(".");
        delay(100);
    }

    // Если удалось подключится по UDP
    if (udp.connect(addr, port)) {

        Serial.println("UDP подключён");

        // вызываем callback функцию при получении пакета
        udp.onPacket(parsePacket);
    }

    // Если подключение не удалось
    else {

        Serial.println("UDP не подключён");

        // Входим в бесконечный цикл
        while(1) {
            delay(1000);
        }
    }
}

void loop()
{
    delay(50);

    // Если соединение WiFi прервано
    if (WiFi.status() != WL_CONNECTED) {

        // Вызываем функцию setup(), для повторного подключения
        setup();
    }

    // Записываем состояние кнопки в переменную
    uint8_t key = digitalRead(KEY_PIN);

    // Если состояние кнопки изменилось и кнопка нажата
    if (keyState == false && key == true) {

        // Посылаем состояние кнопки
        udp.broadcastTo(&key, sizeof(key), port);
        // Меняем переменную состояния кнопки
        keyState = !keyState;
    }

    // Если состояние кнопки изменилось и кнопка не нажата
    else if (keyState == true && key == false) {

        // Посылаем состояние кнопки
        udp.broadcastTo(&key, sizeof(key), port);
        // Меняем переменную состояния кнопки
        keyState = !keyState;
    }
}

Ссылки




Обсуждение

Гарантии и возврат Используя сайт Вы соглашаетесь с условями