sketch_47_autofahren_ESPsoftAP   (ESP8266 NodeMCU)

sketch_47_autofahren_ESPsoftAP
  /*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>&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;"); 
   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>&emsp;&emsp;"); 
   client.println("<a href=LEFT><center><button><h1 style='height:200px;width:300px'>LEFT</button></a>&emsp;&emsp;&emsp;&emsp;"); 
   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); 
  }
Fahrablauf_Module.h
   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)
  }