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