Zápisník experimentátora
Hierarchy: ESP8266
In previous articles we learned how to create HTTP server using microcontroller ESP8266. So far, we've displayed static pages. Gradually, we learned to show pages that were in the source code of the program or were stored in the SPIFFS file system. Today we move a little further. We replace the static page with a dynamic page that displays temperature. Temperature will be measured using the integrated circuit DS18B20.
The ESP8266 microcontroller has a program that displays a single page. The page shows the current room temperature. The HTML of the page is created using the Bootstrap library, which ensures responsive design. The page displays two states:
The program works by downloading the HTML page template from the SPIFFS file system and inside template replace variable with the actual temperature. It then sends the resulting page to a browser. This is one possible way to create a browser result page. If you only need to view the measured temperature in your browser from time to time, and don't worry about transmitting too much information every time you refresh a page that never changes, then this is the way to do it. In the sequel to this series we will show that it can be done differently and how to separate graphics from the data transmitted.
We will need the following parts:
The components are wired according to this diagram. A pull-up resistor must be connected to pin D6. The temperature sensor is normally connected to GND and 3.3V. If you have original temperature sensors, you can also connect it in a parasitic power supply mode.
This example will only work if you download the source code from GitHub and transfer the contents of the data directory to SPIFFS using the Tools/ESP8266 Sketch Data Upload command
.
The HTML page template is in the index.html file. It's simple code for responsive design using the Bootstrap library. Only the {TEMPERATURE}
variable, which is replaced by the measured temperature in the resulting page, is important.
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<link rel="icon" type="image/png" href="favicon.png">
<title>HTTP Server ESP8266 - DS18B20</title>
</head>
<body>
<div class="container">
<h1>ESP8266 HTTP Server</h1>
<p>Temperature: <b>{TEMPERATURE}</b></p>
<p>Copyright (C) 2019 <a href="https://www.arduinoslovakia.eu">Arduino Slovakia</a>.</p>
</div>
</body>
</html>
This is the source code of the program. The program is based on an HTTP server that listens on port 80. The temperature is measured using a DS18B20 temperature sensor. The libraries used can be divided into two groups.
Because the program results in a single page, it is created by the handleRoot
function in the program. But this page actually consists of two parts. One is the generated HTML code itself. The second is a small icon that appears on a bookmark in your browser. The icon is a small PNG file favicon.png that is linked to in the HTML source code of the page. The browser will request this image and since we do not need to make any adjustments to it, we can statically provide it directly from SPIFFS.
The handleRoot function first verifies that the index.html file is stored in SPIFFS. Then it saves the contents of the file to the variable body
. The following is a temperature measurement that can have two results.
The result is replaced in the HTML page template instead of the text {TEMPERATURE}
. Bootstrap CSS alert-danger and alert-info styles are used to make the result look good.
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <FS.h>
#include "arduino_secret.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS D6
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
ESP8266WebServer server(80);
void handleRoot() {
Serial.println("GET /");
File f = SPIFFS.open("/index.html", "r");
if (!f) {
Serial.println("File '/index.html' open failed.");
server.send(500, "text/plain", "500: File '/index.html' open failed.");
}
else {
String body = f.readString();
if (sensors.getDS18Count() == 0) {
body.replace("{TEMPERATURE}", "<div class=\"alert alert-danger\">ERROR</div>");
}
else {
sensors.requestTemperatures();
double temp = sensors.getTempCByIndex(0);
Serial.println(temp);
String tempt = "<div class=\"alert alert-info\">" + String(temp) + " °C</div>";
body.replace("{TEMPERATURE}", tempt);
}
server.send(200, "text/html", body);
f.close();
}
}
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());
sensors.begin();
SPIFFS.begin();
server.serveStatic("/favicon.png", SPIFFS, "/favicon.png");
server.on("/", handleRoot);
server.onNotFound([]() {
server.send(404, "text/plain", "404: Not Found");
});
server.begin();
Serial.println("HTTP server started");
}
void loop(void) {
server.handleClient();
}
The source code is located on the GitHub server.
14.08.2019