Hauptmenue
Netcoast.ch
Arduino & Raspberry Pi

Einleitung


Dieser Artikel ist noch im Aufbau!

Inhaltlich baut der Artikel auf einem bestimmten Basiswissen auf, eventuell hilft es zuerst die Artikel ESP8266-01 (ESP-01) über Serial Monitor mit AT Befehlen im Clientmodus verwenden und Firmware flashen und ESP8266-01 (ESP-01) über Serial Monitor mit AT Befehlen im Servermodus verwenden anzusehen.

Die hier verwendeten Beispiele kommen ohne einen Logic-Level-Shifter aus, welcher eigentlich verwendet werden sollte.
Die hier angegangene Variante über SoftwareSerial hat den Vorteil, dass der ESP8266-01 nicht speziell noch programmiert werden muss.
Für komplexere und eventuell performantere Lösungen, kommt man aber wohl nicht drumherum den ESP entsprechend zu Programmieren und nur noch über SoftwareSerial / HardwareSerial für bestimmte Aufgaben zu kommunizieren.

Schema Verbindung ESP8266-01 (ESP-01) und Arduino / andere Hersteller mit SoftwareSerial


Tipp
RX und TX werden gekreuzt, man sendet ja vom TX (Transmitting...) des Arduino an den RX (Recieving...) vom ESP-01 und umgekehrt.

ESP8266-01 als WebServer konfigurieren

Dieser Part wird durch das Sketch vom Arduino an den ESP übernommen.
Trotzdem ist es gut wenn man weiss wieso das gemacht wird und wo:
  1. AT+CIPMUX=1 -> Multiple Verbindungen mit dem ESP erlauben, ohne Dies kann Schritt 2 nicht ausgeführt werden.
  2. AT+CIPSERVER=1,80 -> Der ESP startet den WebServer auf Port 80. Ohne Angabe eines Ports wird der Standard-Port 333 genommen.
Da diese Einstellungen nicht gespeichert werden, müssen sie bei jedem Neustart gesetzt werden.

Verbindungsdaten (IP) vom ESP8266-01 ermitteln

Auch wenn dieser Teil logisch erscheint, werde ich ein paar Worte darüber verlieren:

Sketch - Webseite ausgeben und Arduino ansprechen

Diese Variante kommt ohne spezifische App / Programm oder Service aus.
Das einzige was man benötigt ist die Verbindung zum ESP über WLan.

Kurzerklärung von Code und Vorgehen

Webseite ausgeben

Möchte man über die Webseite Daten an den ESP8266-01 respektive den Arduino senden und darauf reagieren, macht man dies am einfachsten über Links oder ein Formular.
Daraus ergeben sich folgende drei Möglichkeiten:
Links
<html>
 <body>
  <a href="http://192.168.1.13?LedWeiss=1">LED 1 on</a>&nbsp;<a href="http://192.168.1.13?LedWeiss=0">LED 1 off</a><br>
  <a href="http://192.168.1.13?LedGelb=1">LED 2 on</a>&nbsp;<a href="http://192.168.1.13?LedGelb=0">LED 2 off</a>
 </body>
</html>
GET-Formular
<html>
  <body>
   <form method="get">
    <input type="radio" name="LedWeiss" value="1"><input type="radio" name="LedWeiss" value="0"><br>
    <input type="radio" name="LedGelb" value="1"><input type="radio" name="LedGelb" value="0"><br>
    <input type="submit">
   </form>
  </body>
</html>
POST-Formular
<html>
 <body>
  <form method="post" action="http://192.168.1.13">
   <input type="radio" name="LedWeiss" value="1"><input type="radio" name="LedWeiss" value="0"><br>
   <input type="radio" name="LedGelb" value="1"><input type="radio" name="LedGelb" value="0"><br>
   <input type="submit">
  </form>
 </body>
</html>

Anfrage von Webseite verarbeiten

Wird der ESP angesprochen für den ersten Verbindungsversuch, gibt der ESP folgendes aus:
0,CONNECT

+IPD,0,372:GET /favicon.ico HTTP/1.1
Host: 192.168.1.13
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Referer: http://192.168.1.13/
Accept-Encoding: gzip, deflate
Accept-Language: de-DE,de;q=0.9
Auf Zeile 1 steht die Nummer der aktuellen Verbindungsanfrage auf die man reagieren kann.
Anfragen starten dann mit +IPD..., nach dem IPD steht dann die Verbindungsnummer auf die man dann die Webseite antwortet.
Host ist die aktuelle IP vom ESP. Auf den Rest gehe ich hier nicht weiter ein, da er für eine Standardanwendung nicht benötigt wird.

Wird auf ein Link / Formular reagiert und an den ESP gesendet, gibt der ESP folgendes aus:
1,CONNECT

+IPD,1,597:POST / HTTP/1.1
Host: 192.168.1.13
Connection: keep-alive
Content-Length: 10
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://192.168.1.13
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.1.13/
Accept-Encoding: gzip, deflate
Accept-Language: de-DE,de;q=0.9

LedWeiss=1
Auf Zeile 1 steht wieder die Verbindungsnummer, auf welche man reagieren kann.
Die eigentliche Anfrage startet ab "+IPD,<VERBINDUNGSNUMMER>,<Status>,<Anfrage-Art>..."
Möchte man also auf eine Anfrage / Anklicken eines Buttons / Links reagieren, muss die IPD-Anfrage ausgelesen werden.
Hier spielt dann die Variante welche man für das Anzeigen der Webseite wählt eine grosse Rolle:

Beispiel-Sketch (Links, GET, POST)

Einfache Variante mit Links

angezeigte Webseite (HTML-Code):
<html>
<body>
<a href="http://192.168.1.13?LedWeiss=1">LED 1 on</a> <a href="http://192.168.1.13?LedWeiss=0">LED 1 off</a><br>
<a href="http://192.168.1.13?LedGelb=1">LED 2 on</a> <a href="http://192.168.1.13?LedGelb=0">LED 2 off</a>
</body>
</html>
Die IP wird je nach System eine andere sein.
Sollte sich die IP in der Länge verändern, muss das Sketch bei CIPSEND entsprechend angepasst werden.

Arduino Sketch:
/*
Achtug: RX und TX kreuzen, das heisst PIN 10 geht zu TX vom ESP und PIN 11 zum RX vom ESP.
*/
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

//Start Skriptvariablen
bool IncommingESPString = false;
bool AntwortESPOffen = false;
bool HTTPAnfrage = false;
bool HTTPErstverbindung = false;
String DerStringVomESP;
String HTTPHost;
long int time;
long int iZaehler;
int HTTPVerbindungsNr=0; //von 1 - 10
int HTTPParameter = 0; //0 = leer, 1 = GET, 2 = POST

int PinLedWeiss = 3;
int PinLedGelb = 2;

//debug gibt diverse Informationen zum Serial-Monitor aus.
//true = Informationen werden angezeigt.
//false = Keine Informationen werden angezeigt.
bool debug = true;

//SerAusg gibt etwas an den Seriellen Monitor zurück.
bool SerAusg = true;
//Ende Skriptvariablen

void setup() {
pinMode(PinLedWeiss, OUTPUT);
pinMode(PinLedGelb, OUTPUT);
digitalWrite(PinLedWeiss, LOW);
digitalWrite(PinLedGelb, LOW);

//Serial-Port mit BAUD-Rate für den HardwareSerial-Port
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// BAUD-Rate für den SoftwareSerial-Port zum ESP.
mySerial.begin(9600);
BefehlanESPAusgeben("ATrn", 1000, true, debug, 0);
BefehlanESPAusgeben("AT+CIPMUX=1rn", 1000, true, debug, 0);
BefehlanESPAusgeben("AT+CIPSERVER=1,80rn", 1000, true, debug, 0);
BefehlanESPAusgeben("AT+CIPCLOSE=5,80rn", 1000, true, debug, 0);
}


String BefehlanESPAusgeben(String TempString, const int timeout, boolean warteok, boolean debug, int SpezialTask)
{
String response = "";
if(debug)
{
Serial.println("Arbeite: "+TempString);
}

if(SpezialTask > 0)
{
mySerial.print("<html><body><a href="http://"+HTTPHost+"?LedWeiss=1">LED 1 on</a>");
mySerial.print("&nbsp;<a href="http://"+HTTPHost+"?LedWeiss=0">LED 1 off</a><br><a href="http://"+HTTPHost+"?LedGelb=1">LED 2 on");
mySerial.print("</a>&nbsp;<a href="http://"+HTTPHost+"?LedGelb=0">LED 2 off</a></body></html>");
}
else
{
//Übermittelter String wird bei 50 Zeichen aufgeteilt gesendet.
int TxtL = 50;
if(TempString.length() > TxtL)
{
int i = (TempString.length()/TxtL);
if(TempString.length()%TxtL > 0)
{
i = i+1;
}
for (int i2=0; i2 < i; i2++){
mySerial.print(TempString.substring(i2*TxtL,(TxtL*i2+TxtL)));
delay(timeout);
}
}
else
{
mySerial.print(TempString);
}
}

if(warteok == false)
{
long int time = millis();
while( (time+timeout) > millis())
{
while(mySerial.available())
{
char c = mySerial.read();
response+=c;
}
}
}
else
{
//Warten bis OK retour kommt.
if(debug)
{
Serial.println("Warte: "+TempString);
}
bool OKerhalten = false;
bool ErrorFail = false;
long int time = millis();
while(OKerhalten == false)
{
while(mySerial.available())
{
char c = mySerial.read();
response+=c;
if(response.indexOf("OK") > -1)
{
OKerhalten = true;
}
if(response.indexOf("ERROR") > -1)
{
OKerhalten = true;
ErrorFail = true;
}
if(response.indexOf("FAIL") > -1)
{
OKerhalten = true;
ErrorFail = true;
}

}
if((time+30000) < millis())
{
//Failsafe, bricht nach 60Sek ab.
if(response.indexOf("ERROR") > -1)
{
OKerhalten = true;
ErrorFail = true;
}
if(response.indexOf("FAIL") > -1)
{
OKerhalten = true;
ErrorFail = true;
}
OKerhalten = true;
}
}
}
if(debug)
{
Serial.print(response);
}
return response;
}

void loop() { // run over and over
if(IncommingESPString == false)
{
time = millis();
iZaehler = 0;
DerStringVomESP = "";
}
if (mySerial.available()) {
IncommingESPString = true;
time = millis();
iZaehler++;
if(iZaehler > 1000)
{
iZaehler = 0;
DerStringVomESP = "";
}
else
{
char DerTeilStringVomESP = mySerial.read();
DerStringVomESP += DerTeilStringVomESP;
}
}
if(IncommingESPString == true)
{
if((time+1100) < millis())
{
if(debug)
{
Serial.println("Fertig");
}
VerarbeiteStringVonESP(DerStringVomESP);
DerStringVomESP = "";
}
}
if (Serial.available()) {
mySerial.println(Serial.readString());
}
}



void VerarbeiteStringVonESP(String BearbeiteString)
{
if(BearbeiteString.indexOf("+IPD") > -1)
{
if(debug)
{
Serial.println("Start:");
Serial.println(BearbeiteString);
}
HTTPAnfrage = false;
//+IPD,0,478:GET / HTTP/1.1

if(BearbeiteString.indexOf(":GET / H") > -1)
{
HTTPVerbindungsNr = BearbeiteString.substring((BearbeiteString.indexOf("+IPD,")+5), (BearbeiteString.indexOf("+IPD,")+6)).toInt();
HTTPAnfrage = true;
HTTPParameter = 1;
HTTPErstverbindung = true;
HTTPHost = BearbeiteString.substring((BearbeiteString.indexOf("Host:")+6), 100);
HTTPHost = HTTPHost.substring(0,(HTTPHost.indexOf("n")-1));
if(debug)
{
Serial.println("Get-Anfrage Leer");
}
}
if(debug)
{
Serial.println("DA");
Serial.println(":GET /"+HTTPHost+"?");
Serial.println(BearbeiteString.indexOf(":GET /"+HTTPHost+"?"));
Serial.println("DA");
}
if(BearbeiteString.indexOf(":GET /"+HTTPHost+"?") > -1 || BearbeiteString.indexOf(":GET /?") > -1)
{
HTTPVerbindungsNr = BearbeiteString.substring((BearbeiteString.indexOf("+IPD,")+5), (BearbeiteString.indexOf("+IPD,")+6)).toInt();
HTTPAnfrage = true;
HTTPParameter = 1;
HTTPErstverbindung = false;
if(BearbeiteString.indexOf("LedWeiss=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 1)
{
digitalWrite(PinLedWeiss, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 0)
{
digitalWrite(PinLedWeiss, LOW);
}
}
if(BearbeiteString.indexOf("LedGelb=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 1)
{
digitalWrite(PinLedGelb, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 0)
{
digitalWrite(PinLedGelb, LOW);
}
}
if(debug)
{
Serial.println("Get-Anfrage mit Variable erhalten");
}
}
if(BearbeiteString.indexOf(":POST / H") > -1)
{
HTTPVerbindungsNr = BearbeiteString.substring((BearbeiteString.indexOf("+IPD,")+5), (BearbeiteString.indexOf("+IPD,")+6)).toInt();
HTTPAnfrage = true;
HTTPParameter = 1;
HTTPErstverbindung = false;
if(BearbeiteString.indexOf("LedWeiss=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 1)
{
digitalWrite(PinLedWeiss, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 0)
{
digitalWrite(PinLedWeiss, LOW);
}
}
if(BearbeiteString.indexOf("LedGelb=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 1)
{
digitalWrite(PinLedGelb, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 0)
{
digitalWrite(PinLedGelb, LOW);
}
}
if(debug)
{
Serial.println("POST-Anfrage mit Variable erhalten");
}
}
if(debug)
{
Serial.println("Ende:");
}
}
if(HTTPAnfrage == true)
{
if(debug)
{
Serial.println(HTTPAnfrage);
Serial.println(HTTPErstverbindung);
Serial.println(HTTPVerbindungsNr);
Serial.println(HTTPHost);
}
}
if(HTTPAnfrage == true)
{
//Es ist eine HTTP-Anfrage offen diese abarbeiten
if(HTTPErstverbindung == true)
{
//Standard-Webseite ausgeben Start
String Befehl;
Befehl = "AT+CIPSEND="+String(HTTPVerbindungsNr)+","+(206+HTTPHost.length()+HTTPHost.length()+HTTPHost.length()+HTTPHost.length())+"rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);
Befehl = "Spezial Link";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, false, debug, 1);

Befehl = "AT+CIPCLOSE="+String(HTTPVerbindungsNr)+"rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);

//Standard-Webseite ausgeben Ende
HTTPErstverbindung = false;
HTTPAnfrage = false;
}
else
{
//Reagieren auf Formular / Variable
String Befehl;
Befehl = "AT+CIPSEND="+String(HTTPVerbindungsNr)+","+(206+HTTPHost.length()+HTTPHost.length()+HTTPHost.length()+HTTPHost.length())+"rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);
Befehl = "Spezial Link";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, false, debug, 1);
Befehl = "AT+CIPCLOSE="+String(HTTPVerbindungsNr)+"rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);
HTTPAnfrage = false;
}
}
else
{
if(SerAusg == true)
{
Serial.println("Nicht bearbeitete Anfrage Start:");
Serial.println(DerStringVomESP);
Serial.println("Nicht bearbeitete Anfrage Ende");
}
}
IncommingESPString = false;
}

Variante mit GET-Formular

angezeigte Webseite (HTML-Code):
<html>
<body>
<form method="get">
<input type="radio" name="LedWeiss" value="1"><input type="radio" name="LedWeiss" value="0"><br>
<input type="radio" name="LedGelb" value="1"><input type="radio" name="LedGelb" value="0"><br>
<input type="submit">
</form>
</body>
</html>
Arduino Sketch:
/*
Achtug: RX und TX kreuzen, das heisst PIN 10 geht zu TX vom ESP und PIN 11 zum RX vom ESP.
*/
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

//Start Skriptvariablen
bool IncommingESPString = false;
bool AntwortESPOffen = false;
bool HTTPAnfrage = false;
bool HTTPErstverbindung = false;
String DerStringVomESP;
String HTTPHost;
long int time;
long int iZaehler;
int HTTPVerbindungsNr=0; //von 1 - 10
int HTTPParameter = 0; //0 = leer, 1 = GET, 2 = POST

int PinLedWeiss = 3;
int PinLedGelb = 2;

//debug gibt diverse Informationen zum Serial-Monitor aus.
//true = Informationen werden angezeigt.
//false = Keine Informationen werden angezeigt.
bool debug = true;

//SerAusg gibt etwas an den Seriellen Monitor zurück.
bool SerAusg = true;

//Ende Skriptvariablen

void setup() {
pinMode(PinLedWeiss, OUTPUT);
pinMode(PinLedGelb, OUTPUT);
digitalWrite(PinLedWeiss, LOW);
digitalWrite(PinLedGelb, LOW);

//Serial-Port mit BAUD-Rate für den HardwareSerial-Port
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// BAUD-Rate für den SoftwareSerial-Port zum ESP.
mySerial.begin(9600);
BefehlanESPAusgeben("ATrn", 1000, true, debug, 0);
BefehlanESPAusgeben("AT+CIPMUX=1rn", 1000, true, debug, 0);
BefehlanESPAusgeben("AT+CIPSERVER=1,80rn", 1000, true, debug, 0);
BefehlanESPAusgeben("AT+CIPCLOSE=5,80rn", 1000, true, debug, 0);
}


String BefehlanESPAusgeben(String TempString, const int timeout, boolean warteok, boolean debug, int SpezialTask)
{
String response = "";
if(debug)
{
Serial.println("Arbeite: "+TempString);
}

if(SpezialTask > 0)
{
mySerial.print("<html><body><form method="get"><input type="radio" ");
mySerial.print("name="LedWeiss" value="1"><input type="radio" name="LedWeiss" value="0"><br><input type="radio" name="LedGelb" value="1">");
mySerial.print("<input type="radio" name="LedGelb" value="0"><br><input type="submit"></form></body></html>");
}
else
{
//Übermittelter String wird bei 50 Zeichen aufgeteilt gesendet.
int TxtL = 50;
if(TempString.length() > TxtL)
{
int i = (TempString.length()/TxtL);
if(TempString.length()%TxtL > 0)
{
i = i+1;
}
for (int i2=0; i2 < i; i2++){
mySerial.print(TempString.substring(i2*TxtL,(TxtL*i2+TxtL)));
delay(timeout);
}
}
else
{
mySerial.print(TempString);
}
}

if(warteok == false)
{
long int time = millis();
while( (time+timeout) > millis())
{
while(mySerial.available())
{
char c = mySerial.read();
response+=c;
}
}
}
else
{
//Warten bis OK retour kommt.
if(debug)
{
Serial.println("Warte: "+TempString);
}
bool OKerhalten = false;
bool ErrorFail = false;
long int time = millis();
while(OKerhalten == false)
{
while(mySerial.available())
{
char c = mySerial.read();
response+=c;
if(response.indexOf("OK") > -1)
{
OKerhalten = true;
}
if(response.indexOf("ERROR") > -1)
{
OKerhalten = true;
ErrorFail = true;
}
if(response.indexOf("FAIL") > -1)
{
OKerhalten = true;
ErrorFail = true;
}

}
if((time+30000) < millis())
{
//Failsafe, bricht nach 60Sek ab.
if(response.indexOf("ERROR") > -1)
{
OKerhalten = true;
ErrorFail = true;
}
if(response.indexOf("FAIL") > -1)
{
OKerhalten = true;
ErrorFail = true;
}
OKerhalten = true;
}
}
}
if(debug)
{
Serial.print(response);
}
return response;
}

void loop() { // run over and over
if(IncommingESPString == false)
{
time = millis();
iZaehler = 0;
DerStringVomESP = "";
}
if (mySerial.available()) {
IncommingESPString = true;
time = millis();
iZaehler++;
if(iZaehler > 1000)
{
iZaehler = 0;
DerStringVomESP = "";
}
else
{
char DerTeilStringVomESP = mySerial.read();
DerStringVomESP += DerTeilStringVomESP;
}
}
if(IncommingESPString == true)
{
if((time+1100) < millis())
{
if(debug)
{
Serial.println("Fertig");
}
VerarbeiteStringVonESP(DerStringVomESP);
DerStringVomESP = "";
}
}
if (Serial.available()) {
mySerial.println(Serial.readString());
}
}



void VerarbeiteStringVonESP(String BearbeiteString)
{
if(BearbeiteString.indexOf("+IPD") > -1)
{
if(debug)
{
Serial.println("Start:");
Serial.println(BearbeiteString);
}
HTTPAnfrage = false;
//+IPD,0,478:GET / HTTP/1.1

if(BearbeiteString.indexOf(":GET / H") > -1)
{
HTTPVerbindungsNr = BearbeiteString.substring((BearbeiteString.indexOf("+IPD,")+5), (BearbeiteString.indexOf("+IPD,")+6)).toInt();
HTTPAnfrage = true;
HTTPParameter = 1;
HTTPErstverbindung = true;
HTTPHost = BearbeiteString.substring((BearbeiteString.indexOf("Host:")+6), 100);
HTTPHost = HTTPHost.substring(0,(HTTPHost.indexOf("n")-1));
if(debug)
{
Serial.println("Get-Anfrage Leer");
}
}
if(debug)
{
Serial.println("DA");
Serial.println(":GET /"+HTTPHost+"?");
Serial.println(BearbeiteString.indexOf(":GET /"+HTTPHost+"?"));
Serial.println("DA");
}
if(BearbeiteString.indexOf(":GET /"+HTTPHost+"?") > -1 || BearbeiteString.indexOf(":GET /?") > -1)
{
HTTPVerbindungsNr = BearbeiteString.substring((BearbeiteString.indexOf("+IPD,")+5), (BearbeiteString.indexOf("+IPD,")+6)).toInt();
HTTPAnfrage = true;
HTTPParameter = 1;
HTTPErstverbindung = false;
if(BearbeiteString.indexOf("LedWeiss=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 1)
{
digitalWrite(PinLedWeiss, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 0)
{
digitalWrite(PinLedWeiss, LOW);
}
}
if(BearbeiteString.indexOf("LedGelb=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 1)
{
digitalWrite(PinLedGelb, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 0)
{
digitalWrite(PinLedGelb, LOW);
}
}
if(debug)
{
Serial.println("Get-Anfrage mit Variable erhalten");
}
}
if(BearbeiteString.indexOf(":POST / H") > -1)
{
HTTPVerbindungsNr = BearbeiteString.substring((BearbeiteString.indexOf("+IPD,")+5), (BearbeiteString.indexOf("+IPD,")+6)).toInt();
HTTPAnfrage = true;
HTTPParameter = 1;
HTTPErstverbindung = false;
if(BearbeiteString.indexOf("LedWeiss=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 1)
{
digitalWrite(PinLedWeiss, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 0)
{
digitalWrite(PinLedWeiss, LOW);
}
}
if(BearbeiteString.indexOf("LedGelb=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 1)
{
digitalWrite(PinLedGelb, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 0)
{
digitalWrite(PinLedGelb, LOW);
}
}
if(debug)
{
Serial.println("POST-Anfrage mit Variable erhalten");
}
}
if(debug)
{
Serial.println("Ende:");
}
}
if(HTTPAnfrage == true)
{
if(debug)
{
Serial.println(HTTPAnfrage);
Serial.println(HTTPErstverbindung);
Serial.println(HTTPVerbindungsNr);
Serial.println(HTTPHost);
}
}
if(HTTPAnfrage == true)
{
//Es ist eine HTTP-Anfrage offen diese abarbeiten
if(HTTPErstverbindung == true)
{
//Standard-Webseite ausgeben Start
String Befehl;
Befehl = "AT+CIPSEND="+String(HTTPVerbindungsNr)+",263rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);
Befehl = "Spezial GET";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, false, debug, 2);

Befehl = "AT+CIPCLOSE="+String(HTTPVerbindungsNr)+"rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);

//Standard-Webseite ausgeben Ende
HTTPErstverbindung = false;
HTTPAnfrage = false;
}
else
{
//Reagieren auf Formular / Variable
String Befehl;
Befehl = "AT+CIPSEND="+String(HTTPVerbindungsNr)+",263rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);
Befehl = "Spezial GET";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, false, debug, 2);
Befehl = "AT+CIPCLOSE="+String(HTTPVerbindungsNr)+"rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);
HTTPAnfrage = false;
}
}
else
{
if(SerAusg == true)
{
Serial.println("Nicht bearbeitete Anfrage Start:");
Serial.println(DerStringVomESP);
Serial.println("Nicht bearbeitete Anfrage Ende");
}
}
IncommingESPString = false;
}

Variante mit POST-Formular

angezeigte Webseite (HTML-Code):
<html>
<body>
<form method="post" action="http://192.168.1.13">
<input type="radio" name="LedWeiss" value="1"><input type="radio" name="LedWeiss" value="0"><br>
<input type="radio" name="LedGelb" value="1"><input type="radio" name="LedGelb" value="0"><br>
<input type="submit">
</form>
</body>
</html>
Die IP wird je nach System eine andere sein.
Sollte sich die IP in der Länge verändern, muss das Sketch bei CIPSEND entsprechend angepasst werden.

Arduino Sketch:
/*
Achtug: RX und TX kreuzen, das heisst PIN 10 geht zu TX vom ESP und PIN 11 zum RX vom ESP.
*/
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

//Start Skriptvariablen
bool IncommingESPString = false;
bool AntwortESPOffen = false;
bool HTTPAnfrage = false;
bool HTTPErstverbindung = false;
String DerStringVomESP;
String HTTPHost;
long int time;
long int iZaehler;
int HTTPVerbindungsNr=0; //von 1 - 10
int HTTPParameter = 0; //0 = leer, 1 = GET, 2 = POST

int PinLedWeiss = 3;
int PinLedGelb = 2;

//debug gibt diverse Informationen zum Serial-Monitor aus.
//true = Informationen werden angezeigt.
//false = Keine Informationen werden angezeigt.
bool debug = true;

//SerAusg gibt etwas an den Seriellen Monitor zurück.
bool SerAusg = true;

//Ende Skriptvariablen

void setup() {
pinMode(PinLedWeiss, OUTPUT);
pinMode(PinLedGelb, OUTPUT);
digitalWrite(PinLedWeiss, LOW);
digitalWrite(PinLedGelb, LOW);

//Serial-Port mit BAUD-Rate für den HardwareSerial-Port
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// BAUD-Rate für den SoftwareSerial-Port zum ESP.
mySerial.begin(9600);
BefehlanESPAusgeben("ATrn", 1000, true, debug, 0);
BefehlanESPAusgeben("AT+CIPMUX=1rn", 1000, true, debug, 0);
BefehlanESPAusgeben("AT+CIPSERVER=1,80rn", 1000, true, debug, 0);
BefehlanESPAusgeben("AT+CIPCLOSE=5,80rn", 1000, true, debug, 0);
}


String BefehlanESPAusgeben(String TempString, const int timeout, boolean warteok, boolean debug, int SpezialTask)
{
String response = "";
if(debug)
{
Serial.println("Arbeite: "+TempString);
}

if(SpezialTask > 0)
{
mySerial.print("<html><body><form method="post" action="http://"+HTTPHost+""><input type="radio" ");
mySerial.print("name="LedWeiss" value="1"><input type="radio" name="LedWeiss" value="0"><br><input type="radio" name="LedGelb" value="1">");
mySerial.print("<input type="radio" name="LedGelb" value="0"><br><input type="submit"></form></body></html>");
}
else
{
//Übermittelter String wird bei 50 Zeichen aufgeteilt gesendet.
int TxtL = 50;
if(TempString.length() > TxtL)
{
int i = (TempString.length()/TxtL);
if(TempString.length()%TxtL > 0)
{
i = i+1;
}
for (int i2=0; i2 < i; i2++){
mySerial.print(TempString.substring(i2*TxtL,(TxtL*i2+TxtL)));
delay(timeout);
}
}
else
{
mySerial.print(TempString);
}
}

if(warteok == false)
{
long int time = millis();
while( (time+timeout) > millis())
{
while(mySerial.available())
{
char c = mySerial.read();
response+=c;
}
}
}
else
{
//Warten bis OK retour kommt.
if(debug)
{
Serial.println("Warte: "+TempString);
}
bool OKerhalten = false;
bool ErrorFail = false;
long int time = millis();
while(OKerhalten == false)
{
while(mySerial.available())
{
char c = mySerial.read();
response+=c;
if(response.indexOf("OK") > -1)
{
OKerhalten = true;
}
if(response.indexOf("ERROR") > -1)
{
OKerhalten = true;
ErrorFail = true;
}
if(response.indexOf("FAIL") > -1)
{
OKerhalten = true;
ErrorFail = true;
}

}
if((time+30000) < millis())
{
//Failsafe, bricht nach 60Sek ab.
if(response.indexOf("ERROR") > -1)
{
OKerhalten = true;
ErrorFail = true;
}
if(response.indexOf("FAIL") > -1)
{
OKerhalten = true;
ErrorFail = true;
}
OKerhalten = true;
}
}
}
if(debug)
{
Serial.print(response);
}
return response;
}

void loop() { // run over and over
if(IncommingESPString == false)
{
time = millis();
iZaehler = 0;
DerStringVomESP = "";
}
if (mySerial.available()) {
IncommingESPString = true;
time = millis();
iZaehler++;
if(iZaehler > 1000)
{
iZaehler = 0;
DerStringVomESP = "";
}
else
{
char DerTeilStringVomESP = mySerial.read();
DerStringVomESP += DerTeilStringVomESP;
}
}
if(IncommingESPString == true)
{
if((time+1100) < millis())
{
if(debug)
{
Serial.println("Fertig");
}
VerarbeiteStringVonESP(DerStringVomESP);
DerStringVomESP = "";
}
}
if (Serial.available()) {
mySerial.println(Serial.readString());
}
}



void VerarbeiteStringVonESP(String BearbeiteString)
{
if(BearbeiteString.indexOf("+IPD") > -1)
{
if(debug)
{
Serial.println("Start:");
Serial.println(BearbeiteString);
}
HTTPAnfrage = false;
//+IPD,0,478:GET / HTTP/1.1

if(BearbeiteString.indexOf(":GET / H") > -1)
{
HTTPVerbindungsNr = BearbeiteString.substring((BearbeiteString.indexOf("+IPD,")+5), (BearbeiteString.indexOf("+IPD,")+6)).toInt();
HTTPAnfrage = true;
HTTPParameter = 1;
HTTPErstverbindung = true;
HTTPHost = BearbeiteString.substring((BearbeiteString.indexOf("Host:")+6), 100);
HTTPHost = HTTPHost.substring(0,(HTTPHost.indexOf("n")-1));
if(debug)
{
Serial.println("Get-Anfrage Leer");
}
}
if(debug)
{
Serial.println("DA");
Serial.println(":GET /"+HTTPHost+"?");
Serial.println(BearbeiteString.indexOf(":GET /"+HTTPHost+"?"));
Serial.println("DA");
}
if(BearbeiteString.indexOf(":GET /"+HTTPHost+"?") > -1 || BearbeiteString.indexOf(":GET /?") > -1)
{
HTTPVerbindungsNr = BearbeiteString.substring((BearbeiteString.indexOf("+IPD,")+5), (BearbeiteString.indexOf("+IPD,")+6)).toInt();
HTTPAnfrage = true;
HTTPParameter = 1;
HTTPErstverbindung = false;
if(BearbeiteString.indexOf("LedWeiss=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 1)
{
digitalWrite(PinLedWeiss, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 0)
{
digitalWrite(PinLedWeiss, LOW);
}
}
if(BearbeiteString.indexOf("LedGelb=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 1)
{
digitalWrite(PinLedGelb, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 0)
{
digitalWrite(PinLedGelb, LOW);
}
}
if(debug)
{
Serial.println("Get-Anfrage mit Variable erhalten");
}
}
if(BearbeiteString.indexOf(":POST / H") > -1)
{
HTTPVerbindungsNr = BearbeiteString.substring((BearbeiteString.indexOf("+IPD,")+5), (BearbeiteString.indexOf("+IPD,")+6)).toInt();
HTTPAnfrage = true;
HTTPParameter = 1;
HTTPErstverbindung = false;
if(BearbeiteString.indexOf("LedWeiss=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 1)
{
digitalWrite(PinLedWeiss, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 0)
{
digitalWrite(PinLedWeiss, LOW);
}
}
if(BearbeiteString.indexOf("LedGelb=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 1)
{
digitalWrite(PinLedGelb, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 0)
{
digitalWrite(PinLedGelb, LOW);
}
}
if(debug)
{
Serial.println("POST-Anfrage mit Variable erhalten");
}
}
if(debug)
{
Serial.println("Ende:");
}
}
if(HTTPAnfrage == true)
{
if(debug)
{
Serial.println(HTTPAnfrage);
Serial.println(HTTPErstverbindung);
Serial.println(HTTPVerbindungsNr);
Serial.println(HTTPHost);
}
}
if(HTTPAnfrage == true)
{
//Es ist eine HTTP-Anfrage offen diese abarbeiten
if(HTTPErstverbindung == true)
{
//Standard-Webseite ausgeben Start
String Befehl;
Befehl = "AT+CIPSEND="+String(HTTPVerbindungsNr)+","+(281+HTTPHost.length())+"rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);
Befehl = "Spezial POST";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, false, debug, 3);

Befehl = "AT+CIPCLOSE="+String(HTTPVerbindungsNr)+"rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);

//Standard-Webseite ausgeben Ende
HTTPErstverbindung = false;
HTTPAnfrage = false;
}
else
{
//Reagieren auf Formular / Variable
String Befehl;
Befehl = "AT+CIPSEND="+String(HTTPVerbindungsNr)+","+(281+HTTPHost.length())+"rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);
Befehl = "Spezial POST";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, false, debug, 3);
Befehl = "AT+CIPCLOSE="+String(HTTPVerbindungsNr)+"rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);
HTTPAnfrage = false;
}
}
else
{
if(SerAusg == true)
{
Serial.println("Nicht bearbeitete Anfrage Start:");
Serial.println(DerStringVomESP);
Serial.println("Nicht bearbeitete Anfrage Ende");
}
}
IncommingESPString = false;
}

Einleitung


Dieser Artikel ist noch im Aufbau!

Inhaltlich baut der Artikel auf einem bestimmten Basiswissen auf, eventuell hilft es zuerst die Artikel ESP8266-01 (ESP-01) über Serial Monitor mit AT Befehlen im Clientmodus verwenden und Firmware flashen und ESP8266-01 (ESP-01) über Serial Monitor mit AT Befehlen im Servermodus verwenden anzusehen.

Die hier verwendeten Beispiele kommen ohne einen Logic-Level-Shifter aus, welcher eigentlich verwendet werden sollte.
Die hier angegangene Variante über SoftwareSerial hat den Vorteil, dass der ESP8266-01 nicht speziell noch programmiert werden muss.
Für komplexere und eventuell performantere Lösungen, kommt man aber wohl nicht drumherum den ESP entsprechend zu Programmieren und nur noch über SoftwareSerial / HardwareSerial für bestimmte Aufgaben zu kommunizieren.

Schema Verbindung ESP8266-01 (ESP-01) und Arduino / andere Hersteller mit SoftwareSerial


Tipp
RX und TX werden gekreuzt, man sendet ja vom TX (Transmitting...) des Arduino an den RX (Recieving...) vom ESP-01 und umgekehrt.

ESP8266-01 als WebServer konfigurieren

Dieser Part wird durch das Sketch vom Arduino an den ESP übernommen.
Trotzdem ist es gut wenn man weiss wieso das gemacht wird und wo:
  1. AT+CIPMUX=1 -> Multiple Verbindungen mit dem ESP erlauben, ohne Dies kann Schritt 2 nicht ausgeführt werden.
  2. AT+CIPSERVER=1,80 -> Der ESP startet den WebServer auf Port 80. Ohne Angabe eines Ports wird der Standard-Port 333 genommen.
Da diese Einstellungen nicht gespeichert werden, müssen sie bei jedem Neustart gesetzt werden.

Verbindungsdaten (IP) vom ESP8266-01 ermitteln

Auch wenn dieser Teil logisch erscheint, werde ich ein paar Worte darüber verlieren:

Sketch - Webseite ausgeben und Arduino ansprechen

Diese Variante kommt ohne spezifische App / Programm oder Service aus.
Das einzige was man benötigt ist die Verbindung zum ESP über WLan.

Kurzerklärung von Code und Vorgehen

Webseite ausgeben

Möchte man über die Webseite Daten an den ESP8266-01 respektive den Arduino senden und darauf reagieren, macht man dies am einfachsten über Links oder ein Formular.
Daraus ergeben sich folgende drei Möglichkeiten:
Links
<html>
 <body>
  <a href="http://192.168.1.13?LedWeiss=1">LED 1 on</a>&nbsp;<a href="http://192.168.1.13?LedWeiss=0">LED 1 off</a><br>
  <a href="http://192.168.1.13?LedGelb=1">LED 2 on</a>&nbsp;<a href="http://192.168.1.13?LedGelb=0">LED 2 off</a>
 </body>
</html>
GET-Formular
<html>
  <body>
   <form method="get">
    <input type="radio" name="LedWeiss" value="1"><input type="radio" name="LedWeiss" value="0"><br>
    <input type="radio" name="LedGelb" value="1"><input type="radio" name="LedGelb" value="0"><br>
    <input type="submit">
   </form>
  </body>
</html>
POST-Formular
<html>
 <body>
  <form method="post" action="http://192.168.1.13">
   <input type="radio" name="LedWeiss" value="1"><input type="radio" name="LedWeiss" value="0"><br>
   <input type="radio" name="LedGelb" value="1"><input type="radio" name="LedGelb" value="0"><br>
   <input type="submit">
  </form>
 </body>
</html>

Anfrage von Webseite verarbeiten

Wird der ESP angesprochen für den ersten Verbindungsversuch, gibt der ESP folgendes aus:
0,CONNECT

+IPD,0,372:GET /favicon.ico HTTP/1.1
Host: 192.168.1.13
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
Referer: http://192.168.1.13/
Accept-Encoding: gzip, deflate
Accept-Language: de-DE,de;q=0.9
Auf Zeile 1 steht die Nummer der aktuellen Verbindungsanfrage auf die man reagieren kann.
Anfragen starten dann mit +IPD..., nach dem IPD steht dann die Verbindungsnummer auf die man dann die Webseite antwortet.
Host ist die aktuelle IP vom ESP. Auf den Rest gehe ich hier nicht weiter ein, da er für eine Standardanwendung nicht benötigt wird.

Wird auf ein Link / Formular reagiert und an den ESP gesendet, gibt der ESP folgendes aus:
1,CONNECT

+IPD,1,597:POST / HTTP/1.1
Host: 192.168.1.13
Connection: keep-alive
Content-Length: 10
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://192.168.1.13
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.1.13/
Accept-Encoding: gzip, deflate
Accept-Language: de-DE,de;q=0.9

LedWeiss=1
Auf Zeile 1 steht wieder die Verbindungsnummer, auf welche man reagieren kann.
Die eigentliche Anfrage startet ab "+IPD,<VERBINDUNGSNUMMER>,<Status>,<Anfrage-Art>..."
Möchte man also auf eine Anfrage / Anklicken eines Buttons / Links reagieren, muss die IPD-Anfrage ausgelesen werden.
Hier spielt dann die Variante welche man für das Anzeigen der Webseite wählt eine grosse Rolle:

Beispiel-Sketch (Links, GET, POST)

Einfache Variante mit Links

angezeigte Webseite (HTML-Code):
<html>
<body>
<a href="http://192.168.1.13?LedWeiss=1">LED 1 on</a> <a href="http://192.168.1.13?LedWeiss=0">LED 1 off</a><br>
<a href="http://192.168.1.13?LedGelb=1">LED 2 on</a> <a href="http://192.168.1.13?LedGelb=0">LED 2 off</a>
</body>
</html>
Die IP wird je nach System eine andere sein.
Sollte sich die IP in der Länge verändern, muss das Sketch bei CIPSEND entsprechend angepasst werden.

Arduino Sketch:
/*
Achtug: RX und TX kreuzen, das heisst PIN 10 geht zu TX vom ESP und PIN 11 zum RX vom ESP.
*/
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

//Start Skriptvariablen
bool IncommingESPString = false;
bool AntwortESPOffen = false;
bool HTTPAnfrage = false;
bool HTTPErstverbindung = false;
String DerStringVomESP;
String HTTPHost;
long int time;
long int iZaehler;
int HTTPVerbindungsNr=0; //von 1 - 10
int HTTPParameter = 0; //0 = leer, 1 = GET, 2 = POST

int PinLedWeiss = 3;
int PinLedGelb = 2;

//debug gibt diverse Informationen zum Serial-Monitor aus.
//true = Informationen werden angezeigt.
//false = Keine Informationen werden angezeigt.
bool debug = true;

//SerAusg gibt etwas an den Seriellen Monitor zurück.
bool SerAusg = true;
//Ende Skriptvariablen

void setup() {
pinMode(PinLedWeiss, OUTPUT);
pinMode(PinLedGelb, OUTPUT);
digitalWrite(PinLedWeiss, LOW);
digitalWrite(PinLedGelb, LOW);

//Serial-Port mit BAUD-Rate für den HardwareSerial-Port
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// BAUD-Rate für den SoftwareSerial-Port zum ESP.
mySerial.begin(9600);
BefehlanESPAusgeben("ATrn", 1000, true, debug, 0);
BefehlanESPAusgeben("AT+CIPMUX=1rn", 1000, true, debug, 0);
BefehlanESPAusgeben("AT+CIPSERVER=1,80rn", 1000, true, debug, 0);
BefehlanESPAusgeben("AT+CIPCLOSE=5,80rn", 1000, true, debug, 0);
}


String BefehlanESPAusgeben(String TempString, const int timeout, boolean warteok, boolean debug, int SpezialTask)
{
String response = "";
if(debug)
{
Serial.println("Arbeite: "+TempString);
}

if(SpezialTask > 0)
{
mySerial.print("<html><body><a href="http://"+HTTPHost+"?LedWeiss=1">LED 1 on</a>");
mySerial.print("&nbsp;<a href="http://"+HTTPHost+"?LedWeiss=0">LED 1 off</a><br><a href="http://"+HTTPHost+"?LedGelb=1">LED 2 on");
mySerial.print("</a>&nbsp;<a href="http://"+HTTPHost+"?LedGelb=0">LED 2 off</a></body></html>");
}
else
{
//Übermittelter String wird bei 50 Zeichen aufgeteilt gesendet.
int TxtL = 50;
if(TempString.length() > TxtL)
{
int i = (TempString.length()/TxtL);
if(TempString.length()%TxtL > 0)
{
i = i+1;
}
for (int i2=0; i2 < i; i2++){
mySerial.print(TempString.substring(i2*TxtL,(TxtL*i2+TxtL)));
delay(timeout);
}
}
else
{
mySerial.print(TempString);
}
}

if(warteok == false)
{
long int time = millis();
while( (time+timeout) > millis())
{
while(mySerial.available())
{
char c = mySerial.read();
response+=c;
}
}
}
else
{
//Warten bis OK retour kommt.
if(debug)
{
Serial.println("Warte: "+TempString);
}
bool OKerhalten = false;
bool ErrorFail = false;
long int time = millis();
while(OKerhalten == false)
{
while(mySerial.available())
{
char c = mySerial.read();
response+=c;
if(response.indexOf("OK") > -1)
{
OKerhalten = true;
}
if(response.indexOf("ERROR") > -1)
{
OKerhalten = true;
ErrorFail = true;
}
if(response.indexOf("FAIL") > -1)
{
OKerhalten = true;
ErrorFail = true;
}

}
if((time+30000) < millis())
{
//Failsafe, bricht nach 60Sek ab.
if(response.indexOf("ERROR") > -1)
{
OKerhalten = true;
ErrorFail = true;
}
if(response.indexOf("FAIL") > -1)
{
OKerhalten = true;
ErrorFail = true;
}
OKerhalten = true;
}
}
}
if(debug)
{
Serial.print(response);
}
return response;
}

void loop() { // run over and over
if(IncommingESPString == false)
{
time = millis();
iZaehler = 0;
DerStringVomESP = "";
}
if (mySerial.available()) {
IncommingESPString = true;
time = millis();
iZaehler++;
if(iZaehler > 1000)
{
iZaehler = 0;
DerStringVomESP = "";
}
else
{
char DerTeilStringVomESP = mySerial.read();
DerStringVomESP += DerTeilStringVomESP;
}
}
if(IncommingESPString == true)
{
if((time+1100) < millis())
{
if(debug)
{
Serial.println("Fertig");
}
VerarbeiteStringVonESP(DerStringVomESP);
DerStringVomESP = "";
}
}
if (Serial.available()) {
mySerial.println(Serial.readString());
}
}



void VerarbeiteStringVonESP(String BearbeiteString)
{
if(BearbeiteString.indexOf("+IPD") > -1)
{
if(debug)
{
Serial.println("Start:");
Serial.println(BearbeiteString);
}
HTTPAnfrage = false;
//+IPD,0,478:GET / HTTP/1.1

if(BearbeiteString.indexOf(":GET / H") > -1)
{
HTTPVerbindungsNr = BearbeiteString.substring((BearbeiteString.indexOf("+IPD,")+5), (BearbeiteString.indexOf("+IPD,")+6)).toInt();
HTTPAnfrage = true;
HTTPParameter = 1;
HTTPErstverbindung = true;
HTTPHost = BearbeiteString.substring((BearbeiteString.indexOf("Host:")+6), 100);
HTTPHost = HTTPHost.substring(0,(HTTPHost.indexOf("n")-1));
if(debug)
{
Serial.println("Get-Anfrage Leer");
}
}
if(debug)
{
Serial.println("DA");
Serial.println(":GET /"+HTTPHost+"?");
Serial.println(BearbeiteString.indexOf(":GET /"+HTTPHost+"?"));
Serial.println("DA");
}
if(BearbeiteString.indexOf(":GET /"+HTTPHost+"?") > -1 || BearbeiteString.indexOf(":GET /?") > -1)
{
HTTPVerbindungsNr = BearbeiteString.substring((BearbeiteString.indexOf("+IPD,")+5), (BearbeiteString.indexOf("+IPD,")+6)).toInt();
HTTPAnfrage = true;
HTTPParameter = 1;
HTTPErstverbindung = false;
if(BearbeiteString.indexOf("LedWeiss=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 1)
{
digitalWrite(PinLedWeiss, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 0)
{
digitalWrite(PinLedWeiss, LOW);
}
}
if(BearbeiteString.indexOf("LedGelb=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 1)
{
digitalWrite(PinLedGelb, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 0)
{
digitalWrite(PinLedGelb, LOW);
}
}
if(debug)
{
Serial.println("Get-Anfrage mit Variable erhalten");
}
}
if(BearbeiteString.indexOf(":POST / H") > -1)
{
HTTPVerbindungsNr = BearbeiteString.substring((BearbeiteString.indexOf("+IPD,")+5), (BearbeiteString.indexOf("+IPD,")+6)).toInt();
HTTPAnfrage = true;
HTTPParameter = 1;
HTTPErstverbindung = false;
if(BearbeiteString.indexOf("LedWeiss=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 1)
{
digitalWrite(PinLedWeiss, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 0)
{
digitalWrite(PinLedWeiss, LOW);
}
}
if(BearbeiteString.indexOf("LedGelb=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 1)
{
digitalWrite(PinLedGelb, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 0)
{
digitalWrite(PinLedGelb, LOW);
}
}
if(debug)
{
Serial.println("POST-Anfrage mit Variable erhalten");
}
}
if(debug)
{
Serial.println("Ende:");
}
}
if(HTTPAnfrage == true)
{
if(debug)
{
Serial.println(HTTPAnfrage);
Serial.println(HTTPErstverbindung);
Serial.println(HTTPVerbindungsNr);
Serial.println(HTTPHost);
}
}
if(HTTPAnfrage == true)
{
//Es ist eine HTTP-Anfrage offen diese abarbeiten
if(HTTPErstverbindung == true)
{
//Standard-Webseite ausgeben Start
String Befehl;
Befehl = "AT+CIPSEND="+String(HTTPVerbindungsNr)+","+(206+HTTPHost.length()+HTTPHost.length()+HTTPHost.length()+HTTPHost.length())+"rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);
Befehl = "Spezial Link";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, false, debug, 1);

Befehl = "AT+CIPCLOSE="+String(HTTPVerbindungsNr)+"rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);

//Standard-Webseite ausgeben Ende
HTTPErstverbindung = false;
HTTPAnfrage = false;
}
else
{
//Reagieren auf Formular / Variable
String Befehl;
Befehl = "AT+CIPSEND="+String(HTTPVerbindungsNr)+","+(206+HTTPHost.length()+HTTPHost.length()+HTTPHost.length()+HTTPHost.length())+"rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);
Befehl = "Spezial Link";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, false, debug, 1);
Befehl = "AT+CIPCLOSE="+String(HTTPVerbindungsNr)+"rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);
HTTPAnfrage = false;
}
}
else
{
if(SerAusg == true)
{
Serial.println("Nicht bearbeitete Anfrage Start:");
Serial.println(DerStringVomESP);
Serial.println("Nicht bearbeitete Anfrage Ende");
}
}
IncommingESPString = false;
}

Variante mit GET-Formular

angezeigte Webseite (HTML-Code):
<html>
<body>
<form method="get">
<input type="radio" name="LedWeiss" value="1"><input type="radio" name="LedWeiss" value="0"><br>
<input type="radio" name="LedGelb" value="1"><input type="radio" name="LedGelb" value="0"><br>
<input type="submit">
</form>
</body>
</html>
Arduino Sketch:
/*
Achtug: RX und TX kreuzen, das heisst PIN 10 geht zu TX vom ESP und PIN 11 zum RX vom ESP.
*/
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

//Start Skriptvariablen
bool IncommingESPString = false;
bool AntwortESPOffen = false;
bool HTTPAnfrage = false;
bool HTTPErstverbindung = false;
String DerStringVomESP;
String HTTPHost;
long int time;
long int iZaehler;
int HTTPVerbindungsNr=0; //von 1 - 10
int HTTPParameter = 0; //0 = leer, 1 = GET, 2 = POST

int PinLedWeiss = 3;
int PinLedGelb = 2;

//debug gibt diverse Informationen zum Serial-Monitor aus.
//true = Informationen werden angezeigt.
//false = Keine Informationen werden angezeigt.
bool debug = true;

//SerAusg gibt etwas an den Seriellen Monitor zurück.
bool SerAusg = true;

//Ende Skriptvariablen

void setup() {
pinMode(PinLedWeiss, OUTPUT);
pinMode(PinLedGelb, OUTPUT);
digitalWrite(PinLedWeiss, LOW);
digitalWrite(PinLedGelb, LOW);

//Serial-Port mit BAUD-Rate für den HardwareSerial-Port
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// BAUD-Rate für den SoftwareSerial-Port zum ESP.
mySerial.begin(9600);
BefehlanESPAusgeben("ATrn", 1000, true, debug, 0);
BefehlanESPAusgeben("AT+CIPMUX=1rn", 1000, true, debug, 0);
BefehlanESPAusgeben("AT+CIPSERVER=1,80rn", 1000, true, debug, 0);
BefehlanESPAusgeben("AT+CIPCLOSE=5,80rn", 1000, true, debug, 0);
}


String BefehlanESPAusgeben(String TempString, const int timeout, boolean warteok, boolean debug, int SpezialTask)
{
String response = "";
if(debug)
{
Serial.println("Arbeite: "+TempString);
}

if(SpezialTask > 0)
{
mySerial.print("<html><body><form method="get"><input type="radio" ");
mySerial.print("name="LedWeiss" value="1"><input type="radio" name="LedWeiss" value="0"><br><input type="radio" name="LedGelb" value="1">");
mySerial.print("<input type="radio" name="LedGelb" value="0"><br><input type="submit"></form></body></html>");
}
else
{
//Übermittelter String wird bei 50 Zeichen aufgeteilt gesendet.
int TxtL = 50;
if(TempString.length() > TxtL)
{
int i = (TempString.length()/TxtL);
if(TempString.length()%TxtL > 0)
{
i = i+1;
}
for (int i2=0; i2 < i; i2++){
mySerial.print(TempString.substring(i2*TxtL,(TxtL*i2+TxtL)));
delay(timeout);
}
}
else
{
mySerial.print(TempString);
}
}

if(warteok == false)
{
long int time = millis();
while( (time+timeout) > millis())
{
while(mySerial.available())
{
char c = mySerial.read();
response+=c;
}
}
}
else
{
//Warten bis OK retour kommt.
if(debug)
{
Serial.println("Warte: "+TempString);
}
bool OKerhalten = false;
bool ErrorFail = false;
long int time = millis();
while(OKerhalten == false)
{
while(mySerial.available())
{
char c = mySerial.read();
response+=c;
if(response.indexOf("OK") > -1)
{
OKerhalten = true;
}
if(response.indexOf("ERROR") > -1)
{
OKerhalten = true;
ErrorFail = true;
}
if(response.indexOf("FAIL") > -1)
{
OKerhalten = true;
ErrorFail = true;
}

}
if((time+30000) < millis())
{
//Failsafe, bricht nach 60Sek ab.
if(response.indexOf("ERROR") > -1)
{
OKerhalten = true;
ErrorFail = true;
}
if(response.indexOf("FAIL") > -1)
{
OKerhalten = true;
ErrorFail = true;
}
OKerhalten = true;
}
}
}
if(debug)
{
Serial.print(response);
}
return response;
}

void loop() { // run over and over
if(IncommingESPString == false)
{
time = millis();
iZaehler = 0;
DerStringVomESP = "";
}
if (mySerial.available()) {
IncommingESPString = true;
time = millis();
iZaehler++;
if(iZaehler > 1000)
{
iZaehler = 0;
DerStringVomESP = "";
}
else
{
char DerTeilStringVomESP = mySerial.read();
DerStringVomESP += DerTeilStringVomESP;
}
}
if(IncommingESPString == true)
{
if((time+1100) < millis())
{
if(debug)
{
Serial.println("Fertig");
}
VerarbeiteStringVonESP(DerStringVomESP);
DerStringVomESP = "";
}
}
if (Serial.available()) {
mySerial.println(Serial.readString());
}
}



void VerarbeiteStringVonESP(String BearbeiteString)
{
if(BearbeiteString.indexOf("+IPD") > -1)
{
if(debug)
{
Serial.println("Start:");
Serial.println(BearbeiteString);
}
HTTPAnfrage = false;
//+IPD,0,478:GET / HTTP/1.1

if(BearbeiteString.indexOf(":GET / H") > -1)
{
HTTPVerbindungsNr = BearbeiteString.substring((BearbeiteString.indexOf("+IPD,")+5), (BearbeiteString.indexOf("+IPD,")+6)).toInt();
HTTPAnfrage = true;
HTTPParameter = 1;
HTTPErstverbindung = true;
HTTPHost = BearbeiteString.substring((BearbeiteString.indexOf("Host:")+6), 100);
HTTPHost = HTTPHost.substring(0,(HTTPHost.indexOf("n")-1));
if(debug)
{
Serial.println("Get-Anfrage Leer");
}
}
if(debug)
{
Serial.println("DA");
Serial.println(":GET /"+HTTPHost+"?");
Serial.println(BearbeiteString.indexOf(":GET /"+HTTPHost+"?"));
Serial.println("DA");
}
if(BearbeiteString.indexOf(":GET /"+HTTPHost+"?") > -1 || BearbeiteString.indexOf(":GET /?") > -1)
{
HTTPVerbindungsNr = BearbeiteString.substring((BearbeiteString.indexOf("+IPD,")+5), (BearbeiteString.indexOf("+IPD,")+6)).toInt();
HTTPAnfrage = true;
HTTPParameter = 1;
HTTPErstverbindung = false;
if(BearbeiteString.indexOf("LedWeiss=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 1)
{
digitalWrite(PinLedWeiss, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 0)
{
digitalWrite(PinLedWeiss, LOW);
}
}
if(BearbeiteString.indexOf("LedGelb=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 1)
{
digitalWrite(PinLedGelb, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 0)
{
digitalWrite(PinLedGelb, LOW);
}
}
if(debug)
{
Serial.println("Get-Anfrage mit Variable erhalten");
}
}
if(BearbeiteString.indexOf(":POST / H") > -1)
{
HTTPVerbindungsNr = BearbeiteString.substring((BearbeiteString.indexOf("+IPD,")+5), (BearbeiteString.indexOf("+IPD,")+6)).toInt();
HTTPAnfrage = true;
HTTPParameter = 1;
HTTPErstverbindung = false;
if(BearbeiteString.indexOf("LedWeiss=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 1)
{
digitalWrite(PinLedWeiss, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 0)
{
digitalWrite(PinLedWeiss, LOW);
}
}
if(BearbeiteString.indexOf("LedGelb=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 1)
{
digitalWrite(PinLedGelb, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 0)
{
digitalWrite(PinLedGelb, LOW);
}
}
if(debug)
{
Serial.println("POST-Anfrage mit Variable erhalten");
}
}
if(debug)
{
Serial.println("Ende:");
}
}
if(HTTPAnfrage == true)
{
if(debug)
{
Serial.println(HTTPAnfrage);
Serial.println(HTTPErstverbindung);
Serial.println(HTTPVerbindungsNr);
Serial.println(HTTPHost);
}
}
if(HTTPAnfrage == true)
{
//Es ist eine HTTP-Anfrage offen diese abarbeiten
if(HTTPErstverbindung == true)
{
//Standard-Webseite ausgeben Start
String Befehl;
Befehl = "AT+CIPSEND="+String(HTTPVerbindungsNr)+",263rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);
Befehl = "Spezial GET";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, false, debug, 2);

Befehl = "AT+CIPCLOSE="+String(HTTPVerbindungsNr)+"rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);

//Standard-Webseite ausgeben Ende
HTTPErstverbindung = false;
HTTPAnfrage = false;
}
else
{
//Reagieren auf Formular / Variable
String Befehl;
Befehl = "AT+CIPSEND="+String(HTTPVerbindungsNr)+",263rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);
Befehl = "Spezial GET";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, false, debug, 2);
Befehl = "AT+CIPCLOSE="+String(HTTPVerbindungsNr)+"rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);
HTTPAnfrage = false;
}
}
else
{
if(SerAusg == true)
{
Serial.println("Nicht bearbeitete Anfrage Start:");
Serial.println(DerStringVomESP);
Serial.println("Nicht bearbeitete Anfrage Ende");
}
}
IncommingESPString = false;
}

Variante mit POST-Formular

angezeigte Webseite (HTML-Code):
<html>
<body>
<form method="post" action="http://192.168.1.13">
<input type="radio" name="LedWeiss" value="1"><input type="radio" name="LedWeiss" value="0"><br>
<input type="radio" name="LedGelb" value="1"><input type="radio" name="LedGelb" value="0"><br>
<input type="submit">
</form>
</body>
</html>
Die IP wird je nach System eine andere sein.
Sollte sich die IP in der Länge verändern, muss das Sketch bei CIPSEND entsprechend angepasst werden.

Arduino Sketch:
/*
Achtug: RX und TX kreuzen, das heisst PIN 10 geht zu TX vom ESP und PIN 11 zum RX vom ESP.
*/
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

//Start Skriptvariablen
bool IncommingESPString = false;
bool AntwortESPOffen = false;
bool HTTPAnfrage = false;
bool HTTPErstverbindung = false;
String DerStringVomESP;
String HTTPHost;
long int time;
long int iZaehler;
int HTTPVerbindungsNr=0; //von 1 - 10
int HTTPParameter = 0; //0 = leer, 1 = GET, 2 = POST

int PinLedWeiss = 3;
int PinLedGelb = 2;

//debug gibt diverse Informationen zum Serial-Monitor aus.
//true = Informationen werden angezeigt.
//false = Keine Informationen werden angezeigt.
bool debug = true;

//SerAusg gibt etwas an den Seriellen Monitor zurück.
bool SerAusg = true;

//Ende Skriptvariablen

void setup() {
pinMode(PinLedWeiss, OUTPUT);
pinMode(PinLedGelb, OUTPUT);
digitalWrite(PinLedWeiss, LOW);
digitalWrite(PinLedGelb, LOW);

//Serial-Port mit BAUD-Rate für den HardwareSerial-Port
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// BAUD-Rate für den SoftwareSerial-Port zum ESP.
mySerial.begin(9600);
BefehlanESPAusgeben("ATrn", 1000, true, debug, 0);
BefehlanESPAusgeben("AT+CIPMUX=1rn", 1000, true, debug, 0);
BefehlanESPAusgeben("AT+CIPSERVER=1,80rn", 1000, true, debug, 0);
BefehlanESPAusgeben("AT+CIPCLOSE=5,80rn", 1000, true, debug, 0);
}


String BefehlanESPAusgeben(String TempString, const int timeout, boolean warteok, boolean debug, int SpezialTask)
{
String response = "";
if(debug)
{
Serial.println("Arbeite: "+TempString);
}

if(SpezialTask > 0)
{
mySerial.print("<html><body><form method="post" action="http://"+HTTPHost+""><input type="radio" ");
mySerial.print("name="LedWeiss" value="1"><input type="radio" name="LedWeiss" value="0"><br><input type="radio" name="LedGelb" value="1">");
mySerial.print("<input type="radio" name="LedGelb" value="0"><br><input type="submit"></form></body></html>");
}
else
{
//Übermittelter String wird bei 50 Zeichen aufgeteilt gesendet.
int TxtL = 50;
if(TempString.length() > TxtL)
{
int i = (TempString.length()/TxtL);
if(TempString.length()%TxtL > 0)
{
i = i+1;
}
for (int i2=0; i2 < i; i2++){
mySerial.print(TempString.substring(i2*TxtL,(TxtL*i2+TxtL)));
delay(timeout);
}
}
else
{
mySerial.print(TempString);
}
}

if(warteok == false)
{
long int time = millis();
while( (time+timeout) > millis())
{
while(mySerial.available())
{
char c = mySerial.read();
response+=c;
}
}
}
else
{
//Warten bis OK retour kommt.
if(debug)
{
Serial.println("Warte: "+TempString);
}
bool OKerhalten = false;
bool ErrorFail = false;
long int time = millis();
while(OKerhalten == false)
{
while(mySerial.available())
{
char c = mySerial.read();
response+=c;
if(response.indexOf("OK") > -1)
{
OKerhalten = true;
}
if(response.indexOf("ERROR") > -1)
{
OKerhalten = true;
ErrorFail = true;
}
if(response.indexOf("FAIL") > -1)
{
OKerhalten = true;
ErrorFail = true;
}

}
if((time+30000) < millis())
{
//Failsafe, bricht nach 60Sek ab.
if(response.indexOf("ERROR") > -1)
{
OKerhalten = true;
ErrorFail = true;
}
if(response.indexOf("FAIL") > -1)
{
OKerhalten = true;
ErrorFail = true;
}
OKerhalten = true;
}
}
}
if(debug)
{
Serial.print(response);
}
return response;
}

void loop() { // run over and over
if(IncommingESPString == false)
{
time = millis();
iZaehler = 0;
DerStringVomESP = "";
}
if (mySerial.available()) {
IncommingESPString = true;
time = millis();
iZaehler++;
if(iZaehler > 1000)
{
iZaehler = 0;
DerStringVomESP = "";
}
else
{
char DerTeilStringVomESP = mySerial.read();
DerStringVomESP += DerTeilStringVomESP;
}
}
if(IncommingESPString == true)
{
if((time+1100) < millis())
{
if(debug)
{
Serial.println("Fertig");
}
VerarbeiteStringVonESP(DerStringVomESP);
DerStringVomESP = "";
}
}
if (Serial.available()) {
mySerial.println(Serial.readString());
}
}



void VerarbeiteStringVonESP(String BearbeiteString)
{
if(BearbeiteString.indexOf("+IPD") > -1)
{
if(debug)
{
Serial.println("Start:");
Serial.println(BearbeiteString);
}
HTTPAnfrage = false;
//+IPD,0,478:GET / HTTP/1.1

if(BearbeiteString.indexOf(":GET / H") > -1)
{
HTTPVerbindungsNr = BearbeiteString.substring((BearbeiteString.indexOf("+IPD,")+5), (BearbeiteString.indexOf("+IPD,")+6)).toInt();
HTTPAnfrage = true;
HTTPParameter = 1;
HTTPErstverbindung = true;
HTTPHost = BearbeiteString.substring((BearbeiteString.indexOf("Host:")+6), 100);
HTTPHost = HTTPHost.substring(0,(HTTPHost.indexOf("n")-1));
if(debug)
{
Serial.println("Get-Anfrage Leer");
}
}
if(debug)
{
Serial.println("DA");
Serial.println(":GET /"+HTTPHost+"?");
Serial.println(BearbeiteString.indexOf(":GET /"+HTTPHost+"?"));
Serial.println("DA");
}
if(BearbeiteString.indexOf(":GET /"+HTTPHost+"?") > -1 || BearbeiteString.indexOf(":GET /?") > -1)
{
HTTPVerbindungsNr = BearbeiteString.substring((BearbeiteString.indexOf("+IPD,")+5), (BearbeiteString.indexOf("+IPD,")+6)).toInt();
HTTPAnfrage = true;
HTTPParameter = 1;
HTTPErstverbindung = false;
if(BearbeiteString.indexOf("LedWeiss=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 1)
{
digitalWrite(PinLedWeiss, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 0)
{
digitalWrite(PinLedWeiss, LOW);
}
}
if(BearbeiteString.indexOf("LedGelb=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 1)
{
digitalWrite(PinLedGelb, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 0)
{
digitalWrite(PinLedGelb, LOW);
}
}
if(debug)
{
Serial.println("Get-Anfrage mit Variable erhalten");
}
}
if(BearbeiteString.indexOf(":POST / H") > -1)
{
HTTPVerbindungsNr = BearbeiteString.substring((BearbeiteString.indexOf("+IPD,")+5), (BearbeiteString.indexOf("+IPD,")+6)).toInt();
HTTPAnfrage = true;
HTTPParameter = 1;
HTTPErstverbindung = false;
if(BearbeiteString.indexOf("LedWeiss=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 1)
{
digitalWrite(PinLedWeiss, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedWeiss=")+9), (BearbeiteString.indexOf("LedWeiss=")+10)).toInt() == 0)
{
digitalWrite(PinLedWeiss, LOW);
}
}
if(BearbeiteString.indexOf("LedGelb=") > -1)
{
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 1)
{
digitalWrite(PinLedGelb, HIGH);
}
if(BearbeiteString.substring((BearbeiteString.indexOf("LedGelb=")+8), (BearbeiteString.indexOf("LedGelb=")+9)).toInt() == 0)
{
digitalWrite(PinLedGelb, LOW);
}
}
if(debug)
{
Serial.println("POST-Anfrage mit Variable erhalten");
}
}
if(debug)
{
Serial.println("Ende:");
}
}
if(HTTPAnfrage == true)
{
if(debug)
{
Serial.println(HTTPAnfrage);
Serial.println(HTTPErstverbindung);
Serial.println(HTTPVerbindungsNr);
Serial.println(HTTPHost);
}
}
if(HTTPAnfrage == true)
{
//Es ist eine HTTP-Anfrage offen diese abarbeiten
if(HTTPErstverbindung == true)
{
//Standard-Webseite ausgeben Start
String Befehl;
Befehl = "AT+CIPSEND="+String(HTTPVerbindungsNr)+","+(281+HTTPHost.length())+"rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);
Befehl = "Spezial POST";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, false, debug, 3);

Befehl = "AT+CIPCLOSE="+String(HTTPVerbindungsNr)+"rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);

//Standard-Webseite ausgeben Ende
HTTPErstverbindung = false;
HTTPAnfrage = false;
}
else
{
//Reagieren auf Formular / Variable
String Befehl;
Befehl = "AT+CIPSEND="+String(HTTPVerbindungsNr)+","+(281+HTTPHost.length())+"rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);
Befehl = "Spezial POST";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, false, debug, 3);
Befehl = "AT+CIPCLOSE="+String(HTTPVerbindungsNr)+"rn";
if(debug)
{
Serial.println(Befehl);
}
BefehlanESPAusgeben(Befehl,2000, true, debug, 0);
HTTPAnfrage = false;
}
}
else
{
if(SerAusg == true)
{
Serial.println("Nicht bearbeitete Anfrage Start:");
Serial.println(DerStringVomESP);
Serial.println("Nicht bearbeitete Anfrage Ende");
}
}
IncommingESPString = false;
}