// #define led 16
// void setup() {
// Serial.begin(115200); // Инициализация последовательного порта
// delay(10); // Задержка на 10 миллисекунд
// pinMode(led, OUTPUT);
// }
// void loop() {
// for (int i=0; i<256;i++){ //цикл повышения яркости светодиода
// analogWrite(led, i); //изменение яркости светодиода
// // Задержка на 50 миллисекунд
// delay(10);
// Serial.println(i);
// }
// for (int i=256; i>=0;i--){ //цикл повышения яркости светодиода
// analogWrite(led, i); //изменение яркости светодиода
// // Задержка на 50 миллисекунд
// delay(10);
// Serial.println(i);
// }
// delay(1000);
// }
// Загрузить библиотеку Wi-Fi
#include <WiFi.h>
// Заменить на ваши сетевые учетные данные
const char* ssid = "Название вашего WiFi";
const char* password = "Пароль вашего WiFi";
// Установить номер порта веб-сервера на 80
WiFiServer server(80);
// Переменная для хранения HTTP-запроса
String header;
// Вспомогательные переменные для хранения текущего состояния вывода
String output16State = "off";
// Назначить выходные переменные контактам GPIO
const int output16 = 16;
// Текущее время
unsigned long currentTime = millis();
// Предыдущее время
unsigned long previousTime = 0;
// Определить время ожидания в миллисекундах (пример: 2000мс = 2с)
const long timeoutTime = 2000;
void setup() {
Serial.begin(115200);
// Инициализировать выходные переменные как выходы
pinMode(output16, OUTPUT);
// Установить выходы на LOW
digitalWrite(output16, LOW);
// Подключиться к сети Wi-Fi с SSID и паролем
Serial.print("Подключение к ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Печать локального IP-адреса и запуск веб-сервера
Serial.println("");
Serial.println("WiFi подключен.");
Serial.println("IP-адрес: ");
Serial.println(WiFi.localIP());
server.begin();
}
void loop(){
WiFiClient client = server.available(); // Ожидание входящих клиентов
if (client) { // Если подключается новый клиент,
currentTime = millis();
previousTime = currentTime;
Serial.println("Новый клиент."); // вывести сообщение в последовательный порт
String currentLine = ""; // создать строку для хранения входящих данных от клиента
while (client.connected() && currentTime - previousTime <= timeoutTime) { // цикл, пока клиент подключен
currentTime = millis();
if (client.available()) { // если есть байты для чтения от клиента,
char c = client.read(); // прочитать байт, затем
Serial.write(c); // вывести его в монитор последовательного порта
header += c;
if (c == '\n') { // если байт является символом новой строки
// если текущая строка пуста, вы получили два символа новой строки подряд.
// это конец HTTP-запроса клиента, поэтому отправьте ответ:
if (currentLine.length() == 0) {
// Заголовки HTTP всегда начинаются с кода ответа (например, HTTP/1.1 200 OK)
// и типа контента, чтобы клиент знал, что идет, затем пустая строка:
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println();
// Включает и выключает GPIO
if (header.indexOf("GET /16/on") >= 0) {
Serial.println("GPIO 16 включен");
output16State = "on";
digitalWrite(output16, HIGH);
} else if (header.indexOf("GET /16/off") >= 0) {
Serial.println("GPIO 16 выключен");
output16State = "off";
digitalWrite(output16, LOW);
}
// Отображение веб-страницы HTML
client.println("<!DOCTYPE html><html>");
client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
client.println("<link rel=\"icon\" href=\"data:,\">");
// CSS-стили для кнопок включения/выключения
// Вы можете изменить атрибуты background-color и font-size по своему вкусу
client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
client.println(".button { background-color: #4CAF50; border: none; color: white; padding: 16px 40px;");
client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
// client.println(".button2 {background-color: #555555;}</style></head>");
client.println("</style></head>");
// Заголовок веб-страницы
client.println("<body><h1>ESP32 Веб-сервер</h1>");
// Отображение текущего состояния и кнопок ВКЛ/ВЫКЛ для GPIO 16
client.println("<p>Состояние GPIO 16 - " + output16State + "</p>");
// Если output26State выключен, отображается кнопка ВКЛ
if (output16State=="off") {
client.println("<p><a href=\"/16/on\"><button class=\"button\">ВКЛ</button></a></p>");
} else {
client.println("<p><a href=\"/16/off\"><button class=\"button button2\">ВЫКЛ</button></a></p>");
}
// // Отображение текущего состояния и кнопок ВКЛ/ВЫКЛ для GPIO 27
// client.println("<p>Состояние GPIO 27 - " + output27State + "</p>");
// // Если output27State выключен, отображается кнопка ВКЛ
// if (output27State=="off") {
// client.println("<p><a href=\"/27/on\"><button class=\"button\">ВКЛ</button></a></p>");
// } else {
// client.println("<p><a href=\"/27/off\"><button class=\"button button2\">ВЫКЛ</button></a></p>");
// }
client.println("</body></html>");
// HTTP-ответ заканчивается еще одной пустой строкой
client.println();
// Выход из цикла while
break;
} else { // если получен перевод на новую строку, очистить currentLine
currentLine = "";
}
} else if (c != '\r') { // если получен любой другой символ, кроме символа возврата каретки,
currentLine += c; // добавить его в конец currentLine
}
}
}
// Очистить переменную header
header = "";
// Закрыть соединение
client.stop();
Serial.println("Клиент отключен.");
Serial.println("");
}
}