Общие сведения:
В этом проекте мы настроим Piranha ESP32 на работу в качестве точки доступа WiFi и будем управлять встроенным светодиодом через веб-сайт, размещённый на веб-сервере внутри ESP32. При подключении к серверу (через браузер с телефона или ПК), который запущен на Piranha ESP32, в браузере будет отображена страница с ссылками для управления встроенным в плату светодиодом.
Помимо библиотек WiFi
и WiFiClient
нам понадобиться библиотека WiFiAP
для создания точки доступа.
Для управления встроенным в плату светодиодом необходимо подключиться с телефона, планшета или любого другого устройства с технологией WiFi и браузером к точке доступа esp32asAP
с паролем password12345
, затем в адресной строке браузера ввести адрес точки доступа (по умолчанию 192.168.4.1
).
Видео:
редактируется ...
Нам понадобится:
Подключение:
Скетч проекта:
// Подключаем библиотеки #include <WiFi.h> #include <WiFiClient.h> #include <WiFiAP.h> // Определяем название и пароль точки доступа const char *ssid = "esp32asAP"; const char *password = "password12345"; // Создаём объект Веб-сервера WiFiServer server(80); void setup() { // Устанавливаем режим работы вывода светодиода pinMode(LED_BUILTIN, 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); // Инициируем сервер server.begin(); Serial.println("Сервер запущен."); } // Функция ответа клиенту inline bool respToClient(WiFiClient& client, String& currentLine) { // Читаем байт и выводим его в последовательный порт char c = client.read(); Serial.write(c); // Если байт - символ новой строки if (c == '\n') { // Если текущая строка пуста, значит был получен // символ новой строки два раза подряд // Это означает конец клиентского HTTP-запроса. if (currentLine.length() == 0) { // Посылаем HTTP заголовок client.println("HTTP/1.1 200 OK"); client.println("Content-type:text/html"); client.println(); // Посылаем текст страницы client.print("<html><meta charset=\"UTF-8\"><body>"); client.print( "<H1 style=\"font-size: 4em;\">Нажмите " "<a href=\"/H\">сюда</a> " "для включения светодиода.</H1>" ); client.print( "<H1 style=\"font-size: 4em;\">Нажмите " "<a href=\"/L\">сюда</a> " "для выключения светодиода.</H1>" ); client.print("</body></html>"); // посылаем пустую строку client.println(); // необходимые данные клиенту переданы - // выходим из функции с флагом true return true; } // иначе (строка не пуста) else { // стираем текущую строку currentLine = ""; } } // иначе (байт не символ новой строки), // если байт - не символ возврата каретки else if (c != '\r') { // добавляем его в текущую строку currentLine += c; } // Проверяем какой запрос сделал клиент. // Если GET /H if (currentLine.endsWith("GET /H")) { // Включаем светодиод digitalWrite(LED_BUILTIN, HIGH); } // Если GET /L if (currentLine.endsWith("GET /L")) { // Выключаем светодиод digitalWrite(LED_BUILTIN, LOW); } return false; } // Функция обработки клиента inline void handleClient(WiFiClient& client) { // выводим сообщение в последовательный порт Serial.println("Новый клиент."); //Создаём строковый объект для хранения входных данных String currentLine = ""; // Входим в цикл пока клиент подсоединён while (client.connected()) { // Если есть данные для чтения if (client.available()) { // Вызываем функцию ответа клиенту bool resp = respToClient(client, currentLine); // Если функция передала все данные клиенту if (resp == true) // прерываем цикл break; } } // Закрываем соединение client.stop(); Serial.println("Клиент отключён."); } void loop() { // Создаём объект клиента и проверяем, есть ли подключённые клиенты WiFiClient client = server.available(); // Если клиенты есть if (client) { // Вызываем функцию обработки клиента handleClient(client); } }
Обсуждение