ESP8266-Webserver_Canvas Slider_PWM

Hallo!
Kann es sein, dass noch niemand einen Canvas Slider zur PWM-Steuerung
verwendet hat? Im www habe ich jedenfalls nichts dazu gefunden.
Es gibt zwar einige schön gestylte Canvas Slider anzuschauen, mehr aber nicht.
Vielleicht hat jemand von euch schon mal ein Beispiel gesehen oder kann mir
helfen einen Sketch dazu zu schreiben.

Habe anbei einen funktionierenden Sketch mit HTML Slider und
einen noch nicht funktionierenden Sketch mit Canvas Slider.
Vielleicht hat jemand eine Idee, wie man letzteren so umgestaltet, dass er
auch funktionstüchtig wird.
1xPWM_HTML&Canvas_Slider.zip (16,8 KB)

Dann zeige deinen Sketch bitte direkt in Code-Tags. Ein Zip wird nicht gern geöffnet.
Und einen Link zu deinem Slider.

ich frage mich da eher weswegen man einen "einzeiligen" html input range unbedingt gegen 1200 Zeilen Code austauschen will...

Warum gestaltest du nicht den HTML slider mit CSS?

Zunächst mal danke, dass ihr mich unterstützen wollt.

Mein gesendeter Code ist nur ein Muster zum Testen und soll in ein Projekt integriert werden.
Dieses umfasst inzwischen 20 Tabs mit ca. 12 A-4 Seiten Code inkl. 5 Slider.

Die Diagramme im Projekt sind mit Canvas erstellt und deren Scripts sind optional mit verschiedenen Quellen , a) im www , b) mit meinem Homeserver, c) im Flash des ESP8266 verlinkt.

Die 5 Slider sollen nur sichtbar sein, wenn sie benötigt werden. Doch, wenn ein Slider aus dem DOM verschwindet, macht die restliche Software zicken usw.
Nach vielen Fehlversuchen eine Lösung zu finden, kam ich auf die Idee mal nach anderen Slidern umzuschauen, bei denen das Ausblenden vielleicht unproblematischer ist.

Da ich mit Canvas schon einiges umgesetzt habe versuchte ich es damit.
Den Gedanken, warum diesen Aufwand, ein HTML Slider mit CSS tut es doch genauso, hatte ich auch. Doch je länger ich probierte einen Canvas Slider zu integrieren, umso mehr wollte ich
ihn unbedingt in meinem Projekt haben - das kennt ihr vielleicht auch.

Einen direkten Link zum nötigen Script (canvasslider.js) fand ich im www nicht.
Hier (GitHub - akalverboer/CanvasSlider: Pure JavaScript HTML5 Canvas Range Slider. No stylesheet needed. Simple, elegant and powerful. A quirky alternative to other sliders.) hatte ich das Script heruntergeladen und
Lokal (im Flash) bereit gestellt.

Ich würde nun gern wissen, ob man einen Canvas Slider im Code zur PWM-Steuerung verwenden
kann und wenn ja, wie?

Also, wer Lust hat sich dieser Aufgabe zu stellen, ohne die Notwendigkeit, eine Antwort zu finden, zu hinterfragen, möge diese tun.

Hier der Code für den Canvas Slider:

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include "index.h"
//SSID and Password of your WiFi router
const char* ssid = "yourssid";
const char* password = "XYZ";
ESP8266WebServer server(80);
#define PWM1_pin 2  //D4

void handlePWM() {
    analogWriteFreq(500);
    String pwm1Value = server.arg("PWM1_val");
        int val1 = pwm1Value.toInt();
            val1 = constrain(val1, 0, 1023);        // PWM-Wert- Bereich festlegen
            analogWrite(PWM1_pin, (300-val1));      // Ausgabe des PWM-Signals (invertiert - wegen D4 Logik)
            Serial.print("PWM1-Wert: ");
            Serial.println(val1);
    server.send(200,"text/plain","0");              // handling the webpage update
}
void setup() {
    Serial.begin(9600);
    delay(1000);
    Serial.println();
    Serial.println("_______________________________");
    Serial.println(__FILE__);                       // Dateiname
    Serial.println(__DATE__);                       // Erstellungsdatum
    Serial.println(__TIME__);                       // Erstellungszeitpunkt
    Serial.println("_______________________________");
    Serial.println("Projekt_XY");                   // Projektname
    Serial.println("Start: --- "); 
    Serial.println("_______________________________");
    Serial.println("Server listening");
    Serial.print("  Freier Speicher: ");
    Serial.print(ESP.getFreeHeap());
    Serial.println(" Bytes");
    Serial.println("_______________________________");
    WiFi.begin(ssid, password);                //Connect to your WiFi router
    Serial.println("");
    while (WiFi.status() != WL_CONNECTED) {    //Wait for connection
    delay(500);
    Serial.println("Waiting to connect?");
    }
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());            // Print the local IP
    pinMode(2, OUTPUT); 
    analogWrite(PWM1_pin,300);                 // chaning the value on the NodeMCU board
    server.on("/", handleRoot);                   // Associate the handler function to the path
    server.on("/setPWM", handlePWM);          // handles the PWM values
    server.begin();  

    Serial.println("HTTP server started");
}
void loop() {
    server.handleClient();                     // Handling of incoming requests
}
void handleRoot() {
     server.send(200, "text/html", html_page);
}
const char html_page[] PROGMEM = R"=====(
<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <meta charset="UTF-8">
    <title>HTML Slider</title>
    
</head>

<body>

      <h3>HTML Slider</h3> 
      <input type='range' min='0' max='300' value='0' class='slider' id='myCanvas'>
      <span id='slider_p'></span>

    <script>
        
          var slider = document.getElementById('myCanvas'); 
          var pwmValue = document.getElementById('slider_p');             // Hier wird der PWM-Wert angezeigt
          slider.addEventListener('input', function(){  
          var sliderValue = slider.value;                                 // Wert des Sliders
          pwmValue.textContent = 'PWM-Wert: ' + sliderValue;              // Anzeige des PWM-Werts im Element 'p1'
          var xhttp = new XMLHttpRequest(); 
          xhttp.open('GET', '/setPWM?PWM1_val=' + sliderValue, true);       // Sende den PWM-Wert an den Server
          xhttp.send(); 
          }); 
 
    </script>
</body>
</html>

)=====";

Hier der 2. Code für den Canvas Slider:

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include "index.h"
//SSID and Password of your WiFi router
const char* ssid = "yourssid";
const char* password = "XYZ";
ESP8266WebServer server(80);
#define PWM1_pin 2  //D4

void handlePWM() {
    analogWriteFreq(500);
    String pwm1Value = server.arg("PWM1_val");
        int val1 = pwm1Value.toInt();
            val1 = constrain(val1, 0, 1023);        // PWM-Wert- Bereich festlegen
            analogWrite(PWM1_pin, (300-val1));      // Ausgabe des PWM-Signals (invertiert - wegen D4 Logik)
            Serial.print("PWM1-Wert: ");
            Serial.println(val1);
    server.send(200,"text/plain","0");              // handling the webpage update
}
void setup() {
    Serial.begin(9600);
    delay(1000);
    Serial.println();
    Serial.println("_______________________________");
    Serial.println(__FILE__);                       // Dateiname
    Serial.println(__DATE__);                       // Erstellungsdatum
    Serial.println(__TIME__);                       // Erstellungszeitpunkt
    Serial.println("_______________________________");
    Serial.println("Projekt_XY");                   // Projektname
    Serial.println("Start: --- "); 
    Serial.println("_______________________________");
    Serial.println("Server listening");
    Serial.print("  Freier Speicher: ");
    Serial.print(ESP.getFreeHeap());
    Serial.println(" Bytes");
    Serial.println("_______________________________");
    WiFi.begin(ssid, password);                //Connect to your WiFi router
    Serial.println("");
    while (WiFi.status() != WL_CONNECTED) {    //Wait for connection
    delay(500);
    Serial.println("Waiting to connect?");
    }
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());            // Print the local IP
    pinMode(2, OUTPUT); 
    analogWrite(PWM1_pin,300);                 // chaning the value on the NodeMCU board

    server.on("/", handleRoot);   //Associate the handler function to the path
    server.on("/setPWM", handlePWM);  // handles the PWM values
    server.on("/canvasslider.js", handleJS);
    server.begin();                               // Start the server
                   
    Serial.println("HTTP server started");
}
void loop() {
    server.handleClient();                     // Handling of incoming requests
}
void handleRoot() {
     server.send(200, "text/html", html_page);
}
void handleJS() {
    Serial.println("Handling JavaScript request..."); // Debugging-Ausgabe
    
    server.sendHeader("Content-Type", "application/javascript");
    server.send(200, "application/javascript", canvasslider_js);

    Serial.println("JavaScript file sent."); // Debugging-Ausgabe nach dem Senden der Datei
}
````const char html_page[] PROGMEM = R"=====(
<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <meta charset="UTF-8">
    <title>Canvas Range Slider</title>
    <style>
       * { box-sizing: border-box;}
       body {
          font-family: Arial, Helvetica, sans-serif; 
          margin: 30px; padding: 0 0 50px; 
          color: #333; 
          font-size: 14px; 
          line-height: 1.6em;
       }
       canvas {
           border: 1px solid #000; 
       } 
    </style>   
    <script type="text/javascript" src="/canvasslider.js"></script>
    
</head>
<body>

    <h3>Canvas Slider</h3>
    <canvas id="myCanvas" title="slider 2" style="cursor: pointer;" width="800" height="80"></canvas><br><br>
    <span id='slider_p'></span>
    <script>
    
          var CS = new CanvasSlider({
          canvas: "myCanvas", range: {min: 0, max: 100.4, 
          count: 11}, 
          start: [0], 
          snapToTicks: true, 
          showLabels: true,
          showMajorTicks: true, 
          showMinorTicks: false, 
          showToolTip: true, 
          format: {decimals: 0, prefix: "% ", suffix: ""},  
          baseColor: {h: 40, s: 80, v: 90},
          handle: {shape: "rectangle", w: 20, h: 20, hue: 60}             // hue: Knopffarbe
          });

          var slider = document.getElementById('myCanvas'); 
          var pwmValue = document.getElementById('slider_p');             // Hier wird der PWM-Wert angezeigt
             // Event-Listener für den Slider
          console.log('Slider-Wert (vor Aktualisierung):', slider.value);
          slider.addEventListener('input', function(){  
          console.log('Slider-Wert (nach Aktualisierung):', slider.value);
          var sliderValue = slider.value;                                 // Wert des Sliders
          pwmValue.textContent = 'PWM-Wert: ' + sliderValue;              // Anzeige des PWM-Werts im Element 'p1'
          console.log('Anfrage wird gesendet...');
          console.log('Wert von pwmValue:', pwmValue.textContent);
          var xhttp = new XMLHttpRequest(); 
          xhttp.open('GET', '/setPWM?PWM1_val=' + sliderValue, true);       // Sende den PWM-Wert an den Server
          xhttp.send(); 
          }); 
          
    </script>          
</body>
</html>

)=====";
const char canvasslider_js[] PROGMEM = R"=====(
// Hier Inhalt des Script "canvasslider.js" einfügen.
)=====";`

Hallo:

Konnte mir heute noch einen Weihnachtswunsch erfüllen -
Einen funktionierenden Canvas Slider zur PWM-Steuerung. :smiley:

Die Mühen haben sich gelohnt.
Ein Canvas Slider scheint flexibler zu sein, als ein HTML-Slider.
Bin begeistert.
Wer Lust hat probiert ihn mal aus.

Wie schon erwähnt, kann das Script (in diesem Fall "canvasslider.js")
einfach im Flash mit Hilfe von LittleFS abgelegt und von dort aufgerufen werden.
Wen das interessiert wie das umgesetzt wird, dem helfe ich gerne weiter.

Nun möchte ich die Weihnachtliche Stille nicht mehr weiter stören.

Frohe Weihnachten!!!

P.S.
Hier mein aktueller Canvas-Slider-Code:

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include "index.h"
//SSID and Password of your WiFi router
const char* ssid = "yourssid";
const char* password = "XYZ";
ESP8266WebServer server(80);
#define PWM1_pin 2  //D4

void handlePWM() {
    analogWriteFreq(500);
    String pwm1Value = server.arg("PWM1_val");
        int val1 = pwm1Value.toInt();
            val1 = constrain(val1, 0, 1023);         // PWM-Wert- Bereich festlegen
            analogWrite(PWM1_pin, (300-val1));       // Ausgabe des PWM-Signals (invertiert - wegen D4 Logik)
            Serial.print("PWM1-Wert: ");
            Serial.println(val1);
 
    server.send(200,"text/plain","0");               // handling the webpage update
}
void setup() {
    Serial.begin(9600);
    delay(1000);
    Serial.println();
    Serial.println("_______________________________");
    Serial.println(__FILE__);                       // Dateiname
    Serial.println(__DATE__);                       // Erstellungsdatum
    Serial.println(__TIME__);                       // Erstellungszeitpunkt
    Serial.println("_______________________________");
    Serial.println("Projekt_XY");                   // Projektname
    Serial.println("Start: --- "); 
    Serial.println("_______________________________");
    Serial.println("Server listening");
    Serial.print("  Freier Speicher: ");
    Serial.print(ESP.getFreeHeap());
    Serial.println(" Bytes");
    Serial.println("_______________________________");
    WiFi.begin(ssid, password);                     //Connect to your WiFi router
    Serial.println("");
    while (WiFi.status() != WL_CONNECTED) {         //Wait for connection
    delay(500);
    Serial.println("Waiting to connect?");
    }
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());                 // Print the local IP

    pinMode(2, OUTPUT); 
    analogWrite(PWM1_pin,300);                      // chaning the value on the NodeMCU board

    server.on("/", handleRoot);                     // Associate the handler function to the path
    server.on("/setPWM", handlePWM);                // handles the PWM values
    server.on("/canvasslider.js", handleJS);
    server.begin();                               // Start the server

    Serial.println("HTTP server started");
}
void loop() {
    server.handleClient();                           // Handling of incoming requests
}
void handleRoot() {
     server.send(200, "text/html", html_page);
}
void handleJS() {
    Serial.println("Handling JavaScript request..."); // Debugging-Ausgabe
    
    server.sendHeader("Content-Type", "application/javascript");
    server.send(200, "application/javascript", canvasslider_js);

    Serial.println("JavaScript file sent."); // Debugging-Ausgabe nach dem Senden der Datei
}

const char html_page[] PROGMEM = R"=====(
<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <meta charset="UTF-8">
    <title>Canvas PWM Slider</title>
    <style>
             * { box-sizing: border-box;}
             body {
                font: cousine; 
                margin: 30px; padding: 0 0 50px; 
                color: #333; 
                font-size: 14px; 
                line-height: 1.6em;
             }
             canvas {
                 border: 1px solid #000; 
             } 
    </style>
    
          <script type="text/javascript" src="/canvasslider.js"></script> 

</head>

<body>

  <h3>Canvas Slider </h3>
  <canvas id="myCanvas1" title="slider1" style="cursor: pointer;" width="800" height="80"></canvas>
 
     <script>
       window.onload = function(e){
          var CS1 = new CanvasSlider({
          canvas: "myCanvas1", range: {min: 0, max: 300, count: 11}, 
          start: [0], 
          snapToTicks: true, 
          showLabels: true,
          showMajorTicks: true, 
          showMinorTicks: false, 
          showToolTip: true,
          onChange: function(i, val) {
          console.log("onChange slider1: ", i, val)
          sendSliderValueToServer(val);
          }, 
          format: {decimals: 0, prefix: "PWM ", suffix: ""},  
          baseColor: {h: 40, s: 80, v: 90},
          handle: {shape: "rectangle", w: 20, h: 20, hue: 60}             // hue: Knopffarbe
          });

 function sendSliderValueToServer(sliderValue) {
                var xhttp = new XMLHttpRequest();
                xhttp.onreadystatechange = function() {
                    if (this.readyState == 4 && this.status == 200) {
                        console.log("Slider value sent successfully");
                    }
                };
                xhttp.open('GET', '/setPWM?PWM1_val=' + sliderValue, true);
                xhttp.send();
         }   
        };
    </script>
</body>
</html>
)=====";

const char canvasslider_js[] PROGMEM = R"=====(

// Hier Inhalt der Datei canvasslider.js einfügen.

)=====";

Hey danke fürs teilen und auch schöne Festtage.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.