Software zum ESP8266 WiFi-Relais mit ESP-02 o. ESP-03/ESP-07

Endlich ist es geschafft…

Nach mehreren Tagen, wo ich das Bett kaum gesehen habe, steht nun die Software für das ESP8266 Relais ohne externen Mikrocontroller. Programmiert habe ich in der Arduino™ IDE (1.6.4) mit der Erweiterung für den ESP8266 (Link).

ARDUINO-IDE-ESP8266-300x290 Software zum ESP8266 WiFi-Relais mit ESP-02 o. ESP-03/ESP-07 Wichtig!!!
Ich nutze nicht den Release-Zweig der Erweiterung sondern den Staging-Zweig.

Um die Software selber zu übersetzen muss in der IDE unter Datei -> Voreinstellungen in das Feld Aditional Boards Manager URL folgendes eingetragen werden:

http://arduino.esp8266.com/staging/package_esp8266com_index.json

Danach kann die Erweiterung über den Boardsmanager installiert werden.

Arduino-IDE-Boards-Manager-300x170 Software zum ESP8266 WiFi-Relais mit ESP-02 o. ESP-03/ESP-07

Download: WiFi-Relais

Hier kann man mein Demo Relais (neue Software siehe unten) live testen:

Quellcode:

/* EEPROM Aufteilung für Konfigurationsdaten
Position     Länge    Wert
0            1        Firststart Flag
1            1        Frei
2            1        Connectiontimeout
3            1        Flag für zu viele Connection Timeouts -> SETUP Modus wird aktiviert bei 5 aufeinanderfolgende Timeouts
4            1        IP Typ 0=DHCP, 1=Statisch
5            4        IP-Adresse
9            4        Gateway IP-Adresse
13           4        Subnet Mask
17           4        DNS-Server IP-Adresse
21-52        32       WLAN SSID
53-116       64       WLAN PWD
117-148      32       RELAISSSID
149-212      64       RELAISPWD
213-237      25       Standort
238          1        Frei
239-255      16       Frei
256          1        RELAISSTELLUNG
*/

#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <EEPROM.h>

#define RESETPIN 16             
#define RELAISPIN 2             

ADC_MODE(ADC_VCC);                                  //Der ADC wird so konfiguriert das er die Systemspannung misst, es darf nichts am ADC (TOUT) Pin angechlossen sein!

const String SOFTWAREVERSION="1.080216.f";

//Variablen werden mit EEPROM Konfiguration überschrieben wenn FirstStartFlag im EEPROM = 111 (bedeutet Relais ist konfiguriert) ist!
byte FIRSTSTARTFLAG=0;                              // Flag zur Erkennung ob System im Setup Modus starten muss weil es keine Konfiguration im EEPROM hat
byte CONNECTIONTIMEOUT=60;                          // Verbindungstimeout für die Verbindung mit unserem WLAN (Sekunden)
byte STATICIP=0;                                    // Art der IP-Adresszuteilung 0=IP per DHCP, 1=Statische IP
String WLANSSID="";                                 //Die SSID eures WLAN kommt hier rein
String WLANPWD="";                                  //Das WLAN Passwort eures WLAN kommt hier rein
String RELAISSSID="ESP8266-RELAIS";                 //Die Standard SSID für unser Relais WLAN
String RELAISPWD="";                                //Das Passwort für unser Relais WLAN
String RELAISSTANDORT="";                           //Standort des Relais (Max 25 Zeichen)
IPAddress ip(0,0,0,0);                              //Relais Server IP-Adresse bei statischer Konfiguration
IPAddress gw(0,0,0,0);                              //Gateway IP-Adresse bei statischer Konfiguration
IPAddress sub(255,255,255,0);                       //Subnet Mask bei statischer Konfiguration
IPAddress dns(0,0,0,0);                             //DNS Server IP-Adresse bei statischer Konfiguration

//Konstanten definieren, diese Werte können nur im Programm angepasst werden
const int MAXCONNECTIONTRIES=5;                     //Maximale Anzahl an WLAN Verbindungsversuchen bevor wieder in den Setup Modus gebootet wird
const int DNSPORT = 53;                             //Der Port unseres DNS-Servers

//Sonstige benötigte Variablen definieren 
String HTMLFORMULARWLAN;                            //Hilfsvariable für das Formular zur Auswahl des WLAN
float AKTUELLERELAISSTELLUNG;                       //Variable für die aktuelle Stellung des Relais
float AKTUELLELUFTFEUCHTE;                          //Variable für die aktuelle Luftfeuchte
byte TIMEOUTFLAG=0;                                 //Hilfsvariable zum zählen der Verbindungstimeouts
byte RELAISSTELLUNG;                                //Hilfsvariable für die aktuelle Relaisstellung
int ALTERELAISSTELLUNG;                             //Hilfsvariable für Relaisstellung bei Pulsstart
String RELAISSTELLUNGHTML;                          //Hilfsvariable zur Ausgabe der Realisstellung auf einer HTML Seite
int stepflag=0;                                     //Variable für den Setup-Wizzard
int pulseflag=0;                                    //Hilfsvariable für Relais Puls
unsigned long STARTZEIT;                            //Hilfsvariable für Startzeitpunk des Pulses
unsigned long PULSDAUER=1000;                       //Die Pulsdauer in Millisekunden

WiFiServer server(80);
DNSServer dnsServer;

String macToStr(const uint8_t* mac)
{
  String result;

  for (int i = 0; i < 6; ++i) {
    if(String(mac[i],16).length()==1){
      result += "0";
    }
    
    result += String(mac[i], 16);
 
    if (i < 5)
      result += ':';
  }

  result.toUpperCase();
  
  return result;
}

void ReadEEPROMConfig() {
  EEPROM.begin(512);

  EEPROM.get(0,FIRSTSTARTFLAG);
  
  Serial.print(F("FIRSTSTARTFLAG="));
  Serial.println(FIRSTSTARTFLAG);
  
  EEPROM.get(2,CONNECTIONTIMEOUT);

  Serial.print(F("CONNECTIONTIMEOUT="));
  Serial.println(CONNECTIONTIMEOUT);

  EEPROM.get(3,TIMEOUTFLAG);

  Serial.print(F("TIMEOUTFLAG="));
  Serial.println(TIMEOUTFLAG);

  EEPROM.get(4,STATICIP);

  Serial.print(F("STATICIP="));
  Serial.println(STATICIP);

  ip[0]=EEPROM.read(5);
  ip[1]=EEPROM.read(6);
  ip[2]=EEPROM.read(7);
  ip[3]=EEPROM.read(8);
  
  gw[0]=EEPROM.read(9);
  gw[1]=EEPROM.read(10);
  gw[2]=EEPROM.read(11);
  gw[3]=EEPROM.read(12);
  
  sub[0]=EEPROM.read(13);
  sub[1]=EEPROM.read(14);
  sub[2]=EEPROM.read(15);
  sub[3]=EEPROM.read(16);

  dns[0]=EEPROM.read(17);
  dns[1]=EEPROM.read(18);
  dns[2]=EEPROM.read(19);
  dns[3]=EEPROM.read(20);

  Serial.print(F("IP="));
  Serial.println(ip);
  
  Serial.print(F("GATEWAY="));
  Serial.println(gw);
  
  Serial.print(F("SUBNET="));
  Serial.println(sub);
  
  Serial.print(F("DNS="));
  Serial.println(dns);
  
  WLANSSID="";
  
  for (int i = 21; i < 53; ++i)
  {
    WLANSSID += char(EEPROM.read(i));
  }

  Serial.print(F("WLANSSID="));
  Serial.println(WLANSSID.c_str());

  WLANPWD="";
  
  for (int i = 53; i < 117; ++i)
  {
    WLANPWD += char(EEPROM.read(i));
  }
  
  Serial.print(F("WLANPWD="));
  Serial.println(WLANPWD.c_str());

  RELAISSSID="";

  for (int i = 117; i < 149; ++i)
  {
    RELAISSSID += char(EEPROM.read(i));
  }
  
  Serial.print(F("RELAISSSID="));
  Serial.println(RELAISSSID.c_str());

  RELAISPWD="";

  for (int i = 149; i < 213; ++i)
  {
    RELAISPWD += char(EEPROM.read(i));
  }

  Serial.print(F("RELAISPWD="));
  Serial.println(RELAISPWD.c_str());

  RELAISSTANDORT="";

  for (int i = 213; i < 238; ++i)
  {
    RELAISSTANDORT += char(EEPROM.read(i));
  }

  Serial.print(F("RELAISSTANDORT="));
  Serial.println(RELAISSTANDORT.c_str());

  EEPROM.get(256, RELAISSTELLUNG);
  
  Serial.print(F("RELAISSTELLUNG="));
  Serial.println(RELAISSTELLUNG);
  
  EEPROM.end();
}

void ShowSysInfo(int typ) {
  if (typ==1) {
    Serial.print(F("SDK-Version: "));
    Serial.println(ESP.getSdkVersion());
    Serial.print(F("ESP8266 Chip-ID: "));
    Serial.println(ESP.getChipId());
    Serial.print(F("ESP8266 Speed: "));  
    Serial.print(ESP.getCpuFreqMHz());
    Serial.println(F(" MHz"));
  }
  
  Serial.print(F("Free Heap Size: "));
  Serial.print(ESP.getFreeHeap());
  Serial.println(F(" Bytes"));
  Serial.print(F("Systemspannung: "));
  Serial.print(String(ESP.getVcc()).substring(0,1));
  Serial.print(F(","));
  Serial.print(String(ESP.getVcc()).substring(1));
  Serial.println(F(" Volt"));  
  Serial.println(F(""));
}

void ResetWiFi() {
  EEPROM.begin(512);
  EEPROM.write(0,0);
  EEPROM.end();

  delay(100);

  WiFi.disconnect();

  delay(100);
  
  ESP.deepSleep(1,WAKE_RF_DEFAULT);
  delay(100);
}

void setup() {
  Serial.begin(115200);

  Serial.println(F(""));  
  Serial.println(F(""));  
  Serial.println(F("Starte das ESP8266-RELAIS..."));
  Serial.println(F(""));
  Serial.print(String(ESP.getVcc()).substring(0,1));
  Serial.print(F(","));
  Serial.print(String(ESP.getVcc()).substring(1));
  Serial.println(F(" Volt ist OK"));
  Serial.println(F(""));

  pinMode(RESETPIN, INPUT_PULLUP);
  pinMode(RELAISPIN, OUTPUT);

  ShowSysInfo(1);

  Serial.println(F("Hole Konfiguration aus EEPROM..."));
  Serial.println(F(""));

  ReadEEPROMConfig();

  digitalWrite(RELAISPIN, RELAISSTELLUNG);
  
  Serial.println(F(""));
  Serial.println(F("WLAN-Netzwerk-Scan gestartet..."));
      
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();

  int n = WiFi.scanNetworks();
    
  Serial.println(F("WLAN-Netzwerk-Scan abgeschlossen..."));
  Serial.println(F(""));

  if (n == 0) {
    Serial.println(F("Kein WLAN-Netzwerk gefunden!"));
  } else {
    Serial.print(n);

    if(n<=1) {
     Serial.println(F(" WLAN-Netzwerk gefunden"));
    } else {
      Serial.println(F(" WLAN-Netzwerke gefunden"));
    }
  
    Serial.println(F(""));

    for (int i = 0; i < n; ++i) { 
      Serial.print(i + 1);
      Serial.print(F(": "));
      Serial.print(WiFi.SSID(i));
      Serial.print(F(" ("));
      Serial.print(WiFi.RSSI(i));
      Serial.print(F(")"));
      Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE)?" ":"*");
    }
  }

  HTMLFORMULARWLAN = "<b><u>WLAN-Netzwerk ausw&auml;hlen:</u></b><br /><br />";

  for (int i = 0; i < n; ++i) {
    // Erstelle Webseite mit allen SSID und RSSI Werten der gefundenen Netzwerke
    HTMLFORMULARWLAN += "<input type='radio' name='WLANSSID' value='";
    HTMLFORMULARWLAN += WiFi.SSID(i);
    HTMLFORMULARWLAN += "'";

    if (WiFi.SSID(i)==WLANSSID.substring(0, WiFi.SSID(i).length()+1)) {
      HTMLFORMULARWLAN += " checked";
    } 

    HTMLFORMULARWLAN += ">";
    HTMLFORMULARWLAN += WiFi.SSID(i);
    HTMLFORMULARWLAN += " (";
    HTMLFORMULARWLAN += WiFi.RSSI(i);
    HTMLFORMULARWLAN += ")";
    HTMLFORMULARWLAN += (WiFi.encryptionType(i) == ENC_TYPE_NONE)?" ":"*";
    HTMLFORMULARWLAN += "<br />";
  }
  
  Serial.println(F("")); 
 
  if (FIRSTSTARTFLAG==111) {
    Serial.print(F("Verbinde mit WLAN "));
    Serial.println(WLANSSID);
  
    if (STATICIP==1) {
      WiFi.config(ip, gw, sub, dns);
    }

    WiFi.begin(WLANSSID.c_str(), WLANPWD.c_str());
    
    int WLANTIMEOUT=0;
    
    while (WiFi.status() != WL_CONNECTED) {
      delay(1000);

      Serial.print(F("."));
      
      WLANTIMEOUT+=1;
  
      if (WLANTIMEOUT>=CONNECTIONTIMEOUT) {
        Serial.println(F(""));
        Serial.println(F("Timeout!"));  
        
        TIMEOUTFLAG+=1;

        if(TIMEOUTFLAG>=MAXCONNECTIONTRIES) {
          ResetWiFi();
        } else {
          EEPROM.begin(512);
          EEPROM.write(3, TIMEOUTFLAG);
          EEPROM.end();

          delay(100);
          
          WiFi.disconnect();

          delay(100);
          
          ESP.deepSleep(1000000,WAKE_RF_DEFAULT);
          delay(100);
        }
      }
    }
  
    EEPROM.begin(512);
    EEPROM.write(3, 0);
    EEPROM.end();

    Serial.println(F(""));
    Serial.println(F("Verbindung mit WLAN hergestellt"));  
    Serial.println(F(""));
    Serial.print(F("IP-Addresse: "));
    Serial.println(WiFi.localIP());
    Serial.println(F(""));
    
    Serial.println(F("Starte im Normal-Modus"));
    WiFi.softAP(RELAISSSID.c_str(), RELAISPWD.c_str());
  
    delay(100);
    
    Serial.println(F(""));
    Serial.println(F("AP Modus gestartet"));
    Serial.print(F("SSID: "));
    Serial.println(RELAISSSID.c_str());
    Serial.print(F("AP IP-Adresse: "));
    Serial.println(WiFi.softAPIP());
    Serial.println(F(""));
  } else {
    FIRSTSTARTFLAG=1;
    
    Serial.println(F("Starte im Setup-Modus!!!"));
    WiFi.softAP("ESP8266-RELAIS-SETUP");
  
    delay(100);
    
    Serial.println(F(""));
    Serial.println(F("AP Modus gestartet"));
    Serial.print(F("SSID: "));
    Serial.println("ESP8266-RELAIS-SETUP");
    Serial.print(F("AP IP-Adresse: "));
    Serial.println(WiFi.softAPIP());
  } 

  Serial.println(F(""));
  Serial.println(F("Starte DNS-Server"));
  
  dnsServer.start(DNSPORT, "*", WiFi.softAPIP());

  Serial.println(F("DNS-Server gestartet")); 
  Serial.println(F(""));
  Serial.println(F("Starte HTTP-Server"));

  server.begin();

  Serial.println(F("HTTP-Server gestartet")); 
  Serial.println(F(""));

  Serial.println(F("...ESP8266-RELAIS erfolgreich gestartet."));
  Serial.println(F(""));  
}

void loop() {  
  unsigned long ISTZEIT=millis();

  dnsServer.processNextRequest();

  WiFiClient client = server.available();

  if (digitalRead(RESETPIN)==0) {
    
    delay(500);
    
    while (digitalRead(RESETPIN)==0) {
      delay(100);
    }

    delay(500);
    
    ResetWiFi();
  }

  if(pulseflag == 1) {
    if((unsigned long)(ISTZEIT - STARTZEIT) >= PULSDAUER) {

      if(ALTERELAISSTELLUNG == 0) {
        digitalWrite(RELAISPIN, 0);
      } else {
        digitalWrite(RELAISPIN, 1);
      }

      pulseflag=0;
    }
  }

  if(client) {
    while(client.connected() && !client.available()){
      delay(1);
    }

    String RequestString = client.readStringUntil('\r');

    client.flush();
    
    int addr_start = RequestString.indexOf(' ');
    int addr_end = RequestString.indexOf(' ', addr_start + 1);

    if (addr_start == -1 || addr_end == -1) {
      Serial.print(F("Ungueltige Anfrage: "));
      Serial.println(RequestString);
      Serial.println(F(""));
      
      client.stop();
      return;
    } else {
      RequestString = RequestString.substring(addr_start + 1, addr_end);

      Serial.print(F("Gueltige Anfrage: "));
      Serial.println(RequestString);
      Serial.println(F(""));
      
      String HTMLSite="";
      String HTMLHeader="";

      if(RequestString.startsWith("/toggle.htm")) {
        RELAISSTELLUNG=digitalRead(RELAISPIN);
        
        if(RELAISSTELLUNG == 0) {
          RELAISSTELLUNG=1;
        } else {
          RELAISSTELLUNG=0;
        }

        digitalWrite(RELAISPIN, RELAISSTELLUNG);

        EEPROM.begin(512);

        delay(10);

        EEPROM.write(256, RELAISSTELLUNG);

        EEPROM.commit();
        EEPROM.end();
      }
            
      if(RequestString.startsWith("/pulse.htm")) {
        if(pulseflag == 0) {
          pulseflag=1;
          
          RELAISSTELLUNG=digitalRead(RELAISPIN);
          
          if(RELAISSTELLUNG == 0) {
            digitalWrite(RELAISPIN, 1);
            ALTERELAISSTELLUNG=0;
          } else {
            digitalWrite(RELAISPIN, 0);
            ALTERELAISSTELLUNG=1;
          }

          STARTZEIT=millis();
        }
      }

      if (RequestString.startsWith("/setwlanconfig")) {
        FIRSTSTARTFLAG=0;
        stepflag=2;

        EEPROM.begin(512);

        delay(10);
        
        //1. Wert extrahieren (WLAN SSID)
        int StartPosition=RequestString.indexOf('=');
        StartPosition++;
        
        int EndePosition=RequestString.indexOf("&");

        String NeueWLANSSID; 
        NeueWLANSSID = RequestString.substring(StartPosition,EndePosition);

        Serial.println(F(""));
        Serial.println(F("Schreibe neue WLANSSID ins EEPROM:"));
  
        for (int i = 0; i < NeueWLANSSID.length(); ++i){
          EEPROM.write(21+i, NeueWLANSSID[i]);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeueWLANSSID[i]); 
        }    

        //2. Wert extrahieren (Netzwerk Passwort)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);
        
        String NeuesWLANPWD;
        NeuesWLANPWD = RequestString.substring(StartPosition,EndePosition);

        Serial.println(F(""));
        Serial.println(F("Schreibe neues WLANPWD ins EEPROM:"));

        for (int i = 0; i < NeuesWLANPWD.length(); ++i){
          EEPROM.write(53+i, NeuesWLANPWD[i]);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeuesWLANPWD[i]); 
        }    

        //3. Wert extrahieren (CONNECTIONTIMEOUT)
        int NeuesCONNECTIONTIMEOUT=0;
        NeuesCONNECTIONTIMEOUT=RequestString.substring(RequestString.lastIndexOf("=")+1).toInt();

        Serial.println(F(""));
        Serial.print(F("Schreibe neues CONNECTIONTIMEOUT ins EEPROM: "));

        Serial.print(F("schreibe: "));
        Serial.println(NeuesCONNECTIONTIMEOUT);
        
        EEPROM.write(2, NeuesCONNECTIONTIMEOUT);

        EEPROM.commit();
        EEPROM.end();
      }
      
      if (RequestString.startsWith("/setipconfig?")) {
        stepflag=3;

        EEPROM.begin(512);

        delay(10);
        
        //1. Wert extrahieren (IP Typ)
        int StartPosition=RequestString.indexOf('=');
        StartPosition++;
        
        int EndePosition=RequestString.indexOf("&");

        int NeuerIPTYP; 
        NeuerIPTYP = RequestString.substring(StartPosition,EndePosition).toInt();

        Serial.println(F(""));
        Serial.println(F("Schreibe neuen IPTYP ins EEPROM:"));
  
        EEPROM.write(4, NeuerIPTYP);

        Serial.print(F("schreibe: "));
        Serial.println(NeuerIPTYP); 

        //2. Wert extrahieren (IP-Adresse Teil 1)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);
        
        int NeueIP;
        NeueIP = RequestString.substring(StartPosition,EndePosition).toInt();

        Serial.println(F(""));
        Serial.println(F("Schreibe neue IP-Adresse Teil 1 ins EEPROM:"));

        EEPROM.write(5, NeueIP);
        
        Serial.print(F("schreibe: "));
        Serial.println(NeueIP); 

        //3. Wert extrahieren (IP-Adresse Teil 2)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);
        
        NeueIP = RequestString.substring(StartPosition,EndePosition).toInt();

        Serial.println(F(""));
        Serial.println(F("Schreibe neue IP-Adresse Teil 2 ins EEPROM:"));

        EEPROM.write(6, NeueIP);
        
        Serial.print(F("schreibe: "));
        Serial.println(NeueIP); 

        //4. Wert extrahieren (IP-Adresse Teil 3)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);
        
        NeueIP = RequestString.substring(StartPosition,EndePosition).toInt();

        Serial.println(F(""));
        Serial.println(F("Schreibe neue IP-Adresse Teil 3 ins EEPROM:"));

        EEPROM.write(7, NeueIP);
        
        Serial.print(F("schreibe: "));
        Serial.println(NeueIP); 

        //5. Wert extrahieren (IP-Adresse Teil 4)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);
        
        NeueIP = RequestString.substring(StartPosition,EndePosition).toInt();

        Serial.println(F(""));
        Serial.println(F("Schreibe neue IP-Adresse Teil 4 ins EEPROM:"));

        EEPROM.write(8, NeueIP);
        
        Serial.print(F("schreibe: "));
        Serial.println(NeueIP); 

        //6. Wert extrahieren (Gateway IP-Adresse Teil 1)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);
        
        NeueIP = RequestString.substring(StartPosition,EndePosition).toInt();

        Serial.println(F(""));
        Serial.println(F("Schreibe neue Gateway IP-Adresse Teil 1 ins EEPROM:"));

        EEPROM.write(9, NeueIP);
        
        Serial.print(F("schreibe: "));
        Serial.println(NeueIP); 

        //7. Wert extrahieren (Gateway IP-Adresse Teil 2)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);
        
        NeueIP = RequestString.substring(StartPosition,EndePosition).toInt();

        Serial.println(F(""));
        Serial.println(F("Schreibe neue Gateway IP-Adresse Teil 2 ins EEPROM:"));

        EEPROM.write(10, NeueIP);
        
        Serial.print(F("schreibe: "));
        Serial.println(NeueIP); 

        //8. Wert extrahieren (Gateway IP-Adresse Teil 3)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);
        
        NeueIP = RequestString.substring(StartPosition,EndePosition).toInt();

        Serial.println(F(""));
        Serial.println(F("Schreibe neue Gateway IP-Adresse Teil 3 ins EEPROM:"));

        EEPROM.write(11, NeueIP);
        
        Serial.print(F("schreibe: "));
        Serial.println(NeueIP); 

        //9. Wert extrahieren (Gateway IP-Adresse Teil 4)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);
        
        NeueIP = RequestString.substring(StartPosition,EndePosition).toInt();

        Serial.println(F(""));
        Serial.println(F("Schreibe neue Gateway IP-Adresse Teil 4 ins EEPROM:"));

        EEPROM.write(12, NeueIP);
        
        Serial.print(F("schreibe: "));
        Serial.println(NeueIP); 

        //10. Wert extrahieren (Subnet Mask Teil 1)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);
        
        NeueIP = RequestString.substring(StartPosition,EndePosition).toInt();

        Serial.println(F(""));
        Serial.println(F("Schreibe neue Subnet Mask Teil 1 ins EEPROM:"));

        EEPROM.write(13, NeueIP);
        
        Serial.print(F("schreibe: "));
        Serial.println(NeueIP); 

        //11. Wert extrahieren (Subnet Mask Teil 2)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);
        
        NeueIP = RequestString.substring(StartPosition,EndePosition).toInt();

        Serial.println(F(""));
        Serial.println(F("Schreibe neue Subnet Mask Teil 2 ins EEPROM:"));

        EEPROM.write(14, NeueIP);
        
        Serial.print(F("schreibe: "));
        Serial.println(NeueIP); 

        //12. Wert extrahieren (Subnet Mask Teil 3)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);
        
        NeueIP = RequestString.substring(StartPosition,EndePosition).toInt();

        Serial.println(F(""));
        Serial.println(F("Schreibe neue Subnet Mask Teil 3 ins EEPROM:"));

        EEPROM.write(15, NeueIP);
        
        Serial.print(F("schreibe: "));
        Serial.println(NeueIP); 

        //13. Wert extrahieren (Subnet Mask Teil 4)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);
        
        NeueIP = RequestString.substring(StartPosition,EndePosition).toInt();

        Serial.println(F(""));
        Serial.println(F("Schreibe neue Subnet Mask Teil 4 ins EEPROM:"));

        EEPROM.write(16, NeueIP);
        
        Serial.print(F("schreibe: "));
        Serial.println(NeueIP); 

        //14. Wert extrahieren (DNS Server IP-Adresse Teil 1)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);
        
        NeueIP = RequestString.substring(StartPosition,EndePosition).toInt();

        Serial.println(F(""));
        Serial.println(F("Schreibe neue DNS Server IP-Adresse Teil 1 ins EEPROM:"));

        EEPROM.write(17, NeueIP);
        
        Serial.print(F("schreibe: "));
        Serial.println(NeueIP); 

        //15. Wert extrahieren (DNS Server IP-Adresse Teil 2)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);
        
        NeueIP = RequestString.substring(StartPosition,EndePosition).toInt();

        Serial.println(F(""));
        Serial.println(F("Schreibe neue DNS Server IP-Adresse Teil 2 ins EEPROM:"));

        EEPROM.write(18, NeueIP);
        
        Serial.print(F("schreibe: "));
        Serial.println(NeueIP); 

        //16. Wert extrahieren (DNS Server IP-Adresse Teil 3)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);
        
        NeueIP = RequestString.substring(StartPosition,EndePosition).toInt();

        Serial.println(F(""));
        Serial.println(F("Schreibe neue DNS Server IP-Adresse Teil 3 ins EEPROM:"));

        EEPROM.write(19, NeueIP);
        
        Serial.print(F("schreibe: "));
        Serial.println(NeueIP); 

        //17. Wert extrahieren (DNS Server IP-Adresse Teil 4)
        NeueIP = RequestString.substring(RequestString.lastIndexOf("=")+1).toInt();
        
        Serial.println(F(""));
        Serial.println(F("Schreibe neue DNS Server IP-Adresse Teil 4 ins EEPROM:"));

        EEPROM.write(20, NeueIP);
        
        Serial.print(F("schreibe: "));
        Serial.println(NeueIP); 

        EEPROM.commit();
        EEPROM.end();
      }

      if (RequestString.startsWith("/setrelaisconfig?")) {
        stepflag=4;

        EEPROM.begin(512);

        delay(10);
        
        //1. Wert extrahieren (STANDORT)
        int StartPosition=RequestString.indexOf('=');
        StartPosition++;
        
        int EndePosition=RequestString.indexOf("&");

        String NeuerSTANDORT; 
        NeuerSTANDORT = RequestString.substring(StartPosition,EndePosition);

        Serial.println(F(""));
        Serial.println(F("Schreibe neuen STANDORT ins EEPROM:"));
  
        for (int i = 0; i < NeuerSTANDORT.length(); ++i){
          EEPROM.write(213+i, NeuerSTANDORT[i]);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeuerSTANDORT[i]); 
        }    

        //2. Wert extrahieren (RELAISSSID)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);

        String NeueRELAISSSID = "";
        NeueRELAISSSID = RequestString.substring(StartPosition,EndePosition);

        Serial.println(F(""));
        Serial.println(F("Schreibe neue RELAISSSID ins EEPROM:"));

        for (int i = 0; i < NeueRELAISSSID.length(); ++i){
          EEPROM.write(117+i, NeueRELAISSSID[i]);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeueRELAISSSID[i]); 
        }    

        //3. Wert extrahieren (RELAISPWD)
        StartPosition=RequestString.indexOf("=",EndePosition);
        StartPosition++;
        
        EndePosition=RequestString.indexOf("&",EndePosition+2);

        String NeuesRELAISPWD = "";
        NeuesRELAISPWD = RequestString.substring(RequestString.lastIndexOf("=")+1);

        Serial.println(F(""));
        Serial.println(F("Schreibe neues RELAISPWD ins EEPROM:"));

        for (int i = 0; i < NeuesRELAISPWD.length(); ++i){
          EEPROM.write(149+i, NeuesRELAISPWD[i]);
          
          Serial.print(F("schreibe: "));
          Serial.println(NeuesRELAISPWD[i]); 
        }    

        Serial.println(F("Schreibe neues FIRSTSTARTFLAG ins EEPROM:"));
        FIRSTSTARTFLAG=111;
        
        EEPROM.write(0, FIRSTSTARTFLAG);

        Serial.print(F("schreibe: "));
        Serial.println(FIRSTSTARTFLAG); 

        EEPROM.commit();
        EEPROM.end();
      }

      if (stepflag==4) {
        Serial.println(F("Abschlussseite des Setup wird ausgegeben"));
        Serial.println(F(""));
        
        HTMLSite ="<!DOCTYPE html><html><head>";
        HTMLSite += "<title>";
        HTMLSite += RELAISSSID.c_str();
        HTMLSite += "</title>";
        HTMLSite += "</head><body style='font-family:Verdana, Arial, Sans-Serif'><br /><center>";
        HTMLSite += RELAISSSID.c_str();
        HTMLSite += "<br /><br /><fieldset style='width:450px'><br />";
        HTMLSite += "<b>Das Setup des Relais<br />";
        HTMLSite += "ist abgeschlossen.<br /><br />";
        HTMLSite += "Das Relais startet jetzt neu!<br />";
        HTMLSite += "<br /></fieldset></center></body></html>\r\n\r\n";

        HTMLHeader  = "HTTP/1.1 200 OK\r\n";
        HTMLHeader += "Content-Length: ";
        HTMLHeader += HTMLSite.length();
        HTMLHeader += "\r\n";
        HTMLHeader += "Content-Type: text/html\r\n";
        HTMLHeader += "Connection: close\r\n";
        HTMLHeader += "\r\n";
        
        client.print(HTMLHeader);
        delay(1);
        client.print(HTMLSite);
        delay(1);
        
        client.stop();

        WiFi.disconnect();

        ESP.deepSleep(1000,WAKE_RF_DEFAULT); //System neu starten über Deep-Sleep Timer
        delay(100);
      }
      
      if (RequestString.startsWith("/wlanconfig.htm") || stepflag==1) {

        //Lösche alte Konfiguration im EEPROM
        EEPROM.begin(512);

        delay(10);
        
        //Lösche alte Daten aus EEPROM
        for (int i=0; i<512; i++) {
          EEPROM.write(i,0);
        }

        EEPROM.commit();
        EEPROM.end();
        
        Serial.println(F("WLAN Konfigurationsseite wird ausgegeben"));
        Serial.println(F(""));

        HTMLSite ="<!DOCTYPE html><html><head><title>";
        HTMLSite += RELAISSSID.c_str();
        HTMLSite += "</title>";
        HTMLSite += "</head><body style='font-family:Verdana, Arial, Sans-Serif'><br /><center>";
        HTMLSite += RELAISSSID.c_str();
        HTMLSite += "<br /><br /><fieldset style='width:450px'><legend>Relais Setup Schritt 1</legend>";
        HTMLSite += "<form method='GET' action='setwlanconfig'>";
        HTMLSite += "<br /><b>WLAN Einstellungen</b><br /><hr /><br />";
        HTMLSite += HTMLFORMULARWLAN;
        HTMLSite += "<br />WLAN-Passwort: <input name='WLANPWD' type='text' size='30' maxlength='64' value='";
        HTMLSite += WLANPWD.c_str();
        HTMLSite += "'></input><br />";
        HTMLSite += "<br />Verbindungs-Timeout: ";
        HTMLSite += "<select name='CONNECTIONTIMEOUT' size='1'>";

        if (CONNECTIONTIMEOUT==10) {
          HTMLSite += "<option value='10' selected>10</option><option value='30'>30</option><option value='60'>60</option>";
        } else if (CONNECTIONTIMEOUT==30) {
          HTMLSite += "<option value='10'>10</option><option value='30' selected>30</option><option value='60'>60</option>";
        } else {
          HTMLSite += "<option value='10'>10</option><option value='30'>30</option><option value='60' selected>60</option>";
        }
 
        HTMLSite += "</select> Sekunden<br />";
        HTMLSite += "<br /></fieldset>";
        HTMLSite += "<br /><input type='submit' value='Einstellungen speichern und weiter zu Schritt 2...'></form>";
        HTMLSite += "</center></body></html>\r\n\r\n";
      }
      
      if (RequestString.startsWith("/ipconfig.htm") || stepflag==2) {
        Serial.println(F("IP Konfigurationsseite wird ausgegeben"));
        Serial.println(F(""));

        HTMLSite ="<!DOCTYPE html><html><head><title>";
        HTMLSite += RELAISSSID.c_str();
        HTMLSite += "</title>";
        HTMLSite += "</head><body style='font-family:Verdana, Arial, Sans-Serif'><br /><center>";
        HTMLSite += RELAISSSID.c_str();
        HTMLSite += "<br /><br /><fieldset style='width:450px'><legend>Relais Setup Schritt 2</legend>";
        HTMLSite += "<form method='GET' action='setipconfig'>";
        HTMLSite += "<br /><b>IP Einstellungen</b><br /><hr />";
        HTMLSite += "<br />IP-Adresstyp: ";
        HTMLSite += "<select name='STATICIP' size='1'>";
        
        if (STATICIP==0) {
          HTMLSite += "<option value='0' selected>DHCP</option><option value='1'>Statisch</option></select>";
        } else {
          HTMLSite += "<option value='0'>DHCP</option><option value='1' selected>Statisch</option></select>";
        }
        HTMLSite += "<br /><br />IP-Adresse: <input name='IP1' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(ip[0]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='IP2' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(ip[1]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='IP3' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(ip[2]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='IP4' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(ip[3]);
        HTMLSite += "'></input>";
        HTMLSite += "<br /><br />Gateway IP-Adresse: <input name='GWIP1' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(gw[0]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='GWIP2' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(gw[1]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='GWIP3' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(gw[2]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='GWIP4' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(gw[3]);
        HTMLSite += "'></input>";
        HTMLSite += "<br /><br />Subnet Mask: <input name='MASK1' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(sub[0]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='MASK2' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(sub[1]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='MASK3' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(sub[2]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='MASK4' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(sub[3]);
        HTMLSite += "'></input>";
        HTMLSite += "<br /><br />DNS-Server IP-Adresse: <input name='DNSIP1' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(dns[0]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='DNSIP2' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(dns[1]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='DNSIP3' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(dns[2]);
        HTMLSite += "'></input>.";
        HTMLSite += "<input name='DNSIP4' type='text' size='3' maxlength='3' value='";
        HTMLSite += String(dns[3]);
        HTMLSite += "'></input><br />";
        HTMLSite += "<br /></fieldset>";
        HTMLSite += "<br /><input type='submit' value='Einstellungen speichern und weiter zu Schritt 3...'></form>";
        HTMLSite += "</center></body></html>\r\n\r\n";
      } 
            
      if (RequestString.startsWith("/relaisconfig.htm") || stepflag==3) {
        Serial.println(F("Relais Konfigurationsseite wird ausgegeben"));
        Serial.println(F(""));

        HTMLSite ="<!DOCTYPE html><html><head><title>";
        HTMLSite += RELAISSSID.c_str();
        HTMLSite += "</title>";
        HTMLSite += "</head><body style='font-family:Verdana, Arial, Sans-Serif'><br /><center>";
        HTMLSite += RELAISSSID.c_str();
        HTMLSite += "<br /><br /><fieldset style='width:450px'><legend>Relais Setup Schritt 3</legend>";
        HTMLSite += "<form method='GET' action='setrelaisconfig'>";
        HTMLSite += "<br /><b>Relais Einstellungen</b><br /><hr />";
        HTMLSite += "<br />Standort: <input name='RELAISSTANDORT' type='text' size='25' maxlength='25' value='";
        HTMLSite += RELAISSTANDORT.c_str();
        HTMLSite += "'></input><br />";
        HTMLSite += "<br />SSID: <input name='RELAISSSID' type='text' size='32' maxlength='32' value='";
        HTMLSite += RELAISSSID.c_str();
        HTMLSite += "'></input><br />";
        HTMLSite += "<br />Passwort: <input name='RELAISPWD' type='text' size='30' maxlength='64' value='";
        HTMLSite += RELAISPWD.c_str();
        HTMLSite += "'></input><br /><br /></fieldset>";
        HTMLSite += "<br /><input type='submit' value='Einstellungen speichern und das Setup beenden'></form>";
        HTMLSite += "</center></body></html>\r\n\r\n";
      } 

      uint8_t mac[6];
      WiFi.macAddress(mac);
      IPAddress LOCALIPIST = WiFi.localIP();
      IPAddress GATEWAYIST = WiFi.gatewayIP();
      IPAddress SUBMASKIST = WiFi.subnetMask();
      IPAddress DNSIPIST = WiFi.dnsIP();
      
      String HTMLipStr = String(LOCALIPIST[0]) + '.' + String(LOCALIPIST[1]) + '.' + String(LOCALIPIST[2]) + '.' + String(LOCALIPIST[3]);
      String HTMLgwStr = String(GATEWAYIST[0]) + '.' + String(GATEWAYIST[1]) + '.' + String(GATEWAYIST[2]) + '.' + String(GATEWAYIST[3]);
      String HTMLsmStr = String(SUBMASKIST[0]) + '.' + String(SUBMASKIST[1]) + '.' + String(SUBMASKIST[2]) + '.' + String(SUBMASKIST[3]);
      String HTMLdnsStr = String(DNSIPIST[0]) + '.' + String(DNSIPIST[1]) + '.' + String(DNSIPIST[2]) + '.' + String(DNSIPIST[3]);

      if (RequestString.startsWith("/relaisinfo") && stepflag==0 && FIRSTSTARTFLAG==111) {  
        HTMLSite ="<!DOCTYPE html><html><head><meta http-equiv='refresh' content='5'><title>";
        HTMLSite += RELAISSSID.c_str();
        HTMLSite += "</title>";
        HTMLSite += "</head><body style='font-family:Verdana, Arial, Sans-Serif'><br /><center>";
        HTMLSite += RELAISSSID.c_str();
        HTMLSite += "<br /><br /><fieldset style='width:350px'><legend>Relais Informationen</legend>";
        HTMLSite += "<br />ESP8266 Chip-ID: ";
        HTMLSite += ESP.getChipId();
        HTMLSite += "<br /><br />ESP8266 Speed: ";
        HTMLSite += ESP.getCpuFreqMHz();
        HTMLSite += " MHz<br /><br />Flash Chip-ID: ";
        HTMLSite += ESP.getFlashChipId();
        HTMLSite += "<br /><br />Flash Speed: ";
        HTMLSite += ESP.getFlashChipSpeed()/1000000;
        HTMLSite += " MHz<br /><br />Flash Size: ";
        HTMLSite += ESP.getFlashChipSize();
        HTMLSite += " Bytes<br /><br /><hr /><br />SDK-Version: ";
        HTMLSite += ESP.getSdkVersion();
        HTMLSite += "<br /><br />Boot Mode: ";
        HTMLSite += ESP.getBootMode();
        HTMLSite += "<br /><br />Free Heap Size: ";
        HTMLSite += ESP.getFreeHeap();
        HTMLSite += " Bytes<br /><br /><hr /><br />";
        HTMLSite += "Systemspannung: ";
        HTMLSite += String(ESP.getVcc()).substring(0,1);
        HTMLSite += ",";
        HTMLSite += String(ESP.getVcc()).substring(1);
        HTMLSite += " Volt<br /><br /></fieldset><br /><fieldset style='width:350px'><br /><form action='index.htm'><input type='submit' value='Zur&uuml;ck zum Relaisstatus'></form>";
        HTMLSite += "<br /></fieldset></center></body></html>\r\n\r\n";
      } else if (RequestString.startsWith("/netinfo") && stepflag==0 && FIRSTSTARTFLAG==111) {  
        HTMLSite ="<!DOCTYPE html><html><head><title>";
        HTMLSite += RELAISSSID.c_str();
        HTMLSite += "</title>";
        HTMLSite += "</head><body style='font-family:Verdana, Arial, Sans-Serif'><br /><center>";
        HTMLSite += RELAISSSID.c_str();
        HTMLSite += "<br /><br /><fieldset style='width:350px'><legend>WLAN Netzwerk Informationen</legend>";
        HTMLSite += "<br />WLAN SSID: ";
        HTMLSite += WiFi.SSID();
        HTMLSite += "<br /><br />WLAN Kanal: ";
        HTMLSite += WiFi.channel();
        HTMLSite += "<br /><br />WLAN Signalkst&auml;rke: ";
        HTMLSite += WiFi.RSSI();
        HTMLSite += " dBm<br /><br />Router MAC Adresse: ";
        HTMLSite += WiFi.BSSIDstr();
        HTMLSite += "<br /><br />Eigene IP-Adresse: ";
        HTMLSite += HTMLipStr;
        HTMLSite += "<br /><br />Eigene MAC Adresse: ";
        HTMLSite += macToStr(mac);
        HTMLSite += "<br /><br />Gateway IP-Adresse: ";
        HTMLSite += HTMLgwStr;
        HTMLSite += "<br /><br />Subnet Mask: ";
        HTMLSite += HTMLsmStr;
        HTMLSite += "<br /><br />DNS Server IP-Adresse: ";
        HTMLSite += HTMLdnsStr;
        HTMLSite += "<br /><br /></fieldset><br /><fieldset style='width:350px'><br /><form action='index.htm'><input type='submit' value='Zur&uuml;ck zum Relaisstatus'></form>";
        HTMLSite += "<br /></fieldset></center></body></html>\r\n\r\n";
      } else if (RequestString.startsWith("/prginfo") && stepflag==0 && FIRSTSTARTFLAG==111) {  
        HTMLSite ="<!DOCTYPE html><html><head><title>";
        HTMLSite += RELAISSSID.c_str();
        HTMLSite += "</title>";
        HTMLSite += "</head><body style='font-family:Verdana, Arial, Sans-Serif'><br /><center>";
        HTMLSite += RELAISSSID.c_str();
        HTMLSite += "<br /><br /><fieldset style='width:350px'><legend>Programm Informationen</legend>";
        HTMLSite += "<br />Version<br/><br />";
        HTMLSite += SOFTWAREVERSION;
        HTMLSite += "<br /><br /><hr /><br />Author<br/><br /><a href='http://blog.thomasheldt.de' target=_blank'>Thomas Heldt</a> (Karlsbad, Germany)";
        HTMLSite += "<br /><br /><hr /><br />Arduino ESP8266 Addon<br /><br /><a href='https://github.com/esp8266/Arduino' target='_blank'>ESP8266 Arduino Core auf Github</a>";
        HTMLSite += "<br /><br /></fieldset><br /><fieldset style='width:350px'><br /><form action='index.htm'><input type='submit' value='Zur&uuml;ck zum Relaisstatus'></form>";
        HTMLSite += "<br /></fieldset></center></body></html>\r\n\r\n";
      } else if (RequestString.startsWith("/") && stepflag==0 && FIRSTSTARTFLAG==111) {  

        if(digitalRead(RELAISPIN) == 0) {
          RELAISSTELLUNGHTML="1-2";
        } else {
          RELAISSTELLUNGHTML="2-3";
        }
        
        if(pulseflag == 1) {
          HTMLSite ="<!DOCTYPE html><html><head><meta http-equiv='refresh' content='2; URL=/index.htm'><title>";
        } else {
          HTMLSite ="<!DOCTYPE html><html><head><title>";
        }
        
        HTMLSite += RELAISSSID.c_str();
        HTMLSite += "</title>";
        HTMLSite += "</head><body style='font-family:Verdana, Arial, Sans-Serif'><br /><center>";
        HTMLSite += RELAISSSID.c_str();
        HTMLSite += "<br /><br /><fieldset style='width:350px'><legend>Relais ";
        HTMLSite += RELAISSTANDORT.c_str();
        HTMLSite += "</legend><br />";
        HTMLSite += "<u>Aktuelle Relaisstellung</u><br />";
        HTMLSite += "<br />";
        HTMLSite += RELAISSTELLUNGHTML.c_str();

        if(pulseflag == 1) {
          HTMLSite += "<br /><br /><b>PULSE AKTIV</b><br />";
        } else {
          HTMLSite += "<br /><br /><form action='/toggle.htm' method='GET'><input type='submit' value='Relais umschalten'></input></form>";
          HTMLSite += "<br /><form action='/pulse.htm' method='GET'><input type='submit' value='Relais Puls'></input></form>";
        }
        
        HTMLSite += "<br /><hr /><br />Systemspannung: ";
        HTMLSite += String(ESP.getVcc()).substring(0,1);
        HTMLSite += ",";
        HTMLSite += String(ESP.getVcc()).substring(1);
        HTMLSite += " Volt<br /><br />";
        HTMLSite += "</fieldset><br /><fieldset style='width:350px'><br /><form action='relaisinfo.htm'><input type='submit' value='Relais Informationen'></form>";
        HTMLSite += "<br /><form action='netinfo.htm'><input type='submit' value='WLAN Netzwerk Informationen'></form>";
        HTMLSite += "<br /><form action='prginfo.htm'><input type='submit' value='Programm Informationen'></form>";
        HTMLSite += "<br /></fieldset></center></body></html>\r\n\r\n";
      } else if (HTMLSite=="") {
        stepflag=1;
        
        Serial.println(F("Setup Startseite wird ausgegeben"));
        Serial.println(F(""));

        HTMLSite ="<!DOCTYPE html><html><head><title>";
        HTMLSite += RELAISSSID.c_str();
        HTMLSite += "</title>";
        HTMLSite += "</head><body style='font-family:Verdana, Arial, Sans-Serif'><br /><center>";
        HTMLSite += RELAISSSID.c_str();
        HTMLSite += "<br /><br /><fieldset style='width:450px'><br />";
        HTMLSite += "<b>Herzlich Willkommen zum Setup<br />";
        HTMLSite += "des ESP8266-Relais.<br /><br />";
        HTMLSite += "Sie werden jetzt Schritt f&uuml;r Schritt<br />";
        HTMLSite += "durch das Setup gef&uuml;hrt.<br /><br /></fieldset><br />";
        HTMLSite += "<form method='GET' action='wlanconfig.htm'>";
        HTMLSite += "<input type='submit' value='Weiter zu Schritt 1...'></form>";
        HTMLSite += "</center></body></html>\r\n\r\n";
      }
          
      if (RequestString.startsWith("/favicon")) {  
        HTMLHeader  = "HTTP/1.1 403 FORBIDDEN\r\n";
        HTMLHeader += "Connection: close\r\n";
        HTMLHeader += "\r\n";
      } else {
        HTMLHeader  = "HTTP/1.1 200 OK\r\n";
        HTMLHeader += "Content-Length: ";
        HTMLHeader += HTMLSite.length();
        HTMLHeader += "\r\n";
        HTMLHeader += "Content-Type: text/html\r\n";
        HTMLHeader += "Connection: close\r\n";
        HTMLHeader += "\r\n";
      }
      
      client.print(HTMLHeader);
      delay(1);
      client.print(HTMLSite);
      delay(1);
    }
  }

  delay(10);
}

Neu ist auch die Möglichkeit einen Puls von einer Sekunde zu erzeugen, das bedeutet das Relais schaltet für eine Sekunde um und dann zurück.

Ich habe dafür den Stable Zweig der ESP8266-Erweiterung der Arduino IDE genutzt.

Viel Spaß damit 🙂

Verlinke diesen Beitrag:

<a href="http://blog.thomasheldt.de/software-zum-esp8266-wifi-relais-mit-esp-02-o-esp-03esp-07/">Software zum ESP8266 WiFi-Relais mit ESP-02 o. ESP-03/ESP-07</a>

The following two tabs change content below.
c7282393508c6050f22643a7feb8fec6?s=80&r=g Software zum ESP8266 WiFi-Relais mit ESP-02 o. ESP-03/ESP-07

Thomas H.

Als Betreiber dieses Blog versuche ich hier interessante Projekte und Tipps rund um die Elektronik zu bieten.
c7282393508c6050f22643a7feb8fec6?s=80&r=g Software zum ESP8266 WiFi-Relais mit ESP-02 o. ESP-03/ESP-07

Neueste Artikel von Thomas H. (alle ansehen)

Aktualisiert am: 8. Februar 2016

Neue Software veröffentlicht, stabiler und schlanker.

Aktualisiert am: 9. Februar 2016

Neue Software jetzt mit Puls Funktion.

16 Gedanken zu „Software zum ESP8266 WiFi-Relais mit ESP-02 o. ESP-03/ESP-07

  1. Mirswa Friedrich-Karl

    Hallo Herr Heldt,
    das von Ihnen vorgestellte Programm ist sehr interessant. Das Programm bietet für viele Anwendungen einen guten Einstieg für weitergehende Entwicklungen. Ich wollte das Programm testen und komme jedoch nicht über einen Fehler hinweg. Trotz Löschung und Neuinstallation aller Arduino-Komponenten auf meinem PC gemäß Ihrer Internetseite bleibt der ESP8266 immer an der gleichen Stelle hängen. Ich selbst kann aus dem Programm nicht ableiten, woran der Fehler liegt. Ich kann mich nach dem Hochladen des Programmes an dem ESP8266 anmelden und erhalte auch eine Adresse 192.168.4.2 oder 3. Beim Versuch, die Adresse 192.168.4.1 aufzurufen, wird die Internetseite nie gefunden.
    Am Seriellen Monitor erhalte ich die folgende Fehlermeldung:

    ********************************************************************************
    Starte System…
    AP-SSID: WiFi-Relais-10291641-SETUP

    Lese System-PIN aus EEPROM…
    System-PIN: 12345678

    Lese System Namen aus EEPROM…
    System Name:

    Lese SSID aus EEPROM…
    SSID:

    Lese Passwort aus EEPROM…
    PASS:

    WiFi-Netzwerk-Scan abgeschlossen…
    7 WiFi-Netzwerke gefunden

    1: wlan-fritz (-89)*
    2: WLAN (-93)*
    3: la loca (-81)*
    4: WLAN-829011 (-92)*
    5: EasyBox-8F0104 (-90)*
    6: Spatz (-36)*
    7: Offizielle Weltregierung (-94)*

    Setup AP
    SSID: WiFi-Relais-10291641-SETUP

    Mit WiFi-Netzwerk verbunden…
    Station-IP: 0.0.0.0
    AP-IP: 192.168.4.1

    Fehler beim starten des mDNS Responders!
    ********************************************************************************
    Egal, ob ich ein Modul ESP8266 01 oder ESP 8266 09 verwende. Immer das gleiche Ergebnis. Ich verwende als Betriebssystem Windows 7 und muss noch ergänzen, dass ich die librarie time.h generell aus dem Internet dazu laden muß. Sie ist offensichtlich nicht in der Arduino-Version 1.6.4 enthalten.

    Haben Sie eine Idee, was hier schief läuft?

    Ich bedanke mich im Voraus für Ihre Mühe.

    Mit freundlichen Grüßen aus Erfurt
    Friedrich-Karl Mirswa

    Antworten
  2. Mirswa Friedrich-Karl

    Nachtrag:

    Hallo Herr Heldt,
    ich habe gerade von einem Freund erfahren, dass er am Wochenende versucht hat meinen Fehler nachzuvollziehen. Dabei hat er festgestellt, dass das Problem durch die aktuelle Datei:

    http://arduino.esp8266.com/staging/package_esp8266com_index.json

    entsteht. Er hatte auf einem anderen PC noch eine ältere Datei aus dem betreffenden Verzeichnis. Damit funktioniert Ihr Programm problemlos.
    Ich hoffe, dass Sie den Fehler damit leicht eingrenzen können.

    Mit freundlichen Grüßen
    Friedrich-Kral Mirswa

    Antworten
  3. Alexander

    Hallo und Danke erstmal für die super Anleitung.

    nach anfänlichen Problemen, hab ichs geschaft das Sketch auf meinen ESP (01) zu laden.
    Leider mit selben ergebnis wie im oberen Post.

    Obern wird ja schon ein mögliche lösung gefunden, leider find ich keine andere Datei und kenn auch niemand der eine hätte.

    vieleicht kann ja hier wer nen link posten.

    Vielen Danke schon mal im Vorraus

    Antworten
    1. Thomas H. Beitragsautor

      Hallo alle zusammen,

      der Fehler kommt vom mDNS Rersponder, wenn man den raus lässt und nur über die IP-Adresse auf das ESP Modul zugreift läuft alles super.

      Ich habe oben im Quellcode die Zeilen mal raus genommen und als Bemerkung markiert // bzw. /* bis */

      Das Archiv ist aktuell noch nicht aktualisiert weil ich hoffe das es in einer zukünftigen Version wieder funktioniert.

      Gruß
      Thomas

      Antworten
  4. SAMYR W C ALMEIDA

    Is it works on ESP12E?
    I had load in, but when I try to open webserver on 192.168.4.1 nothing works (AP-SSID: WiFi-Relais-15847145-SETUP)

    What could be?

    Starte System…
    AP-SSID: WiFi-Relais-15847145-SETUP

    Lese System-PIN aus EEPROM…
    System-PIN: 12345678

    Lese System Namen aus EEPROM…
    System Name: ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ

    Lese SSID aus EEPROM…
    SSID: ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ

    Lese Passwort aus EEPROM…
    PASS: ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ

    Warte auf Wifi-Verbindung
    00000000000000000000

    Zeitueberschreitung bei Wifi-Netzwerk-Verbindung, starte Setup-AP

    WiFi-Netzwerk-Scan abgeschlossen…
    11 WiFi-Netzwerke gefunden

    1: Homer II (-85)*
    2: HUAWEI-E5220-9D1E (-75)*
    3: HUAWEI-E5220-A5FB (-80)*
    4: ALARMSTORE (-42)*
    5: VOUCHER (-50)
    6: Diana (-87)*
    7: VELOXTER (-86)
    8: Emanuella (-89)*
    9: GIZA (-91)*
    10: coordenadoria06 (-75)*
    11: MFAP (-90)*

    Setup AP
    SSID: WiFi-Relais-15847145-SETUP

    Mit WiFi-Netzwerk verbunden…
    Station-IP: 0.0.0.0
    AP-IP: 192.168.4.1

    Fehler beim starten des mDNS Responders!

    Antworten
    1. Thomas H. Beitragsautor

      Hello SAMYR W C ALMEIDA,

      the problem is the mDNS responder Service. You can disable the service if you mark all lines of the mDNS Service as command it will work

      A new version will released next week.

      Regards
      Thomas

      Antworten
  5. Funsailor

    Hallo Thomas,
    super Programm.
    Aber ich bekomme das Programm nicht kompiliert.
    Folgende Fehlermeldungen bekomme ich:

    WiFi-Relais.ino: In function ‚String strDatum()‘:
    WiFi-Relais.ino:280:22: error: ’now‘ was not declared in this scope
    WiFi-Relais.ino:282:26: error: ‚day‘ was not declared in this scope
    WiFi-Relais.ino:282:51: error: ‚month‘ was not declared in this scope
    WiFi-Relais.ino:282:75: error: ‚year‘ was not declared in this scope
    WiFi-Relais.ino: In function ‚String strUhrzeit()‘:
    ….

    Folgende Bibliotheken werden verwendet:
    Verwende die Bibliothek ESP8266WiFi im Ordner: C:\Users\Mikel\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266\1.6.5-1106-g8253b82\libraries\ESP8266WiFi
    Verwende die Bibliothek ESP8266mDNS im Ordner: C:\Users\Mikel\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266\1.6.5-1106-g8253b82\libraries\ESP8266mDNS (legacy)
    Verwende die Bibliothek EEPROM im Ordner: C:\Users\Mikel\AppData\Roaming\Arduino15\packages\esp8266\hardware\esp8266\1.6.5-1106-g8253b82\libraries\EEPROM

    Allerdings kan ich das Beispiel „WiFiWebServer“ Fehlerfrei kompiliern.

    Was mach ich falsch??

    Antworten
    1. Thomas H. Beitragsautor

      Hallo Funsailor,

      dir fehlt der folgende Include:

      #include Time.h

      Ohne die Time.h Lib kann es nicht klappen, bitte binde sie, wie im Beispielcode zu sehen,
      mit ein dann sollte es gehen.

      Gruß
      Thomas

      Antworten
    1. CHK_BLN

      Hallo Funsailor

      wie hast du denn die time.h lib eingebunden?
      In welches Verezchnis muss die Datei rein und wo bekomme ich die Datei her?
      Gruß

      Antworten
  6. A. Heinrich

    Hallo,
    leider geht es mir wie bereits einem Vorredner hier. Kompilierung der Software klappt einwandfrei, Fehlermeldung: Fehler beim starten des mDNS Responders!
    Die Webseite ist dann auch nicht erreichbar. welche Zeilen muss ich auskommentieren?
    Vielen Dank für Infos im voraus.
    A.H.

    Antworten
  7. Volker Bonge

    Hi,

    Ich konnte die Software erfolgreich aufspielen.
    Im seriellen Monitor wird auch alles korrekt angezeigt.
    Die WLAN Verbindung zum Setup funktioniert auch.
    Aber mein Browser sagt mir, dass 192.168.4.1 nicht verfügbar sei …
    Ich habe den obrigen, aktuellen Quellcode benutzt. Arduino ist 1.6.5

    Wo könnte der Fehler liegen ?

    lg
    Volker

    Antworten
  8. Michael

    Hallo,

    echt eine super Software. Leider habe ich das Gleich Problem wie schon einige andere auch, ich kann die Seite auf 192.168.4.1 die mir als Start IP im Seriellen Monitor angezeigt wird nicht öffnen. Ich bekomme immer einen Timeout. Woran kann das liegen?

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.