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