ESP als Webserver

Eine Webpage, vom ESP aufgebaut!

Um den ESP8266 in das WLAN-Netz einzubinden ist zunächst mal die Bibliothek ESP8266WiFi.h zuständig, die bereits im ESP-Paket enthalten ist. Für die Arbeit als Webserver benötigt man zusätzlich die Bibliothek ESP8266WebServer.h (ebenfalls im ESP-Paket). Ich bevorzuge für die Einbindung des ESP ins Netz feste IP-Adressen, da man ihn damit leichter wiederfindet. Außerdem kann man alle im Haus werkelnden ESPs mit aufeinanderfolgenden Adressen in einem IP-Bereich ansiedeln, der für die dynamische DNS-Vergabe gesperrt ist.

Wie das Ganze konkret funktionieren kann, illustriert das folgende Listing (hier auch zum Download):


#include <ESP8266WiFi.h>
//#include <WiFiClient.h>
#include <ESP8266mDNS.h>
#include <ESP8266WebServer.h>

//**** Diese Daten müssen angepasst werden ***************

#define WIFI_AP "myWiFi" // Bez. des Access-Points
#define WIFI_PASSWORD "myPassword" // Access-Key

// Ich bevorzuge feste IPs, weil sich der WSP dann schneller wiederfinden lässt

int subNetIP = 1; //IP des Subnets
int myIP = 23; // gewünschte IP-Nummer
String myHostname = "ESP8266";

//**********************************************************

WiFiClient wifiClient;

ESP8266WebServer server(80); //Server an port 80

void setup()
{
  Serial.begin(115200);
  InitWiFi();
  server.on("/", handleRoot); // Routine für die root-Page
  server.on("/other", doOtherThings); // Routine für eine andere Seite
  server.begin();
  Serial.println("Webpage hört auf 192.168." + String(subNetIP) + "." + String(myIP));
}

void loop() {
  server.handleClient();
}

void connectToWiFi() {
  WiFi.begin(WIFI_AP, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
}

String niceStr(int i) {  //Zahlen ggf. mit führender Null
  String out = "";
  if (i < 10) out += "0";
  out += String(i);
  return out;
}

String uptime() {
  String out = "";
  unsigned long up = millis();
  up = up / 1000;
  int d = up / 86400L; // days
  out = niceStr(d) + " d ";
  up = up % 86400;
  d = up / 3600L; // hours
  out += niceStr(d) + " h ";
  up = up % 3600;
  d = up / 60L; // minutes
  out += niceStr(d) + " m ";
  d = up % 60;
  out += niceStr(d) + " s";
  return out;
}

String macAdresse() {
  String out = "";
  byte mac[6];
  WiFi.macAddress(mac);
  for (int i = 5; i > 0; i--) {
    out += hex(mac[i]) + ":";
  }
  out += hex(mac[0]);
  return out;
}

String hex(byte b) {
  String out = String(b, HEX);
  if (out.length() == 1) out = "0" + out;
  return out;
}

void InitWiFi()
{
  Serial.println("Verbinde mit AccessPoint ...");
  //  Versuch, mit dem WiFi-Netz zu verbinden
  IPAddress ip(192, 168, subNetIP , myIP);
  IPAddress gateway(192, 168, subNetIP, 1);
  IPAddress subnet(255, 255, 255, 0);
  IPAddress dns(192, 168, subNetIP, 1);
  WiFi.config(ip, dns, gateway, subnet); // auf feste IP einstellen
  WiFi.hostname(myHostname); //Hostnamen setzen
  WiFi.persistent(false);
  WiFi.mode(WIFI_OFF);
  WiFi.mode(WIFI_STA);
  connectToWiFi();
  Serial.println(" verbunden!");
}

void doOtherThings() {
  String msg = "<html><head><title>Another Page</title></head><body>";
  msg += "<center><br><br><br><br><br><H1>Dies ist noch eine Webpage</H1>";
  msg += "<a href = \"/\"> zurück zur Hauptseite</a></center></body></html>";
  server.send(200, "text/html", msg);
}

void handleRoot() {
  String msg = "<meta http-equiv=\"refresh\" content=\"60\"> ";
  msg += "<center><H1><u>" + String(myHostname) + "</u></H1> </p>";
  msg += "<br />Diese Seite aktualisiert im Minutentakt die Uptime-Zeit!<br /><br />";
  msg += "<b>Online seit:</b> " + uptime() + "<br />";
  msg += "<b>IP-Adresse:</b> 192.168." + String(subNetIP) + "." + String(myIP) + "<br />";
  msg += "<b>MAC-Adresse:</b> " + macAdresse() + "<br />";
  msg += "===================================================<br />";
  msg += "<a href = \"other\">Hier gehts zu einer anderen Webpage ...</a><br />\n";
  server.send(200, "text/html", msg);
}