X

Kurs ESP - Web Server

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Ω.

ESP web

 

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.

Web serwer ip

 

[1]    https://pl.wikipedia.org/wiki/Serwer_WWW