Zápisník experimentátora
Hierarchy: ESP8266
Pri používaní ESP8266 ako webserver sa v príkladoch často stretnete so zápisom reťazcov, ktoré sú nesmierne prácne. Akákoľvek drobná zmena v HTML kóde stránky je strašne zložitá. C++11 nám umožňuje zapisovať textové reťazce pohodlnejšie. Ako na to, si vysvetlíme v tomto článku.
Takto vyzerá jednoduchý HTML kód stránky, ktorú chceme zobrazovať v prehliadači pomocou ESP8266.
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8">
<title>Hello ESP8266</title>
<style>
p { text-indent: 30px; margin: 0px; }
</style>
</head>
<body>
<h1>HELLO</h1>
<p>Hello from ESP8266.</p>
</body>
</html>
Obvykle sa v príkladoch stretnete s takýmto zápisom. Do premennej htmlPage
je vložený reťazec, ktorý má každý riadok uzatvorený v dvojitých úvodzovkách. Okrem toho musíte ešte osobitne upraviť každý výskyt znaku "
a upraviť ho na \"
, aby kompilátor nevypísal chybu. Je to pracné a neprehľadné. Akákoľvek zmena si vyžaduje obrovské úsilie, aby ste sa nepomýlili pri prepisovaní.
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include "arduino_secret.h"
ESP8266WebServer server(80);
const char htmlPage[] PROGMEM = "<html>"
"<head>"
"<meta http-equiv=\"content-type\" content=\"text/html;charset=UTF-8\">"
"<title>Hello ESP8266</title>"
"<style>"
"p { text-indent: 30px; margin: 0px; }"
"</style>"
"</head>"
"<body>"
" <h1>HELLO</h1>"
" <p>Hello from ESP8266.</p>"
"</body>"
"</html>";
void handleRoot() {
server.send(200, "text/html", htmlPage);
}
void setup(void){
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
server.on("/", handleRoot);
server.begin();
Serial.println("HTTP server started");
}
void loop(void){
server.handleClient();
}
C++11 nám poskytuje pohodlnejší spôsob na zapisovanie textových reťazcov, ktoré obsahujú HTML, XML alebo JSON. Podrobnosti nájdete na stránke Wikipedia. Textový reťazec môžete zapísať v tvare R"delimiter(text)delimiter"
. V takejto podobe je obsah premennej dobre čitateľný a prípadné zmeny urobíte ľahko. Alebo ich napíšete priamo do textu, alebo si originálny text skopírujete a vložíte do reťazca.
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include "arduino_secret.h"
ESP8266WebServer server(80);
const char htmlPage[] PROGMEM = R"=====(
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8">
<title>Hello ESP8266</title>
<style>
p { text-indent: 30px; margin: 0px; }
</style>
</head>
<body>
<h1>HELLO</h1>
<p>Hello from ESP8266.</p>
</body>
</html>
)=====";
void handleRoot() {
server.send(200, "text/html", htmlPage);
}
void setup(void){
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
server.on("/", handleRoot);
server.begin();
Serial.println("HTTP server started");
}
void loop(void){
server.handleClient();
}
Zdrojový kód sa nachádza na serveri GitHub.
01.08.2018