Daten in SPIFFS speichern und per http server (html) verändern und auslesen

lukcraft:
Die zahlen sollten alle nicht über 2 Milliarden gehen nicht mehr aber weniger.

Also sind es 5 Zahlen, nicht 2,000,000,000 Zahlen.

Schreiben und Lesen sollte in den Beispielen der Lib zu finden sein.

Gruß Tommy

@Tommy ups ja genau 5 zahlen

5 verschiedene Zahlen

Alle diese Zahlen beinhalten bis zu
2.000.000.000
STELLEN also zum Beispiel:
Wert 1 = 45.780
Wert 2 = 199.999.000
Wert 3 = 12
Wert 4 = 300
Wert 5 = 2.000.000.000

Jeder Wert bekommt eine eigene Webseite über die dieser Wert verändert werden kann.
Website 1: mit dieser kann Wert 1 bearbeitet werden
Website 2
usw....

Und da ich noch ein totaler Anfänger bin (Javascript usw...) habe ich mich an euch gewandt.

lukcraft:
Ich weis nicht wie das in diesem Forum gehandhabt wird von mir aus kann man die Narichten löschen der übersichts Willen ...

Ist hier nicht vorgesehen, dadurch kann man den Fortgang auch besser nachvollziehen.

lukcraft:
2. Und vorallen Wie die Daten/Zahlen auf einer Website ausgegeben und verändert werden können.

Die Beispiele bme280 und onboardled von Fips zeigen, wie das geht. Die html-Datei fordert über ein Formular ein Datenpaket im JSON-Format an und verändert dann die Anzeige im Browser.

Hallo
Der spi fram ist jetzt endlich gekommen.
Ich habe mich schon mit ihm beschäftigt, komme aber nicht wirklich weiter (ich kann nichts mit den Beispielen von der Bibliothek anfangen.

Lg Lukcraft

Das Beispiel ist für einen Arduino UNO. Du musst die Pins entsprechend anpassen.
Du brauchst auch die "Adafruit BusIO"-Lib dazu.
Beide Libs haben architectures=*. Ob sie aber auf dem ESP laufen, weiß ich nicht.

Gruß Tommy

Also die Beispiele habe ich zum laufen bekommen.

Gibt es andere Libraries die für den esp32 sind ? Ich habe keine gefunden oder nach etwas falschem gesucht.

Lg Lukcraft

Na, wenn Du die Beispiele auf dem ESP zum Laufen bekommen hast, ist ja alles bestens.
Du brauchs die Methoden write und read (nicht die write8 und read8)

Pseudocode:

fram.write(Adresse,variable,sizeof(variable));
fram.read(Adresse,&variable,sizeof(variable));

Die Adressen sollten genügend Abstand haben, damit Deine Variablen rein passen. Lass Dir zur Sicherheit vor dem Schreiben einfach mal sizeof(variable) ausgeben.

Gruß Tommy

lukcraft:
Gibt es andere Libraries die für den esp32 sind ?

Auch für ESP32 mit spannenden Fußnoten: GitHub - Marzogh/SPIMemory: Arduino library for Flash Memory Chips (SPI based only). Formerly SPIFlash

So ich habe jetzt schon einiges ausprobiert und bleibe jetzt an etwas hängen von dem ich denke das führt zur lösung :slight_smile:
Ich würde es gerne so machen das wen man den geldwert verändert (mit einem knopf den man drückt) das nicht gleich die ganze Seite neu geladen wird.

Das ganze funktioniert auch teilweise nämlich die Webseite mit den Knöpfen wird angezeigt aber es kommt nichts am esp32 an.

Ich habe mal den wichtigen teil von der Arduino IDE hier (es wird kein fehler angezeigt)

uint16_t geld = fram.read8(0x40);

void setupgeld() {
  if (fram.begin()) {
    Serial.println("Found SPI FRAM");
  } else {
    Serial.println("No SPI FRAM found ... check your connections\r\n");
    while (1);
  }
  
  
  // Button Namen senden falls diese nicht im LocalStorage des Browsers gefunden werden
  server.on("/pressplus", HTTP_POST, []() {
    if (server.args()) {
      // fram plus 1
      uint16_t geld = fram.read8(0x40);
      
      fram.writeEnable(true);
      fram.write8(0x40,geld+1);
      fram.writeEnable(false);
      
      // Serielle Ausgabe zur Kontrolle
      Serial.print("Du hast "); Serial.print(geld); Serial.println(" Euro");
    }
  });

    server.on("/pressminus", HTTP_POST, []() {
    if (server.args()) {
      // fram minus 1
      uint16_t geld = fram.read8(0x40);
      
      fram.writeEnable(true);
      fram.write8(0x40,geld-1);
      fram.writeEnable(false);
      
      // Serielle Ausgabe zur Kontrolle
      Serial.print("Du hast "); Serial.print(geld); Serial.println(" Euro");
    }
  });
}

und hier die html die im spiffs hochgeladen wird. (Ich benutze die tabs von Fips und versuche auch dieses Projekt dort zu intigrieren)

<!DOCTYPE HTML>
<html lang="de">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="style32.css">
	<title>Geldsteuerung</title>
    <script>
      function sendplus(arg) {
        fetch('/pressplus', {
          method: 'post',
          body: arg
        }).then(resp => {
          return resp.json();
        }).then(str => {
		  if (str.length != btnName.length) localStorage.clear();
          document.querySelectorAll('button').forEach((el, i) => {
		    el.style.minWidth = 0.8 * length + 'em';
		    el.style.backgroundColor = str[i] != 0 ? '#3f0' : '#6c5';
		    el.lastElementChild.innerHTML = str[i] != 0 ? ' AN' : ' AUS';
		  });
        });
      } 
	  function sendminus(arg) {
        fetch('/pressminus', {
          method: 'post',
          body: arg
        }).then(resp => {
          return resp.json();
        }).then(str => {
		  if (str.length != btnName.length) localStorage.clear();
          document.querySelectorAll('button').forEach((el, i) => {
		    el.style.minWidth = 0.8 * length + 'em';
		    el.style.backgroundColor = str[i] != 0 ? '#3f0' : '#6c5';
		    el.lastElementChild.innerHTML = str[i] != 0 ? ' AN' : ' AUS';
		  });
        });
      } 
	  document.getElementById("plus").addEventListener('DOMContentLoaded1', () => {sendplus();});
	  document.getElementById("minus").addEventListener('DOMContentLoaded2', () => {sendminus();});
    </script>
  </head>
  <body>
    <h1>Geldsteuerung</h1>
	<p><button id="plus">plus1</button></p>
	<p><button id="minus">minus1</button></p>
  </body>
</html>

Ich hoffe ihr könnt was damit anfangen :confused:

lukcraft:
Das ganze funktioniert auch teilweise nämlich die Webseite mit den Knöpfen wird angezeigt aber es kommt nichts am esp32 an.

Kann auch nicht, es wird nichts gesendet.
Öffne die Konsole im Browser, dann wird dir ein Fehler angezeigt.

Ansonsten, sendet dein Webserver keine Antwort an den Browser und diese versuchts du mittels Javascript auszuwerten.

Gruß Fips

Ich habe jetzt alles denkbare ausprobiert unter anderem versucht das die Antwort gesendet wird (verstehe aber nicht ganz was da gesendet wird und wie) und komme jetzt wirklich nicht weiter.
Ich brauche irgendwelche nützlich Beispiele finde aber keine die mir bei der Sache weiter helfen.
Ich würde mich wirklich freuen wenn mir jemand erklären könnte wie das ganze gesendet und ausgelesen wird :slight_smile:

Hier nochmal mein jetzigen Code der nicht wirklich funktioniert:

der in der Arduino IDE als Tab in dem Grundgerüst von Fips
ich habe den Admintab von Fips umgebaut:

#include <SPI.h>
#include "Adafruit_FRAM_SPI.h"

uint8_t FRAM_CS = 14;

//Adafruit_FRAM_SPI fram = Adafruit_FRAM_SPI(FRAM_CS);  // use hardware SPI

uint8_t FRAM_SCK= 13;
uint8_t FRAM_MISO = 12;
uint8_t FRAM_MOSI = 27;
//Or use software SPI, any pins!
Adafruit_FRAM_SPI fram = Adafruit_FRAM_SPI(FRAM_SCK, FRAM_MISO, FRAM_MOSI, FRAM_CS);

uint16_t          addr = 0;

uint16_t geld= fram.read8(0x40);

void geld() {                          // Funktionsaufruf "admin();" muss im Setup eingebunden werden
  if (fram.begin()) {
    Serial.println("Found SPI FRAM");
  } else {
    Serial.println("No SPI FRAM found ... check your connections\r\n");
    while (1);
  }
  server.on("/geld/renew", handlerenewgeld);
  server.on("/geld/once", handleoncegeld);

}
void handlerenewgeld() {
  server.send(200, "application/json");     // Json als Array
}

void handleoncegeld() {
  if (server.arg(0) != "") {
    uint16_t geldneu= (server.arg(0).c_str();
    fram.writeEnable(true);    
    fram.write8(0x40,geld+geldneu);
    fram.writeEnable(false);
    //serielle Ausgabe
    uint16_t geld= fram.read8(0x40);
    Serial.print("Du hast "); Serial.print(geld); Serial.println(" Euro");
  }
  String fname = String(__FILE__).substring( 3, String(__FILE__).lastIndexOf ('\\'));
  String temp = R"({"Kontostand":")" + fram.read8(0x40) + R"("})";
  server.send(200, "application/json", temp);     // Json als Objekt
}

und die HTML im SPIFFS umgebaut von Fip´s Admin Webseite:

<!DOCTYPE HTML> <!-- For more information visit: https://fipsok.de -->
<html lang="de">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="style32.css">
    <title>ESP32 Admin</title>
    <SCRIPT>
      window.addEventListener('load', () => {
        document.querySelector('#hostbutton').addEventListener('click', check.bind(this, document.querySelector('input')));
        once();
        var output = document.querySelector('#note');
        function once(arg1, arg2) {
          fetch('/admin/once', {
            method: 'POST',
            body: arg1
          }).then( resp => {
            return resp.json();
          }).then( obj => {
            output.innerHTML = '';
            output.classList.remove('note');
            document.querySelector('form').reset();
            if (arg1 == undefined) wait = window.setInterval(renew, 1000);
            if (arg2 == 'reconnect') re(arg2);
            document.querySelector('#host').innerHTML = obj['Kontostand'];
          }).catch(function (err) {
            re();
          });
        }
        function renew() {
          fetch('admin/renew').then( resp => {
            return resp.json();
          });
        }
        function check(inObj) {
          !inObj.checkValidity() ? (output.innerHTML = inObj.validationMessage, output.classList.add('note')) : (once(inObj.value, 'reconnect'));
        }
        function re(arg) {
          window.clearInterval(wait);
          fetch(arg);
          output.classList.add('note');
          if (arg == 'restart') {
            output.innerHTML = 'Der Server wird neu gestartet. Die Daten werden in 10 Sekunden neu geladen.';
            setTimeout(once, 10000);
          } else if (arg == 'reconnect') {
            output.innerHTML = 'Zum Konto hinzugefügt';
            setTimeout(once, 900);
          } else {
            output.innerHTML = 'Es ist ein Verbindungfehler aufgetreten. Es wird versucht neu zu verbinden.';
            setTimeout(once, 2000);
          }
        }
      });
    </SCRIPT>
  </head>
  <body>
    <h1>ESP32 Admin Page</h1>
    <main>
      <section id="left">
        <span>Kontostand:</span>
      </section>
      <section>
		  <data id="host">?</data>
      </section>
    </main>
    <div id="note"></div>
    <div>
      <form><input placeholder=" neuer Hostname" pattern="([A-Za-z0-9-]{1,32})" title="Hier Geldbertrag eintragen" required>
        <button class="button" type="button" id="hostbutton">Betrag Senden</button>
      </form>
    </div>
  </body>
</html>

Dein Javascript sendet an '/admin/once' und im Sketch hoffst du das es bei "/geld/once" ankommt.

Vielleicht solltest du es lieber ohne Javascript, mit einen einfachen Html Formular umsetzen.

Ansonsten, wirf mal einen Blick in die Anleitung von Rentner wie es mit Fetch funktioniert.

Gruß Fips

Vielen Dank für eure Hilfe jetzt hat ALLES geklappt! ;D
Jetzt wäre nur noch eine Sache ich kann jetzt nur Zahlen bis 255 eingeben,
durch z.B. fram.write8(0x40, wert2); gehen ja nicht mehr und ich bekomme es nicht anders hin
nur fram.write(0x40, wert2); ergibt eine fehlermeldung und fram.write(Adresse,variable,sizeof(variable));
weiß ich nicht wie ich das einsetzen soll. :cold_sweat:

#include <SPI.h>
#include "Adafruit_FRAM_SPI.h"

uint8_t FRAM_CS = 14;

//Adafruit_FRAM_SPI fram = Adafruit_FRAM_SPI(FRAM_CS);  // use hardware SPI

uint8_t FRAM_SCK= 13;
uint8_t FRAM_MISO = 12;
uint8_t FRAM_MOSI = 27;
//Or use software SPI, any pins!
Adafruit_FRAM_SPI fram = Adafruit_FRAM_SPI(FRAM_SCK, FRAM_MISO, FRAM_MOSI, FRAM_CS);


float wert1;
float wert2;

void geld() {                          // Funktionsaufruf "geld();" muss im Setup eingebunden werden
  if (fram.begin()) {
    Serial.println("Found SPI FRAM");
  } else {
    Serial.println("No SPI FRAM found ... check your connections\r\n");
    while (1);
  }
      fram.writeEnable(true);    
      //fram.write8(0x40,geld-400);
      wert1 = fram.read8(0x40);
      fram.writeEnable(false);
}

void Datenzeigen() {
  String message = "Daten angekommen\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  Serial.println(message);
}

void sendeDaten() {
  char sendbuffer[50];

  // JSON String als Array anlegen ["20.0","572.6","24.0"]
  sprintf(sendbuffer, "[\"%4.1f\"]", wert1);
  server.send(200, "application/json", sendbuffer);
  Serial.println(sendbuffer);
  Serial.println(strlen(sendbuffer));
}

void getSollw() {
  Datenzeigen();
  wert2 = StringToFloat(server.arg(0));
  delay(10);
    fram.writeEnable(true);
    fram.write8(0x40, wert2);
    
  Serial.println("neue Sollwerte");
  Serial.printf("%4.1f \n", fram.read8(0x40));
  fram.writeEnable(false);
  delay(10);
  fram.writeEnable(true);    
      //fram.write8(0x40,geld-400);
      wert1 = fram.read8(0x40);
      fram.writeEnable(false);
  sendeDaten(); // response senden.
}

void getSollw2() {
  
}

// ----- String to float mit Komma tausch -----------
float StringToFloat(String t) {
  t.replace(",", ".");
  return t.toFloat();
}

lukcraft:
fram.write(Adresse,variable,sizeof(variable));
weiß ich nicht wie ich das einsetzen soll. :cold_sweat:

So wie es da steht:

int wert2 =12345;
...
fram.write(0x40,wert2,sizeof(wert2));
...
fram.read(0x40,&wert2,sizeof(wert2));

Gruß Tommy

Ich habe das jetzt eingesetzt und es kommt die Fehlermeldung

C:\Users\heiko\Documents\Arduino\Webserver\Geld.ino: In function 'void geld()':

Geld:30:50: error: no matching function for call to 'Adafruit_FRAM_SPI::read(int, int*, unsigned int)'

       wert1 = fram.read(0x40,&wert2,sizeof(wert2));

                                                  ^

In file included from C:\Users\heiko\Documents\Arduino\Webserver\Geld.ino:3:0:

C:\Users\heiko\Documents\Arduino\libraries\Adafruit_FRAM_SPI/Adafruit_FRAM_SPI.h:54:10: note: candidate: void Adafruit_FRAM_SPI::read(uint32_t, uint8_t*, size_t)

   void   read(uint32_t addr, uint8_t *values, size_t count);

          ^

C:\Users\heiko\Documents\Arduino\libraries\Adafruit_FRAM_SPI/Adafruit_FRAM_SPI.h:54:10: note:   no known conversion for argument 2 from 'int*' to 'uint8_t* {aka unsigned char*}'

C:\Users\heiko\Documents\Arduino\Webserver\Geld.ino: In function 'void getSollw()':

Geld:64:40: error: invalid conversion from 'int' to 'uint8_t* {aka unsigned char*}' [-fpermissive]

     fram.write(0x40,wert2,sizeof(wert2));

                                        ^

In file included from C:\Users\heiko\Documents\Arduino\Webserver\Geld.ino:3:0:

C:\Users\heiko\Documents\Arduino\libraries\Adafruit_FRAM_SPI/Adafruit_FRAM_SPI.h:52:10: note:   initializing argument 2 of 'void Adafruit_FRAM_SPI::write(uint32_t, uint8_t*, size_t)'

   void   write(uint32_t addr, uint8_t *values, size_t count);

          ^

Geld:67:64: error: no matching function for call to 'Adafruit_FRAM_SPI::read(int, int*, unsigned int)'

   Serial.printf("%4.1f \n", fram.read(0x40,&wert2,sizeof(wert2));

                                                                ^

In file included from C:\Users\heiko\Documents\Arduino\Webserver\Geld.ino:3:0:

C:\Users\heiko\Documents\Arduino\libraries\Adafruit_FRAM_SPI/Adafruit_FRAM_SPI.h:54:10: note: candidate: void Adafruit_FRAM_SPI::read(uint32_t, uint8_t*, size_t)

   void   read(uint32_t addr, uint8_t *values, size_t count);

          ^

C:\Users\heiko\Documents\Arduino\libraries\Adafruit_FRAM_SPI/Adafruit_FRAM_SPI.h:54:10: note:   no known conversion for argument 2 from 'int*' to 'uint8_t* {aka unsigned char*}'

Geld:72:50: error: no matching function for call to 'Adafruit_FRAM_SPI::read(int, int*, unsigned int)'

       wert1 = fram.read(0x40,&wert2,sizeof(wert2));

                                                  ^

In file included from C:\Users\heiko\Documents\Arduino\Webserver\Geld.ino:3:0:

C:\Users\heiko\Documents\Arduino\libraries\Adafruit_FRAM_SPI/Adafruit_FRAM_SPI.h:54:10: note: candidate: void Adafruit_FRAM_SPI::read(uint32_t, uint8_t*, size_t)

   void   read(uint32_t addr, uint8_t *values, size_t count);

          ^

C:\Users\heiko\Documents\Arduino\libraries\Adafruit_FRAM_SPI/Adafruit_FRAM_SPI.h:54:10: note:   no known conversion for argument 2 from 'int*' to 'uint8_t* {aka unsigned char*}'

Mehrere Bibliotheken wurden für "Adafruit_FRAM_SPI.h" gefunden
 Benutzt: C:\Users\heiko\Documents\Arduino\libraries\Adafruit_FRAM_SPI
 Nicht benutzt: C:\Users\heiko\Documents\Arduino\libraries\Adafruit_FRAM_SPI-master
Mehrere Bibliotheken wurden für "WebServer.h" gefunden
 Benutzt: C:\Users\heiko\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\WebServer
 Nicht benutzt: C:\Users\heiko\Documents\Arduino\libraries\WebServer_tng-master
Mehrere Bibliotheken wurden für "WiFi.h" gefunden
 Benutzt: C:\Users\heiko\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\WiFi
 Nicht benutzt: C:\Program Files (x86)\Arduino\libraries\WiFi
Mehrere Bibliotheken wurden für "SPIFFS.h" gefunden
 Benutzt: C:\Users\heiko\Documents\Arduino\libraries\SPIFFS
 Nicht benutzt: C:\Users\heiko\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\SPIFFS
exit status 1
no matching function for call to 'Adafruit_FRAM_SPI::read(int, int*, unsigned int)'

Dann musst Du casten:

fram.write(0x40,(uint8_t *)&wert2,sizeof(wert2));
...
fram.read(0x40,(uint8_t *)&wert2,sizeof(wert2));

Gruß Tommy

Edit: cast geändert

@Tommy56 Danke für deine superschnellen antworten :slight_smile:

es kommt aber leider immer noch eine Fehlermeldung
mir der ich überhaupt nichts anfangen kann

C:\Users\heiko\Documents\Arduino\Webserver\Geld.ino: In function 'void geld()':

Geld:29:39: error: expected primary-expression before ')' token

       wert1 = fram.read(0x40,(*uint8_t)&wert2,sizeof(wert2));

                                       ^

C:\Users\heiko\Documents\Arduino\Webserver\Geld.ino: In function 'void getSollw()':

Geld:63:30: error: expected primary-expression before ')' token

     fram.write(0x40,(*uint8_t)&wert2,sizeof(wert2));

                              ^

Geld:66:53: error: expected primary-expression before ')' token

   Serial.printf("%4.1f \n", fram.read(0x40,(*uint8_t)&wert2,sizeof(wert2)));

                                                     ^

Geld:71:39: error: expected primary-expression before ')' token

       wert1 = fram.read(0x40,(*uint8_t)&wert2,sizeof(wert2);

                                       ^

Geld:71:60: error: expected ')' before ';' token

       wert1 = fram.read(0x40,(*uint8_t)&wert2,sizeof(wert2);

                                                            ^

Mehrere Bibliotheken wurden für "WiFi.h" gefunden
 Benutzt: C:\Users\heiko\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\WiFi
 Nicht benutzt: C:\Program Files (x86)\Arduino\libraries\WiFi
Mehrere Bibliotheken wurden für "SPIFFS.h" gefunden
 Benutzt: C:\Users\heiko\Documents\Arduino\libraries\SPIFFS
 Nicht benutzt: C:\Users\heiko\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\SPIFFS
Mehrere Bibliotheken wurden für "Adafruit_FRAM_SPI.h" gefunden
 Benutzt: C:\Users\heiko\Documents\Arduino\libraries\Adafruit_FRAM_SPI
 Nicht benutzt: C:\Users\heiko\Documents\Arduino\libraries\Adafruit_FRAM_SPI-master
Mehrere Bibliotheken wurden für "WebServer.h" gefunden
 Benutzt: C:\Users\heiko\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\WebServer
 Nicht benutzt: C:\Users\heiko\Documents\Arduino\libraries\WebServer_tng-master
exit status 1
expected primary-expression before ')' token

Das hatte ich noch korrigiert. Schau noch mal in mein Posting #35.

Gruß Tommy

Och ne sorry es geht immer noch nicht :sweat_smile:

#include <SPI.h>
#include "Adafruit_FRAM_SPI.h"

uint8_t FRAM_CS = 14;

//Adafruit_FRAM_SPI fram = Adafruit_FRAM_SPI(FRAM_CS);  // use hardware SPI

uint8_t FRAM_SCK= 13;
uint8_t FRAM_MISO = 12;
uint8_t FRAM_MOSI = 27;
//Or use software SPI, any pins!
Adafruit_FRAM_SPI fram = Adafruit_FRAM_SPI(FRAM_SCK, FRAM_MISO, FRAM_MOSI, FRAM_CS);


float wert1;

int wert2 =12345;

void geld() {                          // Funktionsaufruf "geld();" muss im Setup eingebunden werden
  if (fram.begin()) {
    Serial.println("Found SPI FRAM");
  } else {
    Serial.println("No SPI FRAM found ... check your connections\r\n");
    while (1);
  }
      fram.writeEnable(true);    
      //fram.write8(0x40,geld-400);
      wert1 = fram.read(0x40,(uint8_t *)&wert2,sizeof(wert2));
      fram.writeEnable(false);
}

void Datenzeigen() {
  String message = "Daten angekommen\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  Serial.println(message);
}

void sendeDaten() {
  char sendbuffer[50];

  // JSON String als Array anlegen ["20.0","572.6","24.0"]
  sprintf(sendbuffer, "[\"%4.1f\"]", wert1);
  server.send(200, "application/json", sendbuffer);
  Serial.println(sendbuffer);
  Serial.println(strlen(sendbuffer));
}

void getSollw() {
  Datenzeigen();
  wert2 = StringToFloat(server.arg(0));
  delay(10);
    fram.writeEnable(true);
    fram.write(0x40,(uint8_t *)&wert2,sizeof(wert2));
    
  Serial.println("neue Sollwerte");
  Serial.printf("%4.1f \n", fram.read(0x40,(uint8_t *)&wert2,sizeof(wert2)));
  fram.writeEnable(false);
  delay(10);
  fram.writeEnable(true);    
      //fram.write8(0x40,geld-400);
      fram.read(0x40,(uint8_t *)&wert2,sizeof(wert2));
      fram.writeEnable(false);
  sendeDaten(); // response senden.
}

void getSollw2() {
  
}

// ----- String to float mit Komma tausch -----------
float StringToFloat(String t) {
  t.replace(",", ".");
  return t.toFloat();
}

mit der Fehlermeldung:

C:\Users\heiko\Documents\Arduino\Webserver\Geld.ino: In function 'void geld()':

Geld:30:13: error: void value not ignored as it ought to be

       wert1 = fram.read(0x40,(uint8_t *)&wert2,sizeof(wert2));

             ^

C:\Users\heiko\Documents\Arduino\Webserver\Geld.ino: In function 'void getSollw()':

Geld:67:76: error: invalid use of void expression

   Serial.printf("%4.1f \n", fram.read(0x40,(uint8_t *)&wert2,sizeof(wert2)));

                                                                            ^

Mehrere Bibliotheken wurden für "WiFi.h" gefunden
 Benutzt: C:\Users\heiko\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\WiFi
 Nicht benutzt: C:\Program Files (x86)\Arduino\libraries\WiFi
Mehrere Bibliotheken wurden für "SPIFFS.h" gefunden
 Benutzt: C:\Users\heiko\Documents\Arduino\libraries\SPIFFS
 Nicht benutzt: C:\Users\heiko\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\SPIFFS
Mehrere Bibliotheken wurden für "Adafruit_FRAM_SPI.h" gefunden
 Benutzt: C:\Users\heiko\Documents\Arduino\libraries\Adafruit_FRAM_SPI
 Nicht benutzt: C:\Users\heiko\Documents\Arduino\libraries\Adafruit_FRAM_SPI-master
Mehrere Bibliotheken wurden für "WebServer.h" gefunden
 Benutzt: C:\Users\heiko\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\WebServer
 Nicht benutzt: C:\Users\heiko\Documents\Arduino\libraries\WebServer_tng-master
exit status 1
void value not ignored as it ought to be

Ich habe keine SPI-FRAM, nur I2C. Deshalb kann ich nur blind schreiben. Das, was Du schreibst, kommt aber nicht von mir.

fram.read(0x40,(uint8_t *)&wert1,sizeof(wert1));

Gruß Tommy