Web Serwer to program działający na serwerze internetowym, obsługujący żądania protokołu komunikacyjnego HTTP. Z serwerem WWW łączy się poprzez sieć komputerową, przeglądarkę internetową, będącą jego klientem, aby pobrać wskazaną stronę WWW. [1]
Moduły ESP8266/32 są wyposażone w moduł komunikacyjny WiFi. Daje to możliwość stworzenia serwera WWW. Po skonfigurowaniu serwera można stworzyć stronę, która umożliwi dostęp do danych z czujników oraz zapewni kontrolę nad zdefiniowanymi urządzeniami.
Podstawowe komendy
// Dodanie biblioteki ESP8266WiFi.h
#include <ESP8266WiFi.h>
// Dane logowania do sieci WiFi
const char* ssid = "";
const char* password = "";
//ustawienie serwera WWW na porcie 80
WiFiServer server(80);
// Zmienna odpowiedzialna za przechowywanie nagłówka WWW
String header;
////////void setup()
// Szybkość transmisji UART
Serial.begin(9600);
// Połączenie z siecią WiFi
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
//Wypisanie adresu IP serwera WWW
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
server.begin();
////////void loop()
//Nasłuchiwanie klienta WWW
WiFiClient client = server.available();
// Po wykryciu klienta pętla działa do czasu jego odłączenia
if (client) {
Serial.println("New Client.");
String currentLine = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
header += c;
if (c == '\n') {
if (currentLine.length() == 0) {
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println();
// Wykonywanie poleceń GET
if (header.indexOf("GET /5/high") >= 0) {
//Działanie po wykryciu polecenia GET
}
// Informacja w wysłaniu HTML
<!DOCTYPE html><html>
// Zapewnia działanie strony na różnych przeglądarkach
client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
// Style
client.println("<style>html { font-family: Arial; display: inline-block; margin: 1px auto; text-align: center;}");
client.println(".button { background-color: #00ff84; border: none; color: white; padding: 13px 35px;");
client.println("text-decoration: none; font-size: 20px; margin: 4px; cursor: pointer;}");
client.println(".button2 {background-color: #ff0000;}</style></head>");
//Wypisanie nagłówka strony
client.println("<body><h1>Web Server ESP8266</h1>");
// Czyszczenie nagłówka
header = "";
// Zakończenie połączenia
client.stop();
Obsługa DHT-11
//Deklaracja biblioteki
#include "DHT.h"
//Wybór pinu i rodzaj czujnika DHT
#define DHTPIN D3
#define DHTTYPE DHT11
//Deklaracja czujnika
DHT dht(DHTPIN, DHTTYPE);
void setup()
{
Serial.begin(9600);
//Inicjalizacja czujnika
dht.begin();
}
void loop()
{
// Odczyt danych z DHT11
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
//Wypisanie danych
Serial.print("Wilgotnosc: ");
Serial.print(humidity );
Serial.print("% ");
Serial.print("Temperatura: ");
Serial.print(temperature);
Serial.println("^C");
delay(5000);
}
Web Serwer ESP
Program umożliwiający odczyt danych z czujnika DHT11 oraz dający możliwość sterowania diodą LED.
Schemat
Schemat przedstawia podłączenie diody LED oraz czujnika DHT11 (moduł lub sam sensor).
W przypadku podpięcia czujnika DHT11 z 4 pinami należy użyć rezystora 4,7kΩ.
Dioda wymaga rezystora 220Ω.
Kod programu
#include <ESP8266WiFi.h>
#include "DHT.h"
#define DHTTYPE DHT11
#define DHTPIN D3
const char* ssid = "ArduinoTestWiFi";
const char* password = "U*eTRu&ZsmCi0ogdW";
WiFiServer server(80);
String header;
String ledPinState = "low";
DHT dht(DHTPIN, DHTTYPE);
unsigned long currentTime = millis();
unsigned long previousTime = 0;
const long timeoutTime = 3000;
const int ledPin = D2;
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
server.begin();
}
void loop(){
WiFiClient client = server.available();
if (client) {
Serial.println("New Client.");
String currentLine = "";
currentTime = millis();
previousTime = currentTime;
while (client.connected() && currentTime - previousTime <= timeoutTime) {
currentTime = millis();
if (client.available()) {
char c = client.read();
Serial.write(c);
header += c;
if (c == '\n') {
String temperature = String(dht.readTemperature());
String humidity = String(dht.readHumidity());
if (currentLine.length() == 0) {
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println();
if (header.indexOf("GET /led/high") >= 0) {
ledPinState = "high";
digitalWrite(ledPin, HIGH);
} else if (header.indexOf("GET /led/low") >= 0) {
ledPinState = "low";
digitalWrite(ledPin, LOW);
}
client.println("<!DOCTYPE html><html>");
client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
client.println("<link rel=\"icon\" href=\"data:,\">");
client.println("<style>html { font-family: Arial; display: inline-block; margin: 1px auto; text-align: center;}");
client.println(".button { background-color: #00ff84; border: none; color: white; padding: 13px 35px;");
client.println("text-decoration: none; font-size: 20px; margin: 4px; cursor: pointer;}");
client.println(".button2 {background-color: #ff0000;}</style></head>");
client.println("<body><h1>Web Server ESP8266</h1>");
client.println("<h2>Temperatura = " + temperature + "C</h2>");
client.println("<h2>Wilgotnosc = " + humidity + "%</h2>");
client.println("<p>PIN D2 - " + ledPinState + "</p>");
if (ledPinState=="low") {
client.println("<p><a href=\"/led/high\"><button class=\"button\">ON</button></a></p>");
} else {
client.println("<p><a href=\"/led/low\"><button class=\"button button2\">OFF</button></a></p>");
}
client.println();
break;
} else {
currentLine = "";
}
} else if (c != '\r') {
currentLine += c;
}
}
}
header = "";
client.stop();
Serial.println("Client disconnected.");
Serial.println("");
}
}
Efekt działania programu
Serial monitor wyświetli adres IP. Adres należy wpisać do przeglądarki.
Uzyskujemy dostęp do odczytu danych z sensora, oraz możliwość sterowania diodą LED.
[1] https://pl.wikipedia.org/wiki/Serwer_WWW