/*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) }