Mobatools Web Servo & Stepper

Guten Abend,

kann mir bitte jemand helfen?
Ich habe das Beispiel Mobatools -> _Stepper -> ESP32-Web geladen und versuche vergeblich dort zusätzlich zu dem Stepper noch eine Servo hinzu zu fügen, welche dann über ein Slider gesteuert werden sollte.
html

Finde kein Beispiel dazu im Netz.

Würde mich sehr freuen.

Danke

Also momentan benutze ich mein Wifi Router um auf die Html zu kommen.
Bei diesem Code fehlt mir aber die Möglichkeit den Stepper über die Html zu steuern ohne die Servos zu blockieren.

Habe gelesen dass es mit MobaTools oder AccelStepper möglich sein soll.
Jetzt bin ich total begeistert von dem Beispiel Code von MobaTools um den Schrittmotor über "WebServer.h" / Accesspoint anstatt über "WiFi.h" / mit einem Router zu realisieren.
Finde aber nirgends im Web ein Beispiel um die Servos mit in den Code einzufügen.
Ohne eine Vorlage bzw. Beispiel bekomme ich dies nicht hin.

Aktuell mit 3 Servos und 2 ESC Brushless Motoren, aber ohne den Nema Stepper und ohne gewünschten WebServer.h

#include <WiFi.h>
#include <Servo.h>

Servo myservo, myservo1, myservo2, motorBottom, motorTop;  // create servo object to control a servo
// twelve servo objects can be created on most boards

// GPIO the servo is attached to
static const int servoPin = 21;
static const int servoPin1 = 13;
static const int servoPin2 = 12;
static const int PIN_TOP = 26;
static const int PIN_BOT = 27;
#define PIN_BOT 27
#define PIN_TOP 26
#define MOTOR_PULSE_ZERO 1000
#define MOTOR_PULSE_180 1940
// Replace with your network credentials
const char* ssid     = "WlanRouter";
const char* password = "123456789";

// Set web server port number to 80
WiFiServer server(80);

// Variable to store the HTTP request
String header;

// Decode HTTP GET value
String valueString = String(5);
String valueString1 = String(5);
String valueString2 = String(5);
String valueString3 = String(5);
String valueString4 = String(5);
int pos1 = 0;
int pos2 = 0;
int pos3 = 1000;
int pos4 = 1940;

// Current time
unsigned long currentTime = millis();
// Previous time
unsigned long previousTime = 0; 
// Define timeout time in milliseconds (example: 2000ms = 2s)
const long timeoutTime = 2000;

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

  myservo.attach(servoPin);  // attaches the servo on the servoPin to the servo object
  myservo1.attach(servoPin1);
  myservo2.attach(servoPin2);
  motorBottom.attach(PIN_BOT);
  motorTop.attach(PIN_TOP);

  //myservo.write(0);
  //myservo1.write(0);
  //myservo2.write(0);
  motorBottom.write(40);
  motorTop.write(40); 


  // Connect to Wi-Fi network with SSID and password
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // Print local IP address and start web server
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  server.begin();
}

void loop(){
  WiFiClient client = server.available();   // Listen for incoming clients

  if (client) {                             // If a new client connects,
    currentTime = millis();
    previousTime = currentTime;
    Serial.println("New Client.");          // print a message out in the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected() && currentTime - previousTime <= timeoutTime) { // loop while the client's connected
      currentTime = millis();
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        header += c;
        if (c == '\n') {                    // if the byte is a newline character
          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();

            // Display the HTML web page
            client.println("<!DOCTYPE html><html>");
            client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
            client.println("<link rel=\"icon\" href=\"data:,\">");
            // CSS to style the on/off buttons 
            // Feel free to change the background-color and font-size attributes to fit your preferences
            client.println("<style>body { text-align: center; font-family: \"Trebuchet MS\", Arial; margin-left:auto; margin-right:auto;}");
            client.println(".slider { width: 300px; }</style>");
            client.println("<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js\"></script>");
                     
            // Web Page
            client.println("</head><body><h1>ESP32 with Servo</h1>");
            client.println("<p>Horizontal: <span id=\"servoPos\"></span></p>");          
            client.println("<input type=\"range\" min=\"0\" max=\"180\" class=\"slider\" id=\"servoSlider\" onchange=\"servo(this.value)\" value=\""+valueString+"\"/>");

            client.println("<p>Vertical: <span id=\"servoPos1\"></span></p>");          
            client.println("<input type=\"range\" min=\"60\" max=\"90\" class=\"slider\" id=\"servoSlider1\" onchange=\"servo1(this.value)\" value1=\""+valueString1+"\"/>");

            client.println("<p>Rotation: <span id=\"servoPos2\"></span></p>");          
            client.println("<input type=\"range\" min=\"0\" max=\"180\" class=\"slider\" id=\"servoSlider2\" onchange=\"servo2(this.value)\" value2=\""+valueString2+"\"/>");
            
            client.println("<p>MotorBottom: <span id=\"servoPos3\"></span></p>");          
            client.println("<input type=\"range\" min=\"40\" max=\"180\" class=\"slider\" id=\"servoSlider3\" onchange=\"servo3(this.value)\" value3=\""+valueString3+"\"/>");

            client.println("<p>MotorTop: <span id=\"servoPos4\"></span></p>");          
            client.println("<input type=\"range\" min=\"40\" max=\"180\" class=\"slider\" id=\"servoSlider4\" onchange=\"servo4(this.value)\" value4=\""+valueString4+"\"/>");
            
            client.println("<script>var slider = document.getElementById(\"servoSlider\");");
            client.println("var servoP = document.getElementById(\"servoPos\"); servoP.innerHTML = slider.value;");
            client.println("slider.oninput = function() { slider.value = this.value; servoP.innerHTML = this.value; }");
            client.println("$.ajaxSetup({timeout:1000}); function servo(pos) { ");
            client.println("$.get(\"/?value=\" + pos + \"&\"); {Connection: close};}");

            client.println("var slider1 = document.getElementById(\"servoSlider1\");");
            client.println("var servoP1 = document.getElementById(\"servoPos1\"); servoP1.innerHTML = slider1.value;");
            client.println("slider1.oninput = function() { slider1.value = this.value; servoP1.innerHTML = this.value; }");
            client.println("$.ajaxSetup({timeout:1000}); function servo1(pos1) { ");
            client.println("$.get(\"/?value1=\" + pos1 + \"&\"); {Connection: close};}");

            client.println("var slider2 = document.getElementById(\"servoSlider2\");");
            client.println("var servoP2 = document.getElementById(\"servoPos2\"); servoP2.innerHTML = slider2.value;");
            client.println("slider2.oninput = function() { slider2.value = this.value; servoP2.innerHTML = this.value; }");
            client.println("$.ajaxSetup({timeout:1000}); function servo2(pos2) { ");
            client.println("$.get(\"/?value2=\" + pos2 + \"&\"); {Connection: close};}");

            client.println("var slider3 = document.getElementById(\"servoSlider3\");");
            client.println("var servoP3 = document.getElementById(\"servoPos3\"); servoP3.innerHTML = slider3.value;");
            client.println("slider3.oninput = function() { slider3.value = this.value; servoP3.innerHTML = this.value; }");
            client.println("$.ajaxSetup({timeout:1000}); function servo3(pos3) { ");
            client.println("$.get(\"/?value3=\" + pos3 + \"&\"); {Connection: close};}");

            client.println("var slider4 = document.getElementById(\"servoSlider4\");");
            client.println("var servoP4 = document.getElementById(\"servoPos4\"); servoP4.innerHTML = slider4.value;");
            client.println("slider4.oninput = function() { slider4.value = this.value; servoP4.innerHTML = this.value; }");
            client.println("$.ajaxSetup({timeout:1000}); function servo4(pos4) { ");
            client.println("$.get(\"/?value4=\" + pos4 + \"&\"); {Connection: close};}</script>");
           
            client.println("</body></html>");     
            
            //GET /?value=180& HTTP/1.1
            if(header.indexOf("GET /?value=")>=0) {
              pos1 = header.indexOf('=');
              pos2 = header.indexOf('&');
              valueString = header.substring(pos1+1, pos2);
              
              //Rotate the servo
              myservo.write(valueString.toInt());
              Serial.println(valueString); 
            }
            if(header.indexOf("GET /?value1=")>=0) {
              pos1 = header.indexOf('=');
              pos2 = header.indexOf('&');
              valueString1 = header.substring(pos1+1, pos2);
              
              //Rotate the servo
              myservo1.write(valueString1.toInt());
              Serial.println(valueString1); 
            }
            if(header.indexOf("GET /?value2=")>=0) {
              pos1 = header.indexOf('=');
              pos2 = header.indexOf('&');
              valueString2 = header.substring(pos1+1, pos2);
              
              //Rotate the servo
              myservo2.write(valueString2.toInt());
              Serial.println(valueString2); 
            }
            if(header.indexOf("GET /?value3=")>=0) {
              pos3 = header.indexOf('=');
              pos4 = header.indexOf('&');
              valueString1 = header.substring(pos3+1, pos4);
              
              //Rotate the servo
              motorBottom.write(valueString3.toInt());
              Serial.println(valueString3); 
            }
            if(header.indexOf("GET /?value4=")>=0) {
              pos3 = header.indexOf('=');
              pos4 = header.indexOf('&');
              valueString4 = header.substring(pos3+1, pos4);
              
              //Rotate the servo
              motorTop.write(valueString4.toInt());
              Serial.println(valueString4); 
            }         
            // The HTTP response ends with another blank line
            client.println();
            // Break out of the while loop
            break;
          } else { // if you got a newline, then clear currentLine
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }
      }
    }
    // Clear the header variable
    header = "";
    // Close the connection
    client.stop();
    Serial.println("Client disconnected.");
    Serial.println("");
  }
}

Kann mir bitte jemand helfen dies mit Beispiel Mobatools -> _Stepper -> ESP32-Web umzusetzen?
Ich komme da echt nicht weiter.

Also ich bräuchte hier ein Bsp. mit einer Servo

#include <WebServer.h>
#include <ArduinoOTA.h> // Programm hochladen Over The Air, siehe IDE Werkzeuge/Port
#include <MobaTools.h>  // ab 2.4.0: https://github.com/MicroBahner/MobaTools

const char *ssid = "Esp32AP";      // frei zu vergebener Name des Access Points, kann bis zu 32 Zeichen haben
const char *password = "12345678"; // frei zu vergebenes Passwort, mindestens 8 Zeichen jedoch nicht länger als 64 Zeichen

const byte dirPin       = 33; // verbinden mit DIR des Schrittmotortreibers
const byte stepPin      = 32; // verbinden mit STEP des Schrittmotortreibers
const byte enaPin       = 13; // verbinden mit ENA des Schrittmotortreibers
const byte servoPin =  21;  // Anschluß für den Servo

enum class Aktionen {STOP, LINKS, RECHTS, CONTL, CONTR};  // Aktionen des endlichen Automaten
const int STEPS_REVOLUTION = 3200;                         // 1/16 Microstep -> 3200 Schritte / Umdrehung
MoToStepper myStepper( STEPS_REVOLUTION, STEPDIR );       // Stepper einrichten
MoToServo myServo;
WebServer server(80);

#define DEBUGGING                                         // Einkommentieren für die Serielle Ausgabe
#ifdef DEBUGGING
#define DEBUG_B(...) Serial.begin(__VA_ARGS__)
#define DEBUG_P(...) Serial.println(__VA_ARGS__)
#define DEBUG_F(...) Serial.printf(__VA_ARGS__)
#else
#define DEBUG_B(...)
#define DEBUG_P(...)
#define DEBUG_F(...)
#endif

#include "website.h"

void setup() {
  myStepper.attach( stepPin, dirPin );               // Step- und Dir-Pin aktivieren
  myStepper.attachEnable( enaPin, 10, LOW );         // Enable Pin aktivieren ( LOW=aktiv )
  myStepper.setSpeed( 2000 );                        // 200 U/min
  myStepper.setRampLen( 300 );                       // Rampenlänge 300 Steps

  myServo.attach(servoPin); //Servo an Pin 9
  myServo.setSpeed( 5 );    // Verfahrgeschwindigkeit einstellen

  DEBUG_B(115200);
  DEBUG_F("\nSketchname: %s\nBuild: %s\t\tIDE: %d.%d.%d\n\n", __FILE__, __TIMESTAMP__, ARDUINO / 10000, ARDUINO % 10000 / 100, ARDUINO % 100 / 10 ? ARDUINO % 100 : ARDUINO % 10);

  WiFi.mode(WIFI_AP);                                // Der ESP32 bildet als Access Point sein eigenes WLAN
  if (WiFi.softAP(ssid, password)) {
    DEBUG_F("Verbinde dich mit dem Netzwerk \"%s\"\nGib \"%s/stepper\" im Browser ein\n\n", ssid, WiFi.softAPIP().toString().c_str());
  } else {
    DEBUG_P("Fehler beim erstellen.");
  }

  server.on ( "/stepper", handleStepper );           // Im Browser "http://192.168.4.1/stepper" ruft diese Funktion auf.

  ArduinoOTA.begin();                                // OTA starten

  server.begin();                                    // Webserver starten
  DEBUG_P("HTTP Server gestartet\n\n");
}

void loop() {
  ArduinoOTA.handle();                               // OTA abhandeln
  server.handleClient();                             // Anfragen an den Server abhandeln
}

void handleStepper() {        // Reaktion auf Eingaben und Html-Seite als Antwort an Browser zurückschicken
  char htmlTemp[sizeof(HTMLTEXT)+15]; // Size of website+some extra bytes for 2 variable fields
  long htSpeed = 150000;
  long htRamp = 100;
  if (server.hasArg("links")) esp32Stepper(Aktionen::LINKS);   // http://192.168.4.1/stepper?links
  if (server.hasArg("rechts")) esp32Stepper(Aktionen::RECHTS); // http://192.168.4.1/stepper?rechts
  if (server.hasArg("contl")) esp32Stepper(Aktionen::CONTL);   // http://192.168.4.1/stepper?contl
  if (server.hasArg("contr")) esp32Stepper(Aktionen::CONTR);   // http://192.168.4.1/stepper?contr
  if (server.hasArg("stop"))  esp32Stepper(Aktionen::STOP);     // http://192.168.4.1/stepper?stop
  if (server.hasArg("speed")) htSpeed = 10*server.arg("speed").toInt(); 
  if (server.hasArg("ramp"))  htRamp = server.arg("ramp").toInt();

  if (server.hasArg("setSpeed")) {
    // seting speed and autoramp
    htRamp = myStepper.setSpeedSteps(htSpeed);
  }
  if (server.hasArg("setRamp")) {
    // seting ramplength
    htRamp = myStepper.setRampLen(htRamp);
  }

  int htmlSize = snprintf( htmlTemp, sizeof(htmlTemp), HTMLTEXT, htSpeed/10, htRamp );
  server.send(200, "text/html", htmlTemp);
  DEBUG_F("Html-Größe = %d Byte\n\r", htmlSize);
}

void esp32Stepper(const Aktionen aktion) {
  switch (aktion) {
    case Aktionen::LINKS:
      myStepper.doSteps(-STEPS_REVOLUTION); // Stepper dreht eine Umdrehung links
      DEBUG_P("Stepper dreht eine Umdrehung links.");
      break;
    case Aktionen::RECHTS:
      myStepper.doSteps(STEPS_REVOLUTION); // Stepper dreht eine Umdrehung rechts
      DEBUG_P("Stepper dreht eine Umdrehung rechts.");
      break;
    case Aktionen::CONTL:
      myStepper.rotate( -1 ); // Stepper dreht links
      DEBUG_P("Stepper dreht links.");
      break;
    case Aktionen::CONTR:
      myStepper.rotate( 1 ); // Stepper dreht rechts
      DEBUG_P("Stepper dreht rechts.");
      break;
    case Aktionen::STOP:
      myStepper.rotate( 0 ); // Stepper stoppt
      DEBUG_P("Stepper stoppt.");
      break;
  }
}

Hab es jetzt mal so versucht aber es gehört bestimmt nicht in den Bereich "void handleStepper"

void handleStepper() {        // Reaktion auf Eingaben und Html-Seite als Antwort an Browser zurückschicken
  char htmlTemp[sizeof(HTMLTEXT)+15]; // Size of website+some extra bytes for 2 variable fields
  long htSpeed = 150000;
  long htRamp = 100;
  long htServo = 0;
  if (server.hasArg("links")) esp32Stepper(Aktionen::LINKS);   // http://192.168.4.1/stepper?links
  if (server.hasArg("rechts")) esp32Stepper(Aktionen::RECHTS); // http://192.168.4.1/stepper?rechts
  if (server.hasArg("contl")) esp32Stepper(Aktionen::CONTL);   // http://192.168.4.1/stepper?contl
  if (server.hasArg("contr")) esp32Stepper(Aktionen::CONTR);   // http://192.168.4.1/stepper?contr
  if (server.hasArg("stop"))  esp32Stepper(Aktionen::STOP);     // http://192.168.4.1/stepper?stop
  if (server.hasArg("speed")) htSpeed = 10*server.arg("speed").toInt(); 
  if (server.hasArg("ramp"))  htRamp = server.arg("ramp").toInt();
  if (server.hasArg("meinServo")) htServo = server.arg("meinServo").toInt();

  if (server.hasArg("setSpeed")) {
    // seting speed and autoramp
    htRamp = myStepper.setSpeedSteps(htSpeed);
  }
  if (server.hasArg("setRamp")) {
    // seting ramplength
    htRamp = myStepper.setRampLen(htRamp);
  }
  if (server.hasArg("setmeinServo")) {
    // seting ramplength
    htServo = meinServo.setSpeed(htServo);
  }

bekomme dann
Compilation error: 'htServo' was not declared in this scope

Gruß
Andi

Dieses Forum nutzt normalerweise die englische Sprache zur Kommunikation. Einzig im deutschsprachigen Teil nutzen wir Deutsch.

Du kannst also diesen Text ins Englische übersetzen oder einen der freundlichen Moderatoren bitten, dieses Thema zu verschieben.

EDIT: Dieser Text ist nun überflüssig :slightly_smiling_face:

Dem Schnipsel fehlt unten eine schliessende Klammer.
Drück mal STRG-T.

Hallo,
Schau Dich mal bei Fips um da gibts jede Menge Beispiele wie Du über eine Webseite Daten eingeben kannst. Wie und wozu man die dann im ESP nutzt steht auf einem anderen Blatt. Es geht zunächt mal darum wie man Daten anzeigen kann und Daten eingeben kann (HMI). Dazu solltest Du dich mit ein wenig Java Skript und der Fetch API befassen. Beides findest Du bei Fips..
Also erst mal festlegen was an Daten auf die Webseite muss, was nur Anzeige und was Eingabe sein soll. Dann die Webseite erstellen. Beim ESP kannst Du auch das Filesystem nutzen für die HTML Seite. Dann kannst Du die ganz normal erst mal ohne Daten ganz normal im Brauser testen.

Die standard Stepper LIB solltest Du vergessen, die blokiert. MobaTools ist da schon das Richtige, damit kannst Du auch Servos betreiben.
Heinz

Heinz

Ich habe ja schon ein Schiebe Regler in dem ersten Bild hier in der Html Seite.
Mehr soll erst einmal nicht in die HTML.

Mit diesem Schieberegler möchte ich die Servo bedienen.

Leider finde ich nirgends (auch nicht bei Fips) ein Bsp. welches "if (server.hasArg" in Kombination mit Mobatools und Servo beinhaltend.

Es sind natürlich alles tolle Projekte bei Fips, aber keins benutzt diesen Aufbau.

Wer ist denn eigentlich der Ersteller der Beispiel Schnipsel von Mobatools?

:cry:
Ich finde dort keine Klammer die Fehlt

Dem Code von void handleStepper() in #2 (code 3) fehlt am Ende eine schliessende Klammer '}' - Kann natürlich sein, das das beim kopieren passiert ist.
Aber die Fehlermeldung deutet darauf hin, das die evtl. auch im Original fehlt.
Ansonsten ist es nur raten. Dann braucht es den vollständigen Code.

der Komplette code ist ja eins drüber (Original Mobatools Beispiel aus Arduino)
Dort ist ja ein Stepper bedienbar.
Ich brauch dort noch eine Möglichkeit eine Servo über den Schieber zu bedienen

Nein.
In Code (2) gibt es kein htServo.
Damit ist auch die Fehlermeldung nicht reproduzierbar.

Hier ist der komplette

#include <WebServer.h>
#include <ArduinoOTA.h>  // Programm hochladen Over The Air, siehe IDE Werkzeuge/Port
#include <MobaTools.h>   // ab 2.4.0: https://github.com/MicroBahner/MobaTools

const char *ssid = "Esp32AP";       // frei zu vergebener Name des Access Points, kann bis zu 32 Zeichen haben
const char *password = "12345678";  // frei zu vergebenes Passwort, mindestens 8 Zeichen jedoch nicht länger als 64 Zeichen

const byte dirPin = 33;   // verbinden mit DIR des Schrittmotortreibers
const byte stepPin = 32;  // verbinden mit STEP des Schrittmotortreibers
const byte enaPin = 13;   // verbinden mit ENA des Schrittmotortreibers
const int servoPin = 9;

enum class Aktionen { STOP,
                      LINKS,
                      RECHTS,
                      CONTL,
                      CONTR };                     // Aktionen des endlichen Automaten
const int STEPS_REVOLUTION = 3200;                 // 1/16 Microstep -> 3200 Schritte / Umdrehung
MoToStepper myStepper(STEPS_REVOLUTION, STEPDIR);  // Stepper einrichten
MoToServo meinServo;
WebServer server(80);

#define DEBUGGING  // Einkommentieren für die Serielle Ausgabe
#ifdef DEBUGGING
#define DEBUG_B(...) Serial.begin(__VA_ARGS__)
#define DEBUG_P(...) Serial.println(__VA_ARGS__)
#define DEBUG_F(...) Serial.printf(__VA_ARGS__)
#else
#define DEBUG_B(...)
#define DEBUG_P(...)
#define DEBUG_F(...)
#endif

#include "website.h"

void setup() {
  myStepper.attach(stepPin, dirPin);        // Step- und Dir-Pin aktivieren
  myStepper.attachEnable(enaPin, 10, LOW);  // Enable Pin aktivieren ( LOW=aktiv )
  myStepper.setSpeed(2000);                 // 200 U/min
  myStepper.setRampLen(300);                // Rampenlänge 300 Steps

  meinServo.attach(servoPin);  //Servo an Pin 9
  meinServo.setSpeed(5);       // Verfahrgeschwindigkeit einstellen

  DEBUG_B(115200);
  DEBUG_F("\nSketchname: %s\nBuild: %s\t\tIDE: %d.%d.%d\n\n", __FILE__, __TIMESTAMP__, ARDUINO / 10000, ARDUINO % 10000 / 100, ARDUINO % 100 / 10 ? ARDUINO % 100 : ARDUINO % 10);

  WiFi.mode(WIFI_AP);  // Der ESP32 bildet als Access Point sein eigenes WLAN
  if (WiFi.softAP(ssid, password)) {
    DEBUG_F("Verbinde dich mit dem Netzwerk \"%s\"\nGib \"%s/stepper\" im Browser ein\n\n", ssid, WiFi.softAPIP().toString().c_str());
  } else {
    DEBUG_P("Fehler beim erstellen.");
  }

  server.on("/stepper", handleStepper);  // Im Browser "http://192.168.4.1/stepper" ruft diese Funktion auf.

  ArduinoOTA.begin();  // OTA starten

  server.begin();  // Webserver starten
  DEBUG_P("HTTP Server gestartet\n\n");
}

void loop() {
  ArduinoOTA.handle();    // OTA abhandeln
  server.handleClient();  // Anfragen an den Server abhandeln
}

void handleStepper() {                   // Reaktion auf Eingaben und Html-Seite als Antwort an Browser zurückschicken
  char htmlTemp[sizeof(HTMLTEXT) + 15];  // Size of website+some extra bytes for 2 variable fields
  long htSpeed = 150000;
  long htRamp = 100;
  long htServo = 0;
  if (server.hasArg("links")) esp32Stepper(Aktionen::LINKS);    // http://192.168.4.1/stepper?links
  if (server.hasArg("rechts")) esp32Stepper(Aktionen::RECHTS);  // http://192.168.4.1/stepper?rechts
  if (server.hasArg("contl")) esp32Stepper(Aktionen::CONTL);    // http://192.168.4.1/stepper?contl
  if (server.hasArg("contr")) esp32Stepper(Aktionen::CONTR);    // http://192.168.4.1/stepper?contr
  if (server.hasArg("stop")) esp32Stepper(Aktionen::STOP);      // http://192.168.4.1/stepper?stop
  if (server.hasArg("speed")) htSpeed = 10 * server.arg("speed").toInt();
  if (server.hasArg("ramp")) htRamp = server.arg("ramp").toInt();
  if (server.hasArg("meinServo")) htServo = server.arg("meinServo").toInt();

  if (server.hasArg("setSpeed")) {
    // seting speed and autoramp
    htRamp = myStepper.setSpeedSteps(htSpeed);
  }
  if (server.hasArg("setRamp")) {
    // seting ramplength
    htRamp = myStepper.setRampLen(htRamp);
  }
  if (server.hasArg("setmeinServo")) {
    // seting ramplength
    htServo = meinServo.setSpeed(htServo);
  }

  int htmlSize = snprintf(htmlTemp, sizeof(htmlTemp), HTMLTEXT, htSpeed / 10, htRamp, htServo);
  server.send(200, "text/html", htmlTemp);
  DEBUG_F("Html-Größe = %d Byte\n\r", htmlSize);
}

void esp32Stepper(const Aktionen aktion) {
  switch (aktion) {
    case Aktionen::LINKS:
      myStepper.doSteps(-STEPS_REVOLUTION);  // Stepper dreht eine Umdrehung links
      DEBUG_P("Stepper dreht eine Umdrehung links.");
      break;
    case Aktionen::RECHTS:
      myStepper.doSteps(STEPS_REVOLUTION);  // Stepper dreht eine Umdrehung rechts
      DEBUG_P("Stepper dreht eine Umdrehung rechts.");
      break;
    case Aktionen::CONTL:
      myStepper.rotate(-1);  // Stepper dreht links
      DEBUG_P("Stepper dreht links.");
      break;
    case Aktionen::CONTR:
      myStepper.rotate(1);  // Stepper dreht rechts
      DEBUG_P("Stepper dreht rechts.");
      break;
    case Aktionen::STOP:
      myStepper.rotate(0);  // Stepper stoppt
      DEBUG_P("Stepper stoppt.");
      break;
  }
}

Kannst Du mal die vollständige Fehlermeldung mitliefern oder mal kurz nen Suchpunkt für website.h bringen, damit man das selbst kompilieren kann?

klar gerne und danke für die Mühe und Unterstützung

website.h

// HTML-Textseite
const char HTMLTEXT[] = R"(<!DOCTYPE html>
<html lang="de">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
        body {
        background-color: #a9a9a9;
        display: flex;
        flex-flow: column;
        align-items: center;
        }
        form {
        display: flex;
        flex-flow: column;
        align-items: center;
        }
        .flex-container {
        display: flex;
        flex-flow: row;
        max-width: 30em;
        align-items: center;
        }
        @media all and (width <= 20em) {
            .flex-container {
            display: flex;
            flex-flow: column;
            max-width: 45em;
            align-items: center;
            }
        }
        .flex-item {
        border: 1px solid;
        margin: .2em;
        padding: .1em;
        text-align: center;
        <1background: #ffffff;>
        }
        input {
        font-size: 1em;
        background-color: #adff2f;
        }
        
    </style>
    <script type="text/javascript">
    function updateStep(c) {
        if(c.value >=  5000) {
            if(c.step != 100) {
                c.step = 100;
            }
        } else if(c.value >=  500) {
            if(c.step != 10) {
                c.step = 10;
            }
        } else {
                if(c.step != 1) c.step = 1;
        }
    }
    </script>
    </head>
    <body>
        <h2>Schrittmotor bewegen</h2>
        <h3>ESP32 Dev Module</h3>
        <form action="/stepper">
            <div class="flex-container">
                <p class="flex-item">
                    <label>
                    <input style="width:6em; background-color:white" max="50000" min="0" name="speed" type="number" value="%ld" onchange="updateStep(this) "/> Schritte/sec
                    </label>
                    <input name="setSpeed" type="submit" value="Geschw. setzen">
                </p>
                <p class="flex-item">
                    <label>
                    <input style="width:6em; background-color:white" max="160000" min="0" name="ramp" type="number" value="%ld" onchange="updateStep(this) " /> <label>Schritte</label>
                    </label>
                    <input name="setRamp" type="submit" value="Rampe setzen">
                </p>
            </div>
            <div class="flex-container">
                <p class="flex-item">
                <input name="links" type="submit" value="1 Umdr. nach links">
                <input name="contl" type="submit" value="Dauer links">
                </p>
                <p class="flex-item">
                <input name="rechts" type="submit" value="1 Umdr. nach rechts">
                <input name="contr" type="submit" value="Dauer rechts">
                </p>
            </div>
            <div class="flex-container">
                <p class="flex-item"><input style="background-color:red" name="stop" type="submit" value="Stopp"></p>
            </div>
        </form>
    </body>
</html>)";

DIe Original Vorlage ist ja den Beispielen in der Arduino Bibliothek bei
Mobatools -> _Stepper -> ESP32-Web

Hat MicroBahner diese Beispiele geschrieben?

@Microbahner ist der Maintainer und eigentlich unschlagbar mit seinen Codes.
Alles, was zur lib gehört ist seines :wink:

In #1 schreibst Du, das der auf ESP 32 dev module laufen soll...
Ich bekomm das nicht mal ansatzweise darauf kompilert.

Damit muss ich passen.
Es war ein Versuch, aber warte ab... Das wird.

den Fehler mit #include <MobaTools.h> auf dem ESP 32 dev module hatte ich vorgestern auch.
Auf 2 Pc's. Auf einem hab ich Arduino ganz frisch installiert
Hab einmal umgestellt auf WEMOS D1 MINI ESP32 und überprüft, danach ging es dann auch auf dem ESP 32 dev module

Bei den Beispielen hat auch @agmue einiges beigetragen. Speziell dieses Web-Beipiel ist seine Idee und im Wesentlichen auch von ihm.

Das ist doch das Original aus dem Beispiel. Da kommt ja nichts mit 'servo' vor. Poste bitte mal die von dir veränderte Variante.

Hallo MicroBahner,

es liegt tatsächlich daran, dass das Feld nicht bedient bzw. vorhanden ist in der Webseite.
Ich versuche es heute Abend umzusetzen und Poste dann.

Ich versuche wahrscheinlich auch erst einmal direkte Serv Pos eingaben, da es bei dieser Webserver Methode mit dem Slider vermutlich noch andere Baustellen gibt .

@agmue
Benötige ich bei der Website.h für einen Slider auch?

var xhr = new XMLHttpRequest();
xhr.open("GET", "/slider?value="+sliderValue, true);
xhr.send()

Hallo zusammen,

ich hab kein Plan wie ich die Servo Position von der html an die Ino übergebe.
Hab schon mehrere Sachen probiert.

ESP32-Web.ino

#include <WebServer.h>
#include <ArduinoOTA.h>  // Programm hochladen Over The Air, siehe IDE Werkzeuge/Port
#include <MobaTools.h>   // ab 2.4.0: https://github.com/MicroBahner/MobaTools

const char *ssid = "Esp32AP";       // frei zu vergebener Name des Access Points, kann bis zu 32 Zeichen haben
const char *password = "12345678";  // frei zu vergebenes Passwort, mindestens 8 Zeichen jedoch nicht länger als 64 Zeichen

const byte dirPin = 33;   // verbinden mit DIR des Schrittmotortreibers
const byte stepPin = 32;  // verbinden mit STEP des Schrittmotortreibers
const byte enaPin = 13;   // verbinden mit ENA des Schrittmotortreibers
static const int servoPin = 12;

String sliderValue = "0";

enum class Aktionen { STOP,
                      LINKS,
                      RECHTS,
                      CONTL,
                      CONTR };                     // Aktionen des endlichen Automaten
const int STEPS_REVOLUTION = 3200;                 // 1/16 Microstep -> 3200 Schritte / Umdrehung
MoToStepper myStepper(STEPS_REVOLUTION, STEPDIR);  // Stepper einrichten
MoToServo myServo;
WebServer server(80);

#define DEBUGGING  // Einkommentieren für die Serielle Ausgabe
#ifdef DEBUGGING
#define DEBUG_B(...) Serial.begin(__VA_ARGS__)
#define DEBUG_P(...) Serial.println(__VA_ARGS__)
#define DEBUG_F(...) Serial.printf(__VA_ARGS__)
#else
#define DEBUG_B(...)
#define DEBUG_P(...)
#define DEBUG_F(...)
#endif

#include "website.h"

void setup() {
  myStepper.attach(stepPin, dirPin);        // Step- und Dir-Pin aktivieren
  myStepper.attachEnable(enaPin, 10, LOW);  // Enable Pin aktivieren ( LOW=aktiv )
  myStepper.setSpeed(2000);                 // 200 U/min
  myStepper.setRampLen(300);                // Rampenlänge 300 Steps

  myServo.attach(servoPin);  //Servo an Pin 9
  myServo.setSpeed(5);       // Verfahrgeschwindigkeit einstellen
  //myservo.write(0);
  
  DEBUG_B(115200);
  DEBUG_F("\nSketchname: %s\nBuild: %s\t\tIDE: %d.%d.%d\n\n", __FILE__, __TIMESTAMP__, ARDUINO / 10000, ARDUINO % 10000 / 100, ARDUINO % 100 / 10 ? ARDUINO % 100 : ARDUINO % 10);

  WiFi.mode(WIFI_AP);  // Der ESP32 bildet als Access Point sein eigenes WLAN
  if (WiFi.softAP(ssid, password)) {
    DEBUG_F("Verbinde dich mit dem Netzwerk \"%s\"\nGib \"%s/stepper\" im Browser ein\n\n", ssid, WiFi.softAPIP().toString().c_str());
  } else {
    DEBUG_P("Fehler beim erstellen.");
  }

  server.on("/stepper", handleStepper);  // Im Browser "http://192.168.4.1/stepper" ruft diese Funktion auf.

  ArduinoOTA.begin();  // OTA starten

  server.begin();  // Webserver starten
  DEBUG_P("HTTP Server gestartet\n\n");
}

void loop() {
  ArduinoOTA.handle();    // OTA abhandeln
  server.handleClient();  // Anfragen an den Server abhandeln
  
}

void handleStepper() {                   // Reaktion auf Eingaben und Html-Seite als Antwort an Browser zurückschicken
  char htmlTemp[sizeof(HTMLTEXT) + 15];  // Size of website+some extra bytes for 2 variable fields
  long htSpeed = 150000;
  long htRamp = 100;
  byte htServo = 0;
  if (server.hasArg("links")) esp32Stepper(Aktionen::LINKS);    // http://192.168.4.1/stepper?links
  if (server.hasArg("rechts")) esp32Stepper(Aktionen::RECHTS);  // http://192.168.4.1/stepper?rechts
  if (server.hasArg("contl")) esp32Stepper(Aktionen::CONTL);    // http://192.168.4.1/stepper?contl
  if (server.hasArg("contr")) esp32Stepper(Aktionen::CONTR);    // http://192.168.4.1/stepper?contr
  if (server.hasArg("stop")) esp32Stepper(Aktionen::STOP);      // http://192.168.4.1/stepper?stop
  if (server.hasArg("speed")) htSpeed = 10 * server.arg("speed").toInt();
  if (server.hasArg("ramp")) htRamp = server.arg("ramp").toInt();
  if (server.hasArg("Servo")) htServo = server.arg("Servo").toInt();

  if (server.hasArg("setSpeed")) {
    // seting speed and autoramp
    htRamp = myStepper.setSpeedSteps(htSpeed);
  }
  if (server.hasArg("setRamp")) {
    // seting ramplength
    htRamp = myStepper.setRampLen(htRamp);
  }
  //if (server.hasArg("setServo")) {
  //  htServo = myservo.write(htServo);
  //}

  int htmlSize = snprintf(htmlTemp, sizeof(htmlTemp), HTMLTEXT, htSpeed / 10, htRamp, htServo);
  server.send(200, "text/html", htmlTemp);
  DEBUG_F("Html-Größe = %d Byte\n\r", htmlSize);
}

void esp32Stepper(const Aktionen aktion) {
  switch (aktion) {
    case Aktionen::LINKS:
      myStepper.doSteps(-STEPS_REVOLUTION);  // Stepper dreht eine Umdrehung links
      DEBUG_P("Stepper dreht eine Umdrehung links.");
      break;
    case Aktionen::RECHTS:
      myStepper.doSteps(STEPS_REVOLUTION);  // Stepper dreht eine Umdrehung rechts
      DEBUG_P("Stepper dreht eine Umdrehung rechts.");
      break;
    case Aktionen::CONTL:
      myStepper.rotate(-1);  // Stepper dreht links
      DEBUG_P("Stepper dreht links.");
      break;
    case Aktionen::CONTR:
      myStepper.rotate(1);  // Stepper dreht rechts
      DEBUG_P("Stepper dreht rechts.");
      break;
    case Aktionen::STOP:
      myStepper.rotate(0);  // Stepper stoppt
      DEBUG_P("Stepper stoppt.");
      break;

  }

}

website.h

// HTML-Textseite
const char HTMLTEXT[] = R"(<!DOCTYPE html>
<html lang="de">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
        body {
        background-color: #a9a9a9;
        display: flex;
        flex-flow: column;
        align-items: center;
        }
        form {
        display: flex;
        flex-flow: column;
        align-items: center;
        }
        .flex-container {
        display: flex;
        flex-flow: row;
        max-width: 30em;
        align-items: center;
        }
        @media all and (width <= 20em) {
            .flex-container {
            display: flex;
            flex-flow: column;
            max-width: 45em;
            align-items: center;
            }
        }
        .flex-item {
        border: 1px solid;
        margin: .2em;
        padding: .1em;
        text-align: center;
        <1background: #ffffff;>
        }
        input {
        font-size: 1em;
        background-color: #adff2f;
        }
        
    </style>
    <script type="text/javascript">
    function updateStep(c) {
        if(c.value >=  5000) {
            if(c.step != 100) {
                c.step = 100;
            }
        } else if(c.value >=  500) {
            if(c.step != 10) {
                c.step = 10;
            }
        } else {
                if(c.step != 1) c.step = 1;
        }
    }
    </script>
    </head>
    <body>
        <h2>Schrittmotor bewegen</h2>
        <h3>ESP32 Dev Module</h3>
        <form action="/stepper">
            <div class="flex-container">
                <p class="flex-item">
                    <label>
                    <input style="width:6em; background-color:white" max="50000" min="0" name="speed" type="number" value="%ld" onchange="updateStep(this) "/> Schritte/sec
                    </label>
                    <input name="setSpeed" type="submit" value="Geschw. setzen">
                </p>
                <p class="flex-item">
                    <label>
                    <input style="width:6em; background-color:white" max="160000" min="0" name="ramp" type="number" value="%ld" onchange="updateStep(this) " /> <label>Schritte</label>
                    </label>
                    <input name="setRamp" type="submit" value="Rampe setzen">
                </p>
                </div>
            <div class="flex-container"
                <p class="flex-item">
                    <label>
                    <input style="width:6em; background-color:white" max="180" min="0" name="Servo" type="number" value="%ld" onchange="updateStep(this) " /> <label>Servo</label>
                    </label>
                    <input name="setServo" type="submit" value="Servo setzen">
                </p>
                </div>
            </div>
            <div class="flex-container">
                <p class="flex-item">
                <input name="links" type="submit" value="1 Umdr. nach links">
                <input name="contl" type="submit" value="Dauer links">
                </p>
                <p class="flex-item">
                <input name="rechts" type="submit" value="1 Umdr. nach rechts">
                <input name="contr" type="submit" value="Dauer rechts">
                </p>
            </div>
            <div class="flex-container">
                <p class="flex-item"><input style="background-color:red" name="stop" type="submit" value="Stopp"></p>
            </div>
        </form>
    </body>
</html>)";

Den ESP32 verbinde ich mal mit meinem Router, dann ist das für mich einfacher, mein Läppi benötigt sonst einen neuen Verbindungsschubs.

Die Events habe ich in zwei aufgeteilt, Servo und Stepper getrennt, muß aber nicht.

Sonst wie beim Stepper.

website.h

// HTML-Textseite
const char HTMLTEXT[] = R"(<!DOCTYPE html>
<html lang="de">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <style>
        body {
        background-color: #a9a9a9;
        display: flex;
        flex-flow: column;
        align-items: center;
        }
        form {
        display: flex;
        flex-flow: column;
        align-items: center;
        }
        .flex-container {
        display: flex;
        flex-flow: row;
        max-width: 30em;
        align-items: center;
        }
        @media all and (width <= 20em) {
            .flex-container {
            display: flex;
            flex-flow: column;
            max-width: 45em;
            align-items: center;
            }
        }
        .flex-item {
        border: 1px solid;
        margin: .2em;
        padding: .1em;
        text-align: center;
        <1background: #ffffff;>
        }
        input {
        font-size: 1em;
        background-color: #adff2f;
        }
        
    </style>
    <script type="text/javascript">
      function updateStep(c) {
        if(c.value >=  5000) {
            if(c.step != 100) {
                c.step = 100;
            }
        } else if(c.value >=  500) {
            if(c.step != 10) {
                c.step = 10;
            }
        } else {
                if(c.step != 1) c.step = 1;
        }
      }
      function updateServo(c) {
        if(c.value >  180) {
          c.step = 180;
        } else if(c.value < 0) {
          c.step = 0;
        }
      }
    </script>
    </head>
    <body>
        <h2>Schrittmotor bewegen</h2>
        <h3>ESP32 Dev Module</h3>
        <form action="/stepper">
            <div class="flex-container">
                <p class="flex-item">
                    <label>
                    <input style="width:6em; background-color:white" max="50000" min="0" name="speed" type="number" value="%ld" onchange="updateStep(this) "/> Schritte/sec
                    </label>
                    <input name="setSpeed" type="submit" value="Geschw. setzen">
                </p>
                <p class="flex-item">
                    <label>
                    <input style="width:6em; background-color:white" max="160000" min="0" name="ramp" type="number" value="%ld" onchange="updateStep(this) " /> <label>Schritte</label>
                    </label>
                    <input name="setRamp" type="submit" value="Rampe setzen">
                </p>
            </div>
            <div class="flex-container">
                <p class="flex-item">
                <input name="links" type="submit" value="1 Umdr. nach links">
                <input name="contl" type="submit" value="Dauer links">
                </p>
                <p class="flex-item">
                <input name="rechts" type="submit" value="1 Umdr. nach rechts">
                <input name="contr" type="submit" value="Dauer rechts">
                </p>
            </div>
            <div class="flex-container">
                <p class="flex-item"><input style="background-color:red" name="stop" type="submit" value="Stopp"></p>
            </div>
        </form>
        <form action="/servo">
            <div class="flex-container"
                <p class="flex-item">
                    <label>
                    <input style="width:6em; background-color:white" max="180" min="0" name="Winkel" type="number" value="%d" onchange="updateServo(this) " /> <label>Servo</label>
                    </label>
                    <input name="setServo" type="submit" value="Servo setzen">
                </p>
            </div>
        </form>
    </body>
</html>)";

ino

#include "zugangsdaten.h"
#include <WebServer.h>
#include <ArduinoOTA.h>  // Programm hochladen Over The Air, siehe IDE Werkzeuge/Port
#include <MobaTools.h>   // ab 2.4.0: https://github.com/MicroBahner/MobaTools

const char *ssid = STA_SSID;          // frei zu vergebener Name des Access Points, kann bis zu 32 Zeichen haben
const char *password = STA_PASSWORD;  // frei zu vergebenes Passwort, mindestens 8 Zeichen jedoch nicht länger als 64 Zeichen

const byte dirPin = 33;   // verbinden mit DIR des Schrittmotortreibers
const byte stepPin = 32;  // verbinden mit STEP des Schrittmotortreibers
const byte enaPin = 13;   // verbinden mit ENA des Schrittmotortreibers
static const int servoPin = 12;

String sliderValue = "0";

enum class Aktionen { STOP,
                      LINKS,
                      RECHTS,
                      CONTL,
                      CONTR };                     // Aktionen des endlichen Automaten
const int STEPS_REVOLUTION = 3200;                 // 1/16 Microstep -> 3200 Schritte / Umdrehung
MoToStepper myStepper(STEPS_REVOLUTION, STEPDIR);  // Stepper einrichten
MoToServo myServo;
WebServer server(80);

#define DEBUGGING  // Einkommentieren für die Serielle Ausgabe
#ifdef DEBUGGING
#define DEBUG_B(...) Serial.begin(__VA_ARGS__)
#define DEBUG_P(...) Serial.println(__VA_ARGS__)
#define DEBUG_F(...) Serial.printf(__VA_ARGS__)
#else
#define DEBUG_B(...)
#define DEBUG_P(...)
#define DEBUG_F(...)
#endif

#include "website.h"

long htSpeed = 150000;
long htRamp = 100;
int htServo = 0;

void setup() {
  myStepper.attach(stepPin, dirPin);        // Step- und Dir-Pin aktivieren
  myStepper.attachEnable(enaPin, 10, LOW);  // Enable Pin aktivieren ( LOW=aktiv )
  myStepper.setSpeed(2000);                 // 200 U/min
  myStepper.setRampLen(300);                // Rampenlänge 300 Steps

  myServo.attach(servoPin);  //Servo an Pin 9
  myServo.setSpeed(5);       // Verfahrgeschwindigkeit einstellen
  
  DEBUG_B(115200);
  DEBUG_F("\nSketchname: %s\nBuild: %s\t\tIDE: %d.%d.%d\n\n", __FILE__, __TIMESTAMP__, ARDUINO / 10000, ARDUINO % 10000 / 100, ARDUINO % 100 / 10 ? ARDUINO % 100 : ARDUINO % 10);
  /*
  WiFi.mode(WIFI_AP);  // Der ESP32 bildet als Access Point sein eigenes WLAN
  if (WiFi.softAP(ssid, password)) {
    DEBUG_F("Verbinde dich mit dem Netzwerk \"%s\"\nGib \"%s/stepper\" im Browser ein\n\n", ssid, WiFi.softAPIP().toString().c_str());
  } else {
    DEBUG_P("Fehler beim erstellen.");
  }
  */
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    DEBUG_F(".");
  }
  DEBUG_P("");
  DEBUG_P("WiFi connected");
  DEBUG_P("IP address: ");
  DEBUG_P(WiFi.localIP());
  
  server.on("/stepper", handleStepper);  // Im Browser "http://192.168.4.1/stepper" ruft diese Funktion auf.
  server.on("/servo", handleServo);  // Im Browser "http://192.168.4.1/servo" ruft diese Funktion auf.

  ArduinoOTA.begin();  // OTA starten

  server.begin();  // Webserver starten
  DEBUG_P("HTTP Server gestartet\n\n");
}

void loop() {
  ArduinoOTA.handle();    // OTA abhandeln
  server.handleClient();  // Anfragen an den Server abhandeln
}

void handleStepper() {                   // Reaktion auf Eingaben und Html-Seite als Antwort an Browser zurückschicken
  char htmlTemp[sizeof(HTMLTEXT) + 15];  // Size of website+some extra bytes for 2 variable fields
  if (server.hasArg("links")) esp32Stepper(Aktionen::LINKS);    // http://192.168.4.1/stepper?links
  if (server.hasArg("rechts")) esp32Stepper(Aktionen::RECHTS);  // http://192.168.4.1/stepper?rechts
  if (server.hasArg("contl")) esp32Stepper(Aktionen::CONTL);    // http://192.168.4.1/stepper?contl
  if (server.hasArg("contr")) esp32Stepper(Aktionen::CONTR);    // http://192.168.4.1/stepper?contr
  if (server.hasArg("stop")) esp32Stepper(Aktionen::STOP);      // http://192.168.4.1/stepper?stop
  if (server.hasArg("speed")) htSpeed = 10 * server.arg("speed").toInt();
  if (server.hasArg("ramp")) htRamp = server.arg("ramp").toInt();

  if (server.hasArg("setSpeed")) {
    // seting speed and autoramp
    htRamp = myStepper.setSpeedSteps(htSpeed);
  }
  if (server.hasArg("setRamp")) {
    // seting ramplength
    htRamp = myStepper.setRampLen(htRamp);
  }

  int htmlSize = snprintf(htmlTemp, sizeof(htmlTemp), HTMLTEXT, htSpeed / 10, htRamp, htServo);
  server.send(200, "text/html", htmlTemp);
  DEBUG_F("Html-Größe = %d Byte\n\r", htmlSize);
}

void esp32Stepper(const Aktionen aktion) {
  switch (aktion) {
    case Aktionen::LINKS:
      myStepper.doSteps(-STEPS_REVOLUTION);  // Stepper dreht eine Umdrehung links
      DEBUG_P("Stepper dreht eine Umdrehung links.");
      break;
    case Aktionen::RECHTS:
      myStepper.doSteps(STEPS_REVOLUTION);  // Stepper dreht eine Umdrehung rechts
      DEBUG_P("Stepper dreht eine Umdrehung rechts.");
      break;
    case Aktionen::CONTL:
      myStepper.rotate(-1);  // Stepper dreht links
      DEBUG_P("Stepper dreht links.");
      break;
    case Aktionen::CONTR:
      myStepper.rotate(1);  // Stepper dreht rechts
      DEBUG_P("Stepper dreht rechts.");
      break;
    case Aktionen::STOP:
      myStepper.rotate(0);  // Stepper stoppt
      DEBUG_P("Stepper stoppt.");
      break;
  }
}

void handleServo() {                     // Reaktion auf Eingaben und Html-Seite als Antwort an Browser zurückschicken
  char htmlTemp[sizeof(HTMLTEXT) + 15];  // Size of website+some extra bytes for 2 variable fields
  if (server.hasArg("Winkel")) htServo = server.arg("Winkel").toInt();

  if (server.hasArg("setServo")) {
    myServo.write(htServo);
  }

  int htmlSize = snprintf(htmlTemp, sizeof(htmlTemp), HTMLTEXT, htSpeed / 10, htRamp, htServo);
  server.send(200, "text/html", htmlTemp);
  DEBUG_F("Html-Größe = %d Byte\n\r", htmlSize);
}

ToDo: DEBUGGING ausblenden geht nicht.

1 Like