Общие сведения:
В этом проекте Piranha ESP32 будет работать как точка доступа WiFi и ждать данных по UDP протоколу. При получении байта с нулевым значением подключенный светодиод будет выключаться, при получении байта с ненулевым значением светодиод будет включаться. Нажмите здесь для перехода на страницу проекта клиента.
При использовании двух 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 | 3 |

Скетч проекта:
// Подключем библиотеки
#include <AsyncUDP.h>
#include <WiFi.h>
#include <WiFiAP.h>
// Определяем вывод светодиода
const uint8_t LED_PIN = 3;
// Определяем название и пароль точки доступа
const char* ssid = "esp32asAP";
const char* password = "password12345";
// Создаём объект UDP cоединения
AsyncUDP udp;
// Определяем порт
const uint16_t port = 49152;
// Определяем callback функцию обработки пакета
void parsePacket(AsyncUDPPacket packet)
{
// Записываем адрес начала данных в памяти
const uint8_t* msg = packet.data();
// Записываем размер данных
const size_t len = packet.length();
// Объект для хранения состояния светодиода в строковом формате
String state;
// Если адрес данных не равен нулю и размер данных больше нуля...
if (msg != NULL && len > 0) {
// Если первый байт данных содержит 0x1
if (msg[0] == HIGH) {
// записываем строку в объект String
state = "включён";
}
// Если первый байт данных содержит 0x0
else if (msg[0] == LOW) {
// записываем строку в объект String
state = "выключен";
}
// Меняем состояние встроенного в плату светодиода
digitalWrite(LED_PIN, msg[0]);
// Отправляем данные клиенту
packet.printf("Светодиод %s", state.c_str());
// Выводим состояние светодиода в последовательный порт
Serial.println("Светодиод " + state);
}
}
void setup()
{
// Устанавливаем режим работы вывода светодиода
pinMode(LED_PIN, OUTPUT);
// Инициируем последовательный порт
Serial.begin(115200);
Serial.println();
Serial.println("Инициируем точку доступа WiFi");
// Инициируем точку доступа WiFi
WiFi.softAP(ssid, password);
IPAddress myIP = WiFi.softAPIP();
// Выводим IP-адрес
Serial.print("IP-адрес точки доступа: ");
Serial.println(myIP);
// Инициируем сервер
if(udp.listen(port)) {
// При получении пакета вызываем callback функцию
udp.onPacket(parsePacket);
}
Serial.println("Сервер запущен.");
}
void loop()
{
delay(10);
}

Обсуждение