[gelöst] ESP32 Webserver (AP) LED Frequenz u. Tastverhältnis

Ich grüße Euch.

und falle gleich mal mit der Tür ins Haus.
Die Lage:
Ich bin ein Anfänger.
Aber wie bei anderen Fremdsprachen ähnlich, verstehe ich den Code zu großen Teilen, wenn ich ihn sehe. Wenn ich ihn dann anpassen möchte, gibt es immer wieder die kleinen Haken die mir nicht auffallen und nichts funktioniert. Daher erspare ich euch den Code den ich bisher zusammengeknotet habe.
Das Problem ist, dass mit die Zeit für mein Projekt davon läuft.
Ich würde mich sehr freuen, wenn mir jemand nach 3 vergeblichen Monaten bei der Lösung helfen könnte.
Und ja, mir ist klar, dass ein Forum grundsätzlich nur Hilfe zur Selbsthilfe gibt und ich den Großteil selbst machen soll. Nur ist der Grad der Verzweiflung bereits so hoch, dass ich hoffe für das aktuelle Problem einen Helfer zu finden, der sich bereit erklärt das Ganze einmal lauffähig zu programmieren.

Ich denke/hoffe, dass die Lösung auch für nen erfahrenen Einsteiger schon machbar ist.

Hier nur mal grob ein Paar Eckpunke, welche das Projekt umfassen.

Ich muss einen weissen LED-Streifen über nen Verstärker ansteuern.
Dabei soll der ESP32 als Accesspoint eine Weboberfläche bereitstellen, welche die aktuelle LED-Frequenz und das aktuelle Tastverhältnis (PWM) anzeigt.
Daneben sollen jeweils ein Eingabefeld bereitstehen, in welchem ich beide Werte eingeben und ändern kann.
Die Frequenz soll von 0Hz bis ca. 5000Hz und das Tastverhältnis von 0-100% einstellbar sein.
Als Option wäre die Ausgabe einer unkomplizierten Umrechnung der Frequenz in eine andere Größe schön.

Ich hoffe, dass ich hiermit keinem auf den Schlips trete und jemanden finde, der mir helfen würde.

Gruß und Dank, Marc

Naja....ohne Sketch wird die Hilfe schwer.
Einfach mal warten, evtl. fliegt da ja noch mal was rein. :wink:

Hallo,
Na dann schau Dich doch mal auf der Seite von Fips um, da wirst Du schon was finden das man leicht umbauen kann. https://fipsok.de/

oder auch IoT: Datenübertragung mit dem ESP8266 an einen Webserver

Vorschlag gehe das Projekt in Teilaufgaben an.
Erst mal nur die Sache mit den Led´s Dazu kannst Du ja erst mal beide Parameter ( Frequenz und PWM Wert im code vorgeben. Das scheint mit erst mal einfacher und Du kannst noch ein bisschen üben.

Dann packst Du das Thema mit dem Webserver an. Anzeige von den Werten , Versenden der eingegebene Werte ( Form - sende Buton ). Java-Script und fetch geht auch , ist aber für zwei Variable etwas übertrieben.

Heinz

1 Like

Ich sehe es wie der Rentner.
Mach dir einen Plan und gehe Schrittweise vor.
Was mir so adhoc einfällt brauchst du 5 Sachen:

Webserver

  • HTML Eingabeformular für deine zwei Werte
  • webresource am Server, die die Daten vom Eingabeformulare entgegeneben kann (also im Prinzip auch nur eine "Seite" die eben auch die zwei Parameter auslesen kann
  • die Konfiguration als AP (sind dam schluss nur ein paar Zeilen, kannst als letztes machen)

Hardwareansteuerung

  • im einfachsten Fall eine Funktion, der du "Hz" und "Tastverhältnis" übergibst, und dann mit dem LED Streifen macht was es soll

womit du anfängst ist eigentlich egal, ich würde wahrscheinlich mit dem HTML Formular mit dem Webserver Beispiel anfangen und mal das Formular herrichten.
Dann die Übernahme der Werte
Dann die HW ansteuern
und am Schluss eben den AP aktivieren.

Mach dir also Gedanken über deinen Plan, schreib auf was du machen willst und stell dann eine erste konkrete Frage. womit wir dir Helfen sollen.

1 Like

Ok.
Zuerst einmal vielen Dank, dass Ihr euch meiner annehmt.

Da ich nun leider auf den Sprung bin, möchte ich hier den Step1 schonmal mitteilen.
So stelle ich mir die Minimalforderung an die Weboberfläche vor.

<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>LED-FRQ-PWM</title>
  <style>
    html {font-family: Arial; display: inline-block; text-align: center;}
    h2 {font-size: 2.3rem;}
    p {font-size: 1.0rem;}
    body {max-width: 400px; margin:0px auto; padding-bottom: 25px;}
	input {width: 20%;}
  </style>
  
</head>  
<body>

	<h2>Überschrift1</h2>
	<h1>Überschrift2</h1>
	
	<br><br><br>
	
  <!-- Die Frequenz würde ich mit "frq" abkürzen -->
	<p>aktuelle Frequenz: "frq-variable" Hz</p> 
	<label for="frq">neue LED-Frequenz [Hz]</label>
	<input type="text" id="frq" name="frq">
	</form>
	
	<br><br>

  <!-- Das Tastverhältnis würde ich mit "pwm" abkürzen -->
	<p>aktuelles Tastverhältnis: "pwm-variable" %</p>
	<form>
	<label for="pwm">neues Tastverhältnis [%]</label>
	<input type="text" id="pwm" name="pwm">
	</form>
	
	<br><br>

  <!-- Die folgenden Berechnungen habe ich in den [] beschrieben -->
  <!-- Das Ausgebeformat der Berechnung sollte so aussehen: "123,45 km/h" -->

Geschwindigkeiten:
<br><br>
1: [3,6*0,25*(frq/1)]
<br>
2: [3,6*0,25*(frq/2)]
<br>
3: [3,6*0,25*(frq/3)]
<br>
4: [3,6*0,25*(frq/4)]
<br>
5: [3,6*0,25*(frq/5)]
<br>
6: [3,6*0,25*(frq/6)]
<br>
7: [3,6*0,25*(frq/7)]
<br>
8: [3,6*0,25*(frq/8)]
<br>
9: [3,6*0,25*(frq/9)]
<br>

</body>
</html>

SPIFFS oder kein SPIFFS, das ist jetzt die Frage.

Bin gerade mobil am schreiben, daher nicht ganz so ausführlich.

Hmmm soweit ich mich da gerade eingelesen habe, denke ich, dass das nicht nötig ist.
Natürlich aus dem Blick eines Noobs.

Wenn ich das richtig verstanden habe, müsste ich nun die Werte aus den html-Eingabefeldern abfragen und dann bei einer Änderung in die betreffende Variable übertragen.
Aber dabei hatte ich die größten Verständnisprobleme.

Dann schaue Dir als erstes die Beispiele zum Webserver aus Deiner ESP32-Erweiterung in der IDE an.

Gruß Tommy

1 Like

Welches der Beispiele von Fips würde Deinem Anliegen am nächsten kommen?

1 Like

Das mit den Tabs lese ich zum ersten mal. Sehr interessant!
Da muss ich mich heute Abend mal in Ruhe durcharbeiten.

Hallo,
wenn Du die Berechnung der Geschwindigkeiten in den [] Klammern mit einem Java Skript auf der HTML Seite machen willst , dann kannst Du auch überlegen die Daten mit Fetch zu holen und zu senden. Dann kann die HTML Seite statisch sein und dann bietet sich das Filesystem des ESP32 an. Aber es ist wie immer es gibt viele Wege nach Rom.

Heinz

1 Like

Dann nimm einen Send Button dazu , dann kannst Du die Werte ändert und mit mit dem Button die Werte in der Form übertragen.
Heinz

1 Like

Andere Variante: Beschäftige Dich mit der Fetch-API und sende den Wert beim Verlassen des Eingabefeldes. Beipiele bei Fips.

Gruß Tommy

Viel Dank für euren Input.
Ok dann schau ich mir Fetch mal an. Ich bin gespannt.

So, den gestrigen Abend habe ich mich mal mit Fips sehr aufschlussreichen Seite beschäftigt. Vielen Dank für den Hinweis.
Und @agmue : heute sehe ich das mit SPIFFS etwas anders und denke, dass es doch sinnvoller wäre es zu nutzen.

Ich habe die Tabs, welche ich für mein Projekt als nützlich herausgefiltert habe mal zusammengeschoben. Im Prinzip sind das erstmal 1:1 die Tabs von Fips. Ich habe lediglich die benutzten Tabs einkommentiert.

Hier nun die freundliche Fehlermeldung:

C:\...\Webserver\Webserver.ino: In function 'void setup()':
Webserver:53:10: error: 'Spiffs' was not declared in this scope
   Spiffs();
          ^
Webserver:55:9: error: 'Input' was not declared in this scope
   Input();
         ^
Webserver:56:14: error: 'OnBoardLed' was not declared in this scope
   OnBoardLed();
              ^
----------------------------------------------------------------------------------			  

C:\...\Webserver\Webserver.ino: In function 'void loop()':
Webserver:80:10: error: 'Spiffs' was not declared in this scope
   Spiffs();
          ^
Webserver:82:9: error: 'Input' was not declared in this scope
   Input();
         ^
Webserver:83:14: error: 'OnBoardLed' was not declared in this scope
   OnBoardLed();
              ^
----------------------------------------------------------------------------------

C:\...\Webserver\OnBoardLed.ino: In function 'void onboardLed()':
OnBoardLed:29:11: error: 'LED_BUILTIN' was not declared in this scope
   pinMode(LED_BUILTIN, OUTPUT);     // OnBoardLed Esp32
           ^
C:\...\Webserver\OnBoardLed.ino: In lambda function:
OnBoardLed:32:20: error: 'LED_BUILTIN' is not captured
       digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));    // LED umschalten
                    ^
C:\...\Webserver\OnBoardLed.ino:30:23: note: the lambda has no capture-default
   server.on("/bled", []() {
                       ^
C:\...\Webserver\OnBoardLed.ino:29:11: note: '<typeprefixerror>LED_BUILTIN' declared here
   pinMode(LED_BUILTIN, OUTPUT);     // OnBoardLed Esp32
           ^
----------------------------------------------------------------------------------

OnBoardLed:32:46: error: 'LED_BUILTIN' is not captured
       digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));    // LED umschalten
                                              ^
C:\...\Webserver\OnBoardLed.ino:30:23: note: the lambda has no capture-default
   server.on("/bled", []() {
                       ^
C:\...\Webserver\OnBoardLed.ino:29:11: note: '<typeprefixerror>LED_BUILTIN' declared here
   pinMode(LED_BUILTIN, OUTPUT);     // OnBoardLed Esp32
           ^
OnBoardLed:35:48: error: 'LED_BUILTIN' is not captured
     server.send(200, "text/plain", digitalRead(LED_BUILTIN) ? "Aus" : "Ein");
                                                ^
C:\...\Webserver\OnBoardLed.ino:30:23: note: the lambda has no capture-default
   server.on("/bled", []() {
                       ^
C:\...\Webserver\OnBoardLed.ino:29:11: note: '<typeprefixerror>LED_BUILTIN' declared here
   pinMode(LED_BUILTIN, OUTPUT);     // OnBoardLed Esp32
           ^
----------------------------------------------------------------------------------

Mehrere Bibliotheken wurden für "WebServer.h" gefunden
 Benutzt: C:\Users\...\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\WebServer
 Nicht benutzt: C:\Users\...\Documents\Arduino\libraries\WebServer-esp32-master

Mehrere Bibliotheken wurden für "WiFi.h" gefunden
 Benutzt: C:\Users\...\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\WiFi
 Nicht benutzt: C:\Program Files (x86)\Arduino\libraries\WiFi

Mehrere Bibliotheken wurden für "ArduinoOTA.h" gefunden
 Benutzt: C:\Users\...\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\libraries\ArduinoOTA
 Nicht benutzt: C:\Users\...\Documents\Arduino\libraries\ArduinoOTA-master

exit status 1

----------------------------------------------------------------------------------

'Spiffs' was not declared in this scope

----------------------------------------------------------------------------------
----------------------------------------------------------------------------------

// Anmerkungen von mir: 
  - habe diese Bordverwalter-URL eingesetzt: https://dl.espressif.com/dl/package_esp32_index.json
  - Im Bordverwalter das hier installiert: esp32 by Espressif Systems Version 1.0.6
  - Dieses Board ausgewählt: "ESP32 Dev Module"
  - Und diese Tabs von Fips eingefügt und lediglioch die benutzten Tabs Enkommentiert: 	
			- Webserver
			- Connect
			- Input
			- OnBoardLed
			- Spiffs
  - Wenn ich "Spiffs" auskommentiere wird der nächste Tab - glaube "Input" war das - als "was not declared in this scope" ausgewiesen

Hier noch ein Screenshot von Arduino 1.8.15, welcher den Webserver-Code und die eingefügten Tabs zeigt:

Was mache ich falsch? warum sind die Tabs nicht "declared"?

Ich stimme Dir zu!

Meine Auswahl sieht etwas anders aus:

Admin.ino
Connect.ino
ESP_onfocus.ino
Input.ino
OnBoardLed.ino
Spiffs.ino

ESP_onfocus.ino ist mein Name, da Webserver.ino schon anderweitig verwendet.

Anpassungen in ESP_onfocus.ino (bei Dir Webserver.ino):

void setup() {
  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);
  spiffs();
  admin();
  Connect();
  //  setupTime();
  //  espboardLed();
  onboardLed();
  //  bme280();
  //  dht22();                      // Die Tabs die du nutzen möchtest, musst du Einkommentieren
  //  bh1750();
  //  setupSchaltUhr();
  setupModify();

  ArduinoOTA.onStart([]() {
    //save();                       //Einkommentieren wenn Werte vor dem Update gesichert werden sollen
  });
  ArduinoOTA.begin();

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

In OnBoardLed.ino habe ich noch #define LED_BUILTIN 13 ergänzt, dann bekomme ich diese Ausgabe:

C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\cores\esp32\esp32-hal-spi.c: In function 'spiTransferBytesNL':
C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\cores\esp32\esp32-hal-spi.c:922:39: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
                 uint8_t * last_out8 = &result[c_longs-1];
                                       ^
C:\Users\User\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.6\cores\esp32\esp32-hal-spi.c:923:40: warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
                 uint8_t * last_data8 = &last_data;
                                        ^
Der Sketch verwendet 826958 Bytes (63%) des Programmspeicherplatzes. Das Maximum sind 1310720 Bytes.
Globale Variablen verwenden 42896 Bytes (13%) des dynamischen Speichers, 284784 Bytes für lokale Variablen verbleiben. Das Maximum sind 327680 Bytes.

Diese Dateien im Dateisystem:

grafik

Wenn ich input.html aufrufe, kann ich die Werte ändern:

grafik

...Licht am Ende des Tunnels...

Ich kann jetzt auch fehlerfrei kompilieren, aber nur wenn ich "input();" auskommentiere.
Ist es einkommentiert, erhalte ich den Fehler: 'input' was not declared in this scope

Die Dateien für ins Dateisystem kann ich ja erst auf den ESP laden, wenn dieser läuft, richtig?
Oder sollten die Dateien vorher schon in dem Projektordner z.B. in einem speziellen Unterordner auf dem PC abgelegt werden?

Nicht setupModify();?

Ja.

Die Dateien für SPIFFS stehen bei mir im Unterverzeichnis data, hat aber keinen Einfluß.

"input" war mein Fehler. Hab nicht verstanden, dass setupModify das übernimmt. Daher hatte ich getreu des Kommentars "// Die Tabs die du nutzen möchtest, musst du Einkommentieren" den "input" nochmal eingefügt.
Jetzt hab ich den Sketch erfolgreich auf einen ESP32 (Wroom) hochgeladen. Außer nem minütlichen Reebot und einigen für mich unverständlichen Zeilen passiert da im Monitor leider nichts. Ich kann kein Accesspoint namens "ESP32AP" im Wifi finden.
Was mach ich denn nun schon wieder falsch?!

Hier der Monitor-Output:

Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:10944
load:0x40080400,len:6388
entry 0x400806b4
abort() was called at PC 0x401513f3 on core 1

ELF file SHA256: 0000000000000000

Backtrace: 0x40088644:0x3ffb1e40 0x400888c1:0x3ffb1e60 0x401513f3:0x3ffb1e80 0x4015143a:0x3ffb1ea0 0x40150b13:0x3ffb1ec0 0x40150e4a:0x3ffb1ee0 0x40150bb1:0x3ffb1f00 0x400d8467:0x3ffb1f20 0x400d92f2:0x3ffb1f60 0x400d324f:0x3ffb1f80 0x400dc289:0x3ffb1fb0 0x400898d2:0x3ffb1fd0

Rebooting...
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:10944
load:0x40080400,len:6388
entry 0x400806b4