Цифровая электроника для начинающих - страница 31

стр.

, она позволяет выбрать одно из двух значений в зависимости от условия.


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

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


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


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

Row 1, Column 1

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

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


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



Enter your message:




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


При этом, если пользователь введет текст, например “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”.


Добавим вместо Serial.println вывод на дисплей, который мы рассмотрели в главе 3.4.

Готовый код “мессенджера” целиком приведен ниже.


#include

#include "SSD1306.h"


const char* ssid = "TP-LINK_AB11";

const char* password = "12345678";

int ledPin = 2;


WiFiServer server(8000);

SSD1306 display(0x3c, 21, 22);


void setup()

{

Serial.begin(115200);

pinMode(ledPin, OUTPUT);


// Инициализация дисплея

display.init();

display.flipScreenVertically();

display.clear();

display.setFont(ArialMT_Plain_10);

display.setTextAlignment(TEXT_ALIGN_LEFT);

display.drawString(0, 0, "App started");

display.display();


delay(10);


// Запуск WiFi

Serial.print("Connecting to ");

Serial.println(ssid);

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

delay(500);

WiFi.begin(ssid, password);

Serial.print(".");

}


Serial.println("");

Serial.println("WiFi connected.");

Serial.println("IP address: ");

Serial.println(WiFi.localIP());

server.begin();

}


void loop(){

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

delay(500);

WiFi.begin(ssid, password);

Serial.print(".");

}


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 the byte is a newline character

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

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

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

client.println();

client.print("");

client.print("ESP32 Server");

client.print("");

client.print("

ESP32 sensors data

");

client.print("

");

client.print("Enter the message:
");

client.print("");

client.print("

");

client.print("");