Общие сведения:
В этом проекте 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;
}
}

Обсуждение