Hallo zusammen,
für ein Projekt habe ich einen ESP32-C3 als Access Point eingerichtet. Über WLAN sendet er an den Client (PC, Smartphone) die Messdaten eines Sensors. Die Daten werden graphisch mit dem highcharts.js Script aufbereitet. Solange ich das Script aus der Internet-Quelle (https://code.highcharts.com/highcharts.js) lade funktioniert am PC alles einwandfrei, da ich Kabel und WLAN benutzen kann. Sobald ich auf das Smartphone gehe, habe ich natürlich nur noch eine WLAN-Verbindung zum ESP32 und kann das Script nicht mehr aus dem Internet nachladen. Daher kam mir die Idee, das Script in den SPIFFS zu laden und von dort zu starten. Ich schaffe es allerdings nicht den Code so modifizieren, dass das Script von dort geladen wird. Im HTML-Teil gebe ich als Script-Quelle an:
<script src="highcharts.js"></script>
Eventuell fehlt hier ein "/"? Bringt mich aber erstmal auch nicht zum Ziel.
Im Sketch versuche ich das Script über
void handleScript() {
server.send(200, text/script, "/highcharts.js")
}
void setup() {
...
server.on("highcharts.js", handleScript);
...
}
zu laden.
Als Bibliotheken im Sketch habe ich geladen:
- WebServer.h
- WiFi.h
- WiFiClient.h
- SPIFFS.h
Ich habe beim Googlen etliche Beispiel mit AsyncWebServer gefunden. Das bringt mich aber auch nicht ans Ziel.
Grüße und vielen Dank für die Hilfe im Voraus!
Bei Bedarf kann ich natürlich den gesamten Code teilen. 
Nö, WebServer ist schon ok. Schau Dir mal die Seite von Fips an.
Evtl. zusätzlich die Einführung von @agmue dazu.
Gruß Tommy
mit deinem Codeschnippsel sehe ich nur dass du einen Text "/highchardts.js" an den Client sendest:
void handleScript() {
server.send(200, text/script, "/highcharts.js")
}
da wird meines Erachtens also nicht vom SPIFFS gelesen.
Nach welchem Beispiel für das lesen von SPIFFS und ausgeben an den Client gehst du konkret vor?
Bitte verlinke es.
Du sollst immer ein compilierbaren Code posten inkl. aller Abhängigkeiten.
Ich liefere mal den Code nach.
Da ist zwar noch etliches drin, das ich aktuell nicht mehr brauche, aber gut.Den HTML-Teil lasse ich jetzt mal weg, da er funktioniert. 
#include <WebServer.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <SPIFFS.h>
//Defs capa sensor start
#define PIN_ANALOG 1
#define PIN_CHARGE 7
#define PIN_DISCHARGE 4 // speeds up discharging process, not necessary though
const int resistorValue = 10000; // init resistor value
unsigned long startTime, elapsedTime;
float microFarads, nanoFarads;
float rHumidity;
String naFarads;
String rHum;
//Defs sensor end
//Defs network start
const char* ssid = "HumiditySensor"; // Enter SSID here
//const char* password = "humidity"; //Enter Password here
//Defs Network End
// HTML start
const char indexHTML[] PROGMEM = R"=====(
[...]
)=====" ;
//HTML end
WebServer server(80);
IPAddress apIP(192, 168, 4, 32);
void handleRoot() {
String s = indexHTML; //Read HTML contents
server.send(200, "text/html", s); //Send web page
}
void handleHumid() {
int a = rHumidity;
String rHum = String(a);
server.send(200, "text/plain", rHum); //Send humidity on request
}
void handleCapa() {
int b = nanoFarads;
String naFarads = String(b);
server.send(200, "text/plain", naFarads); //Send capacity on request
}
void handleScript() {
server.send(SPIFFS, "/highcharts.js");
}
void setup()
{
//Capa-Sensor setup start
pinMode(PIN_CHARGE, OUTPUT);
digitalWrite(PIN_CHARGE, LOW);
//Capa-Sensor setup end
Serial.begin(115200); //
Serial.print("");
if (!SPIFFS.begin()) {
Serial.println("SPIFFs not mounted");
}
else {
Serial.println("SPIFFs ready");
}
//Network setup start
WiFi.mode(WIFI_AP);
WiFi.softAP(ssid); // Name und Passwort des Wi-Fi Netzes
WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
Serial.print("Netzwerkname: ");
Serial.println(ssid);
Serial.println(apIP);
server.on("/", handleRoot); //This is display page
server.on("/humidity", handleHumid); //To get update of humidity
server.on("/capacity", handleCapa); //To get update of capacity
server.on("/highcharts.js", handleScript);
server.begin();
Serial.println("HTTP Server gestartet");
//Network setup end
}
void loop()
{
//Capa measurement start
digitalWrite(PIN_CHARGE, HIGH); // Begins charging the capacitor
startTime = micros(); // Begins the timer
while(analogRead(PIN_ANALOG) < 2700) {
// Does nothing until capacitor reaches 63.2% of total voltage
}
elapsedTime = micros() - startTime; // Determines how much time it took to charge capacitor
microFarads = ((float)elapsedTime / resistorValue);
Serial.print(elapsedTime);
Serial.print(" µs ");
if (microFarads > 1) { // micro or nano farads? -> later nano or femto (resistor must be 1 MOhm or above then)
Serial.print((long)microFarads);
Serial.println(" µF");
//Serial.println(miFarads);
}
else {
nanoFarads = microFarads * 1000.0;
// redundant - only to check data in serial monitor; calculation is done in html/javascript
rHumidity = nanoFarads-50; // formula must be adjusted, when finally known
if (rHumidity < 0) { // values lower than 0 don't make sense
Serial.println("Wert ungültig! Ist kleiner 0 %");
}
else if (rHumidity > 100) { // values above 100 don't make sense; limits have to be set, when final sensor design is known
Serial.println("Wert ungültig! Ist größer 100 %");
}
else {
String nanFarads = String(nanoFarads);
String rHumid = String(rHumidity);
String naFarads = String(nanFarads + " nF");
String rHum = String(rHumid + " % r.H.");
// end redundancy
Serial.println(naFarads);
Serial.println(rHum);
}
delay(1000);
}
digitalWrite(PIN_CHARGE, LOW); // Stops charging capacitor
pinMode(PIN_DISCHARGE, OUTPUT);
digitalWrite(PIN_DISCHARGE, LOW); // Allows capacitor to discharge
while(analogRead(PIN_ANALOG) > 0) {
// Do nothing until capacitor is discharged
}
pinMode(PIN_DISCHARGE, INPUT); // Prevents capacitor from discharging
//Capa measurement end
server.handleClient();
delay(1);
}
Wie bereits geschrieben macht Dein handleScript nicht das, was Du Dir vorstellst.
Hast Du Deine highcharts.js schon ins SPIFFS geladen?
Dann musst Du eine Routine schreiben, die bei Anforderung diese Datei aus dem SPIFFS liest und an den Browser ausliefert.
Das alles findest Du bei Fips. Lesen musst Du es allerdings selbst.
Gruß Tommy
Bin irgendwie zu blöd dafür. Danke trotzdem!
Ich habe zwar jetzt die Möglichkeit
server.serveStatic("/", SPIFFS, "/highcharts.js");
gefunden, das führt aber auch nicht zum Ziel.
Die Datei highcharts.js befindet sich im data-Ordner des Skteches und wird auch ins SPIFFS geladen:
[SPIFFS] data : C:\[...]\Arduino\kapa_mit_berechnung_als_Tabelle_und_Chart-220822-1032\data
[SPIFFS] offset : 0
[SPIFFS] start : 2686976
[SPIFFS] size : 1472
[SPIFFS] page : 256
[SPIFFS] block : 4096
->/highcharts.js
[SPIFFS] upload : C:\[...]\Local\Temp\arduino_build_708435/kapa_mit_berechnung_als_Tabelle_und_Chart-220822-1032.spiffs.bin
[SPIFFS] address: 2686976
[SPIFFS] port : COM6
[SPIFFS] speed : 921600
[SPIFFS] mode : dio
[SPIFFS] freq : 80m
->esptool.py v3.3
->Serial port COM6
->Connecting....
->Chip is ESP32-C3 (revision 3)
->Features: Wi-Fi
->Crystal is 40MHz
->MAC: 58:cf:79:04:3e:b0
->Uploading stub...
->Running stub...
->Stub running...
->Changing baud rate to 921600
->Changed.
->Configuring flash size...
->Auto-detected Flash size: 4MB
->Flash will be erased from 0x00290000 to 0x003fffff...
->Compressed 1507328 bytes to 134167...
->Writing at 0x00290000... (11 %)
[...]
->Writing at 0x00332482... (100 %)
->Wrote 1507328 bytes (134167 compressed) at 0x00290000 in 13.2 seconds (effective 913.9 kbit/s)...
->Hash of data verified.
->
->Leaving...
->Hard resetting via RTS pin...
Grüße
das wäre "eine Anforderung von root, soll aus dem SPIFFS die Datei /highcharts.js liefern".
Imho willst du das nicht.
Ich habe aktuell keinen freien ESP32, aber was passiert bei
server.serveStatic("/highcharts.js", SPIFFS, "/highcharts.js");
?
Fehlt evtl. noch der meta-type ... aber würde mich wundern wenn das nicht auf der Fips-Seite beschrieben wäre ...
Da ist das auch alles beschrieben, incl. einer sinnvollen SPIFFS-Verwaltung. Der TO ignoriert das aber beharrlich (oder versteht es nicht).
Ich gebe es auf.
Gruß Tommy
Das hatte ich auch in handleRoot geschrieben.
Ich denke, der jetzt produzierte Fehler hängt mit was anderem zusammen.
Zumindest Firefox meldet im Debugger einen anderen Fehler. Hängt wohl eher mit meinem HTML zusammen.
Danke an euch beide! Die FIPS-Seite werde ich mir merken!
Grüße