/*Der Fahrstatus wird von einem Computer oder Smartphone geschaltet.
Diese Schalthandlung wird in einem Webbrowser mit Buttons ausgefuehrt.
Der ESP arbeitet im AP-Mode(Access Point).
Das heisst, der ESP erzeugt ein eigenes WLAN-Netz(sogenanntes softAP, da ohne Verbindung zum Internet).
Der ESP fungiert als Server, Computer/Smartphone als Client.
Der Client stellt mit der Betaetigung der Buttons eine Anfrage (einen Request)an den Server.
Der Client waehlt sich in das WLAN-Netz des ESP ein.
Es besteht keine Verbindung zum Internet !
Im Webbrowser muss die IP-Adresse des ESP aufgerufen werden: http://192.168.4.1 wenn nicht mit WiFiConfig()geaendert wurde.
Dann erscheint die Webseite mit den Buttons und auch noch eine Anzeige zum Fahrstatus.
*/
#include <ESP8266WiFi.h> //Das Bibliotheksprogramm wird in diesen Sketch eingebunden
#include "Fahrablaufmodule.h" //Binde den Programmablauf von Fahrablaufmodule.h ein
const char* ssid = "ESPsoftAP"; //SSID
const char* password = "password55"; //Passwort, muss mindestens 8 Zeichen haben
WiFiClient client;
WiFiServer server(80); //Erzeugt einen Server an Port80 (80 ist uebliches Port fuer Server), der dort auf eingehende Nachrichten wartet
void setup()
{
/*Programmiere ESP Pins D1...6 als Ausgang (beachte Bezeichnung mit "D", sonst werden die GPIO-Nummern angesprochen)*/
pinMode(D1, OUTPUT); //Motoren rechts - Bruecke
pinMode(D2, OUTPUT); //Motoren rechts - Bruecke
pinMode(D5, OUTPUT); //Motoren rechts - PWM
pinMode(D3, OUTPUT); //Motoren links - Bruecke
pinMode(D4, OUTPUT); //Motoren links - Bruecke
pinMode(D6, OUTPUT); //Motoren links - PWM
delay (3000); //Bis Programmstart 3 Sek warten, damit Anzeige im Serial Monitor sichtbar ist
Serial.begin(115600); //Serial Monitor muss ebenfalls auf 115600 gestellt sein !
delay(15);
WiFi.softAP(ssid, password); //Der ESP erzeugt ein WLAN Netz (wird zum Access Point AP)
/* Verbinde zum WLAN Netzwerk (connect to WiFi network)*/
Serial.println();
Serial.print("Server IP address: ");
Serial.println(WiFi.softAPIP()); //Der Serial Monitor zeigt die IP-Adresse des ESP an
server.begin();
Serial.println("Server wurde gestartet");
}
void loop()
{
WiFiClient client = server.available(); //Pruefung, ob sich ein Client verbunden hat
if (!client)
{
return;
}
while(!client.available()) //Warten auf Daten vom Client
{
delay(1);
}
String request = client.readStringUntil('\r'); //Vom Client liest der ESP einen String ein bis Zeilenende (Carriage Return CR)
client.flush(); //Wartet bis alle im Speicher (buffer) befindlichen Zeichen (characters) gesendet wurden
if(request.indexOf("/STOPP")!=-1) //wenn auf Webseite Button STOPP gedrueckt wurde
{
stopp(); //void stopp wird aufgerufen
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("");
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.print("<h1 style='color:red'>Status: STOP</h3>"); //Schreibt auf Webseite den Fahrstatus
Serial.println ("Status: STOPP"); //Schreibt auch in den Serial Monitor den Fahrstatus
}
else if(request.indexOf("/FORWARD")!=-1) //wenn auf Webseite Button FORWARD gedrueckt wurde
{
forward(); //void forward wird aufgerufen
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("");
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.print("<h1 style='color:black'>Status: FORWARD</h3>"); //Schreibt auf Webseite den Fahrstatus
Serial.println ("Status: FORWARD"); //Schreibt auch in den Serial Monitor den Fahrstatus
}
else if(request.indexOf("/LEFT")!=-1) //wenn auf Webseite Button LEFT gedrueckt wurde
{
left();
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("");
client.println("<!DOCTYPE HTML>");
client.println("<html>"); //void left wird aufgerufen
client.print("<h1 style='color:black'>Status: LEFT</h3>"); //Schreibt auf Webseite den Fahrstatus
Serial.println ("Status: LEFT"); //Schreibt auch in den Serial Monitor den Fahrstatus
}
else if(request.indexOf("/RIGHT")!=-1) //wenn auf Webseite Button RIGHT gedrueckt wurde
{
right(); //void right wird aufgerufen
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("");
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.print("<h1 style='color:black'>Status: RIGHT</h3>"); //Schreibt auf Webseite den Fahrstatus
Serial.println ("Status: RIGHT"); //Schreibt auch in den Serial Monitor den Fahrstatus
}
else if(request.indexOf("/BACK")!=-1) //wenn auf Webseite Button BACK gedrueckt wurde
{
back(); //void back wird aufgerufen
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("");
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.print("<h1 style='color:black'>Status: BACK</h3>"); //Schreibt auf Webseite den Fahrstatus
Serial.println ("Status: BACK"); //Schreibt auch in den Serial Monitor den Fahrstatus
}
/*Die Antwort- oder Statuscodes von HTTP bestimmen direkt die Bedeutung der Antwort auf eine HTTP-Anfrage.
Sie werden stets in der ersten Zeile der Response (Server-Antwort) in der Form HTTP/1.1 Statuscode uebermittelt.
Statuscode "200 OK" heisst: Die Anfrage war erfolgreich. Die Antwort enthaelt die angeforderten Daten.
Weiteres siehe https://wiki.selfhtml.org/wiki/HTTP/Statuscodes */
/*HTML-Code fuer die Webseite:*/
client.println("<br><br><br><br>           ");
client.println("<a href=STOPP><center><button><h1 style='color:red;height:200px;width:250px'>STOPP</button></a><br><br>");
client.println("<a href=FORWARD><center><button><h1 style='height:200px;width:300px'>FORWARD</button></a><br><br>  ");
client.println("<a href=LEFT><center><button><h1 style='height:200px;width:300px'>LEFT</button></a>    ");
client.println("<a href=RIGHT><button><h1 style='height:200px;width:300px'>RIGHT</button></a><br><br>");
client.println("<a href=BACK><center><button><h1 style='height:200px;width:300px'>BACK</button></a><br><br>");
client.println("</html>");
delay(1);
}
void stopp() //Achtung: "stop" funktioniert nicht , es ist ein reservierter Befehl
{
digitalWrite(D1, LOW); // Schalte alle Motoren aus
digitalWrite(D2, LOW);
digitalWrite(D3, LOW);
digitalWrite(D4, LOW);
}
void forward()
{
digitalWrite(D1, HIGH); // Schalte Motoren RECHTS ein
digitalWrite(D2, LOW);
analogWrite(D5, 400); // Setze die Geschwindigkeit (zwischen 0...1024)
digitalWrite(D3, HIGH); // Schalte Motoren LINKS ein
digitalWrite(D4, LOW);
analogWrite(D6, 400); // Setze die Geschwindigkeit (zwischen 0...1024)
}
void left()
{
digitalWrite(D1, HIGH); // Schalte Motoren RECHTS ein
digitalWrite(D2, LOW);
analogWrite(D5, 500); // Setze die Geschwindigkeit (zwischen 0...1024)
digitalWrite(D3, LOW); // Schalte Motoren LINKS ein
digitalWrite(D4, LOW);
analogWrite(D6, 500); // Setze die Geschwindigkeit (zwischen 0...1024)
}
void right()
{
digitalWrite(D1, LOW); // Schalte Motoren RECHTS ein
digitalWrite(D2, LOW);
analogWrite(D5, 500); // Setze die Geschwindigkeit (zwischen 0...1024)
digitalWrite(D3, HIGH); // Schalte Motoren LINKS ein
digitalWrite(D4, LOW);
analogWrite(D6, 500); // Setze die Geschwindigkeit (zwischen 0...1024)
}
void back()
{
digitalWrite(D1, LOW); // Schalte Motoren RECHTS ein
digitalWrite(D2, HIGH);
analogWrite(D5, 400); // Setze die Geschwindigkeit (zwischen 0...1024)
digitalWrite(D3, LOW); // Schalte Motoren LINKS ein
digitalWrite(D4, HIGH);
analogWrite(D6, 400); // Setze die Geschwindigkeit (zwischen 0...1024)
}