Выбрать главу

float temperature = 22.5;

int humidity = 60;

int pressure = 1010;

bool doorClosed = true;

bool windowClosed = false;

Наша задача - отобразить эти данные на веб-сервере, для чего проще всего воспользоваться HTML-тегом “Table” (таблица).

Пример таблицы в HTML:

<table border = "1">

<tr>

<td>Row 1, Column 1</td>

<td>Row 1, Column 2</td>

</tr>

<tr>

<td>Row 2, Column 1</td>

<td>Row 2, Column 2</td>

</tr>

</table>

В браузере это будет выглядеть вот так:

Здесь tr - это table row, строка таблицы, а td - это элемент ячейки. Таким образом, мы можем группировать данные так, как нам удобно. Добавим таблицу в наш сервер. Для экономии места будет приведена только функция loop, остальное не изменилось.

void loop() {

// Возобновление соединения при необходимости

while (WiFi.status() != WL_CONNECTED) {

delay(500);

WiFi.begin(ssid, password);

Serial.print(".");

}

// Данные с датчиков

float temperature = 22.5;

int humidity = 60;

int pressure = 1010;

bool doorClosed = true;

bool windowClosed = false;

// Здесь можно добавить код чтения

// ...

WiFiClient client = server.available();

if (client) {

Serial.println("New Client.");

String currentLine = "";

while (client.connected()) {

if (client.available()) {

char c = client.read();

if (c == '\n') {

if (currentLine.length() == 0) {

client.println("HTTP/1.1 200 OK");

client.println("Content-type:text/html");

client.println();

client.print("<html>");

client.print("<head><title>ESP32 Server</title></head>");

client.print("<body>");

client.print("<h3>ESP32 sensors data</h3>");

client.print("<table border = \"1\">");

client.print(" <tr><td>Temperature, C</td><td>");

client.print(String(temperature)); client.print("</td></tr>");

client.print(" <tr><td>Humidity, percent</td><td>");

client.print(String(humidity)); client.print("</td></tr>");

client.print(" <tr><td>Pressure, hPa</td><td>");

client.print(String(pressure)); client.print("</td></tr>");

client.print(" <tr><td>Door closed:</td><td>");

client.print(doorClosed ? "yes" : "no"); client.print("</td></tr>");

client.print(" <tr><td>Window closed:</td><td>");

client.print(windowClosed ? "yes" : "no"); client.print("</td></tr>");

client.print("</table>");

client.print("");

client.print("</body></html>");

client.println();

break;

} else {

currentLine = "";

}

} else if (c != '\r') {

currentLine += c;

}

}

}

client.stop();

Serial.println("Client Disconnected.");

}

}

Как можно видеть, код довольно прост. Мы сформировали таблицу с нужными нам полями. Для вывода строк yes/no мы использовали конструкцию языка С doorClosed ? "yes" : "no", она позволяет выбрать одно из двух значений в зависимости от условия.

Запускаем браузер, и видим данные с нашего сервера:

Теперь мы можем оставить устройство подключенным, и наблюдать состояние дома или квартиры удаленно, с любой точки земного шара.

Самостоятельная работа #1: подключить реальные датчики, например DS1820.

Самостоятельная работа #2: Поэкспериментировать с раскраской и стилями таблицы. Например, так можно добавить красный цвет к ячейке:

<td bgcolor="#FF0000">Row 1, Column 1</td>

3.12 Делаем односторонний мессенджер

Плата ESP32 может быть включена круглосуточно, что легко позволяет использовать ее для приема входящих сообщений: достаточно лишь добавить в веб-сервер форму для отправки текстовых данных. Это позволит любому кто знает адрес сервера, зайти на страницу и оставить сообщение его владельцу.

На языке HTML код для отправки выглядит просто, достаточно добавить следующие строки:

<form action="/send">

Enter your message: <input type="text" name="msg"><br>

<input type="submit" value="Submit">

</form>

При этом страница в браузере будет иметь следующий вид:

При этом, если пользователь введет текст, например “123 456”, и нажмет кнопку “Submit”, браузером будет отправлен запрос “GET /send?msg=123+456 HTTP/1.1”, который мы можем обработать на сервере. Дальше, как говорится, дело техники - надо извлечить из строки подстроку, убрав начальные и конечные части.

Добавим код там, где проверяется начало строки:

if (currentLine.startsWith("GET /send?msg=") && currentLine.endsWith(" HTTP/1.1")) {

// String looks like GET /send?msg=123+456 HTTP/1.1

String msg = currentLine.substring(14, currentLine.length()-8);

msg.replace("+", " ");

Serial.println(msg);

}

Как можно видеть, с помощью функции substring мы взяли подстроку, пропустив 14 символов сначала (длина “GET /send?msg=”) и 8 символов с конца (длина “ HTTP/1.1”). Функция replace заменяет символы “+” на пробелы, чтобы из строки “123+456” получить “123 456”.