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

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

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

#include <WiFi.h>

#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("<html>");

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

client.print("<body>");

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

client.print("<form action=\"/send\">");

client.print("Enter the message: <input type=\"text\" name=\"msg\"><br>");

client.print("<input type=\"submit\" value=\"Submit\">");

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

client.print("");

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

client.println();

break;

} else {

if (currentLine.startsWith("GET /send?msg=") &&

currentLine.endsWith(" HTTP/1.1")) {

// Строка выглядит как “GET /send?msg=123+456 HTTP/1.1”

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

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

// Вывод строки на дисплей

display.clear();

display.setFont(ArialMT_Plain_10);

display.setTextAlignment(TEXT_ALIGN_LEFT);

display.drawString(0, 0, msg);

display.display();

}

currentLine = "";

}

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

currentLine += c;

}

}

}

client.stop();

Serial.println("Client Disconnected.");

}

}

Теперь можно запустить программу, открывать сервер в браузере и ввести текст - он появится на экране. Это можно использовать например, для отправки сообщений своим близким, находясь в другом городе, в каникулах, отпуске или командировке.

Разумеется, данный код может быть улучшен. Например, данная библиотека не поддерживает переносы строк, так что длинная веденная строка не поместится на экран. Читатели могут сделать это самостоятельно, для этого можно воспользоваться функциями length и substring для разбивки длинной строки на строки.

Самостоятельная работа #1: добавить к плате “пищалку” или светодиод, которая будет сигнализировать о наличии нового сообщения. При желании также можно добавить на плату кнопку “Сообщение прочитано”, которой получатель подтвердит получение. Для этого достаточно добавить переменную messageIsRead, и при получении нового сообщения устанавливать ее в False, а при нажатии кнопки менять значение на True. В общем, простор для творчества тут весьма велик.

Самостоятельная работа #2: Добавить вывод нескольких сообщений. Для этого можно добавить несколько переменных, например “String msg1, msg2, msg3”, а при получении нового сообщения добавлять его в “конец очереди”:

msg1 = msg2;

msg2 = msg3;

msg3 = msg;

Функцию вывода на экран также придется изменить.

3.13 Отправляем данные через Dropbox

Мы уже умеем выводить с ESP32 данные через встроенный веб-сервер. К сожалению, главный его недостаток - необходимость наличия статического IP-адреса, если мы хотим получать доступ извне. Это удобно, но статический IP-адрес - это обычно платная услуга, этого хотелось бы избежать.

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

Сначала нужно создать так называемое “приложение dropbox”, сделать это можно по ссылке https://www.dropbox.com/developers/apps/create:

Когда приложение создано, мы можем выбрать его в разделе My apps на странице https://www.dropbox.com/developers/apps.