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