Frage zum Access Point eines ESP8266 - HTML Problem

Hallo zusammen,

ich lese nun schon ein Weile mit und bin auch schon sehr weit gekommen für meine Verhältnisse. Ich bin ein kompletter Neuling auf dem Gebiet Arduino und Programmierung.

Kurz zum Hintergrund, ich habe einen Oldtimer den ich gerne mit einem zusätzlichen E-Lüfter ausstatten will. Derzeit sind analoge Zusatzinstrumente verbaut, die weg sollen. Daher möchte ich Temperaturen wenn ich diese sehen will, auf dem Handy anzeigen lassen können. Aber die "Technik" wird in ner Blackbox versteckt.

Ich habe mein Programm mit einen 2004 LCD auf einem MEGA am laufen, aber wollte nun auf einen Wemos D1 umsteigen wegen der AP und wie schon erwähnt der Anzeige Möglichkeit. Nun habe ich eine Woche benötigt, um mein Programm auf dem D1 ins laufen zu bekommen. Auf dem Monitor läuft es.

Aber leider verstehe ich die HTML Thematik nicht und ich kann mir daher meine Werte nicht auf der Webseite anzeigen lassen. Habe versucht das vorhandene umzubauen, klappt aber leider nicht.

Anbei zeige ich euch mal wie weit ich bin und aus den Bildern versteht man auch gleich das Problem.

Vielleicht kann mir einer von euch das erklären, laut HTML Code sollte es ja richtig angezeigt werden.

Und ja ich habe versuch das zu googeln aber ich versteh es leider immer noch nicht.

Vielen Dank und bitte gnädig sein für den ersten Post..

PS. Gerne auch persönlich per Teamviewer oder Facetime.. :slight_smile:

Gruß

Bernd

// Import required libraries
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Hash.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>

const char* ssid     = "Oldsmobile";
const char* password = "123456789";

#define DHTPIN D5     // Digital pin connected to the DHT sensor
#define DHTTYPE    DHT11     // DHT 11
#define ONE_WIRE_BUS D7

DHT dht(DHTPIN, DHTTYPE);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// current temperature & humidity, updated in loop()
float t = 0.0;
float h = 0.0;
float Motortemp = 0.0;
int sensorCount;
int PWM_Pin = 2;
int BATTERIE_pin = A0;
int output;
int TEMP;

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;    // will store last time DHT was updated


const long interval = 1000;

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <style>
    html {
     font-family: Arial;
     display: inline-block;
     margin: 0px auto;
     text-align: center;
    }
    h2 { font-size: 3.0rem; }
    p { font-size: 3.0rem; }
    .units { font-size: 1.2rem; }
    .dht-labels{
      font-size: 1.5rem;
      vertical-align:middle;
      padding-bottom: 15px;
    }
    
  </style>
</head>
<body>
  <h2>Cutlass Messwerte</h2>
  <p>
    <span class="dht-labels">Temperatur</span> 
    <span id="temperatur">%TEMPERATUR%</span>
    <sup class="units">&deg;C</sup>
  </p>
  <p>
    <span class="dht-labels">Luftfeuchte</span>
    <span id="humidity">%LUFTFEUCHTE%</span>
    <sup class="units">%</sup>
  </p>
  <p>
    <span class="dht-labels">Motortemperatur</span>
    <span id="Motortemperatur">%Motortemperatur%</span>
    <sup class="units">&deg;C</sup>
  </p>
</body>
<script>
setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("temperatur").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/temperatur", true);
  xhttp.send();
}, 1000 ) ;

setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("humidity").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/humidity", true);
  xhttp.send();
}, 1000 ) ;

setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("Motortemperatur").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/Motortemperatur", true);
  xhttp.send();
}, 800 ) ;
</script>
</html>)rawliteral";

// Replaces placeholder with DHT values
String processor(const String& var) {
  //Serial.println(var);
  if (var == "TEMPERATUR") {
    return String(t);
  }
  else if (var == "HUMIDITY") {
    return String(h);
  }
  if (var == "Motortemperatur") {
    return String(Motortemp);
  }

  return String();
}

void setup() {

  // Serial port for debugging purposes
  Serial.begin(115200);
  dht.begin();
  sensors.begin();
  sensorCount = sensors.getDS18Count();
  pinMode(PWM_Pin, OUTPUT);

  Serial.print("Setting AP (Access Point)…");
  // Remove the password parameter, if you want the AP (Access Point) to be open
  WiFi.softAP(ssid, password);

  IPAddress IP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(IP);

  // Print ESP8266 Local IP Address
  Serial.println(WiFi.localIP());

  // Route for root / web page
  server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send_P(200, "text/html", index_html, processor);
  });
  server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send_P(200, "text/plain", String(t).c_str());
  });
  server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send_P(200, "text/plain", String(h).c_str());
  });
  server.on("/Motortemperatur", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send_P(200, "text/plain", String(Motortemp).c_str());
  });
  // Start server
  server.begin();
}



void loop() {

  int wert1;
  float wert2;
  float temp;
  wert1 = analogRead(0);
  temp = wert1 / 6.600;
  wert1 = (int)temp;
  wert2 = ((wert1 % 100) / 10.0);


  sensors.requestTemperatures();
  TEMP = sensors.getTempCByIndex(0);
  float newMot = TEMP;

  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    // save the last time you updated the DHT values
    previousMillis = currentMillis;
    // Read temperature as Celsius (the default)
    float newT = dht.readTemperature();
    

    if (isnan(newT)) {
      Serial.println("Failed to read from DHT sensor!");
    }
    else {
      t = newT;
      Serial.print("Umgebungstemp. ist: ");
      Serial.print(t, 1);
      Serial.println("°C");
      Serial.println();
    }

    if (isnan(newMot)) {
      Serial.println("Failed to read from Tmot sensor!");
    }
    else {
      Motortemp = newMot;
      Serial.print("Motortemp ist: ");
      Serial.print(Motortemp, 1);
      Serial.println("°C");
      Serial.println();
      Serial.print("Batteriespannung ist: ");
      Serial.print(wert2, 1);
      Serial.println("V");
      Serial.println();

    }
    // Read Humidity
    float newH = dht.readHumidity();
    // if humidity read failed, don't change h value
    if (isnan(newH)) {
      Serial.println("Failed to read from DHT sensor!");
    }
    else {
      h = newH;
      Serial.print("Luftfeuchte ist: ");
      Serial.print(h, 0);
      Serial.println(" %");
      Serial.println();
    }
  }

  if (TEMP < 80)
  {
    analogWrite(PWM_Pin, 0);
  }
  if (TEMP > 81)
  {
    analogWrite(PWM_Pin, 255);
  }
  if (TEMP > 83)
  {
    analogWrite(PWM_Pin, 60);
  }

  if (TEMP > 90)
  {
    analogWrite(PWM_Pin, 90);
  }

  if (TEMP > 95)
  {
    analogWrite(PWM_Pin, 120);
  }

  if (TEMP > 99)
  {
    analogWrite(PWM_Pin, 160);
  }

  if (TEMP > 104)
  {
    analogWrite(PWM_Pin, 255);
  }

}

ROH_DHT_WLAN_erweitert.ino (6.25 KB)

Bildschirmfoto 2020-03-31 um 21.38.30.png

Willkommen...
Ich hab gerade in einem anderen Thread mit einer gescheiterten Ausgabe angefangen

Und mach das hier mal genauso und gebe Dir einen Tip:
Las den ganzen Kram rund um die WEB-Ausgabe weg und sieh zu, das erstmal die Erwartung mit dem Ergebnis übereinstimmt..
Ich kann mir nicht vorstellen, das das tatsächlich gewollt ist

  if (TEMP < 80)
    {
    analogWrite(PWM_Pin, 0);
    }
  if (TEMP > 81)
    {
    analogWrite(PWM_Pin, 255);
    }
  if (TEMP > 83)
    {
    analogWrite(PWM_Pin, 60);
    }
  if (TEMP > 90)
    {
    analogWrite(PWM_Pin, 90);
    }
  if (TEMP > 95)
    {
    analogWrite(PWM_Pin, 120);
    }
  if (TEMP > 99)
    {
    analogWrite(PWM_Pin, 160);
    }
  if (TEMP > 104)
    {
    analogWrite(PWM_Pin, 255);
    }

Zumal Du ein und den selben Sensor mal TEMP als int

TEMP = sensors.getTempCByIndex(0);

Und mal als newMot als float
f

loat newMot = sensors.getTempCByIndex(0);

verarbeitest.

Stell Deinen Code bitte mal in Codetags Das (</>) Sympol oben am Editorrand. Geht auch jetzt noch via modify Message.

Danke für deine Antwort.

Das mit den Temperaturen hab ich echt übersehen und gleich ausgebessert. Grundlegend arbeitet mein Code, bzw. er macht das was ich will.

PRIMÄRE Hauptaufgabe: Temperatur einlesen und je nach Temperaturfenster verschiedene Lüfterdrehzahlen anfahren. Dieser Mosfetbaustein sitzt am PWM Ausgang.

Daher auch die verschiedenen IF Bedingungen. Könnte man auch regeln, aber für meinen Einsatzzweck reicht das erstmal. Verbessern kann man auch während der Saison dachte ich mir.

Gruß

Nun nochmals alles vereinfacht, der Code läuft erstmal und macht was er soll:

// Import required libraries
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Hash.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>

const char* ssid     = "Oldsmobile";
const char* password = "123456789";

#define DHTPIN D5     // Digital pin connected to the DHT sensor
#define DHTTYPE    DHT11     // DHT 11
#define ONE_WIRE_BUS D7

DHT dht(DHTPIN, DHTTYPE);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// current temperature & humidity, updated in loop()

float Motortemperatur = 0.0;
float Luftfeuchte = 0.0;
float Umgebungstemperatur = 0.0;
float Batteriespannung = 0.0;
int sensorCount;
int PWM_Pin = 2;
int BATTERIE_pin = A0;
int output;



void setup() {

  // Serial port for debugging purposes
  Serial.begin(115200);
  dht.begin();
  sensors.begin();
  sensorCount = sensors.getDS18Count();
  pinMode(PWM_Pin, OUTPUT);

  Serial.print("Setting AP (Access Point)…");
  // Remove the password parameter, if you want the AP (Access Point) to be open
  WiFi.softAP(ssid, password);

  IPAddress IP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(IP);

  // Print ESP8266 Local IP Address
  Serial.println(WiFi.localIP());

}


void loop() {

  int wert1;
  float wert2;
  float temp;
  wert1 = analogRead(0);
  temp = wert1 / 6.600;
  wert1 = (int)temp;
  wert2 = ((wert1 % 100) / 10.0);


  sensors.requestTemperatures();
  
  Motortemperatur = sensors.getTempCByIndex(0);
  
  Umgebungstemperatur = dht.readTemperature();
    
  Luftfeuchte = dht.readHumidity();

  

  if (Motortemperatur < 80)
  {
    analogWrite(PWM_Pin, 0);
  }
  if (Motortemperatur > 81)
  {
    analogWrite(PWM_Pin, 255);
  }
  if (Motortemperatur > 83)
  {
    analogWrite(PWM_Pin, 60);
  }

  if (Motortemperatur > 90)
  {
    analogWrite(PWM_Pin, 90);
  }

  if (Motortemperatur > 95)
  {
    analogWrite(PWM_Pin, 120);
  }

  if (Motortemperatur > 99)
  {
    analogWrite(PWM_Pin, 160);
  }

  if (Motortemperatur > 104)
  {
    analogWrite(PWM_Pin, 255);
  }

      Serial.print("Umgebungstemp. ist: ");
      Serial.print(Umgebungstemperatur, 1);
      Serial.println("°C");
      Serial.println();
      Serial.print("Motortemp ist: ");
      Serial.print(Motortemperatur, 1);
      Serial.println("°C");
      Serial.println();
      Serial.print("Batteriespannung ist: ");
      Serial.print(wert2, 1);
      Serial.println("V");
      Serial.println();
      Serial.print("Luftfeuchte ist: ");
      Serial.print(Luftfeuchte, 0);
      Serial.println(" %");
      Serial.println();

}

und hier ist mein HTML Code

<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <style>
    html {
     font-family: Arial;
     display: inline-block;
     margin: 0px auto;
     text-align: center;
    }
    h2 { font-size: 3.0rem; }
    p { font-size: 2.0rem; }
    .units { font-size: 1.2rem; }
    .dht-labels{
      font-size: 1.5rem;
      vertical-align:middle;
      padding-bottom: 15px;
    }
    
  </style>
</head>
<body>
  <h2>Cutlass Messwerte</h2>
  <p>
    <span class="dht-labels">Motortemperatur</span>
    <span id="Motortemperatur">%TMOT%</span>
    <sup class="units">&deg;C</sup>
  </p> 
  <p>
    <span class="dht-labels">Batteriespannung</span>
    <span id="Motortemperatur">%Bat%</span>
    <sup class="units">Volt</sup>
  </p>
  <p>
    <span class="dht-labels">Umgebungstemperatur</span> 
    <span id="temperatur">%TUMG%</span>
    <sup class="units">&deg;C</sup>
  </p>

   <p>
    <span class="dht-labels">Luftfeuchte</span>
    <span id="humidity">%FEUCHTE%</span>
    <sup class="units">%</sup>
  </p>
</body>

Jetzt würde ich gerne die %FELDER% alle 800-1000ms automatisch befüllen, die DHT Werte reichen auch alle paar Sekunden.

Wie gehe ich jetzt hier richtig vor? Vielen Dank für die Hilfe

Moin,

Verbessern kann man auch während der Saison dachte ich mir.

Wenn der Code unübersichtlich und dadurch nicht verständlich ist, bzw. man erraten muss was das wird ist da schnell die Luft raus.
Für Deine if-strecke nimm mal nur an, das TEMP 105 ist. Damit ist jede der Bedingungen ab Eintritt if (TEMP > 81)
erfüllt...

Für den html-Teil sehe ich, das die scripte weder im noch im stehen.
Ansonsten gibt es Validatoren z.B. The W3C Markup Validation Service und sicher auch eine nicht so komplizierte Möglichkeit der Erzeugung der Ausgabe und automatischem refresh.

Wenn Du nur html-code zusammenkopierst, dann hilft Dir das nicht. Manchmal vielleicht doch...
Aber grundlegende Fragen zum Aufbau und Inhalt findest Du z.B. bei selfhtml
Schau ob es valide Beispiele gibt und vergleiche die inhaltlich und funktionell miteinander.

[edit]
hat sich unser post beim schreiben überschnitten...

Na bitte, schön aufgeräumt.

noiasca ist da fit. Vielleicht hat er ja ne Anregung.
Einfach abwarten.
Und vielleicht vorher schon mal einlesen. Viel erläutert - braucst nicht alles, aber zum Verständnis...

Grüße

Danke für dein Input...

Bin auch schon ein wenig weitergekommen, mit diesem aktuellen Code bekomme ich schon einmal meine Wunschseite angezeigt.

Leider versteh ich den Rest noch nicht, schaue aber ob ich bei deinen Seiten weiterkomme wie ich die %Platzhalter% befülle.

// Import required libraries
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Hash.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <OneWire.h>
#include <DallasTemperature.h>

const char* ssid     = "Oldsmobile";
const char* password = "123456789";

#define DHTPIN D5     
#define DHTTYPE    DHT11    
#define ONE_WIRE_BUS D7

DHT dht(DHTPIN, DHTTYPE);
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

float Motortemperatur = 0.0;
float Luftfeuchte = 0.0;
float Umgebungstemperatur = 0.0;
float Batteriespannung = 0.0;
int sensorCount;
int PWM_Pin = 2;
int BATTERIE_pin = A0;
int output;

AsyncWebServer server(80); 

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html><head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <style>
    html {
     font-family: Arial;
     display: inline-block;
     margin: 0px auto;
     text-align: center;
    }
    h2 { font-size: 3.0rem; }
    p { font-size: 2.0rem; }
    .units { font-size: 1.2rem; }
    .dht-labels{
      font-size: 1.5rem;
      vertical-align:middle;
      padding-bottom: 15px;
    }
    
  </style>
</head>
<body>
  <h2>Cutlass Messwerte</h2>
  <p>
    <span class="dht-labels">Motortemperatur</span>
    <span id="Motortemperatur">%TMOT%</span>
    <sup class="units">&deg;C</sup>
  </p> 
  <p>
    <span class="dht-labels">Batteriespannung</span>
    <span id="Motortemperatur">%BAT%</span>
    <sup class="units">Volt</sup>
  </p>
  <p>
    <span class="dht-labels">Umgebungstemperatur</span> 
    <span id="temperatur">%TUMG%</span>
    <sup class="units">&deg;C</sup>
  </p>
  <p>
    <span class="dht-labels">Luftfeuchte</span>
    <span id="humidity">%FEUCHTE%</span>
    <sup class="units">%</sup>
  </p>
  <p>
    <span class="dht-labels">Luefteransteuerung</span>
    <span id="luefter">%LUEFTER%</span>
    <sup class="units">%</sup>
  </p>
</body></html>)rawliteral";

void notFound(AsyncWebServerRequest *request) {
  request->send(404, "text/plain", "Not found");
}



void setup() {

  Serial.begin(115200);
  Serial.println();
  dht.begin();
  sensors.begin();
  sensorCount = sensors.getDS18Count();
  pinMode(PWM_Pin, OUTPUT);

  Serial.print("Setting AP (Access Point)…");
  WiFi.softAP(ssid, password);

  IPAddress IP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(IP);

  Serial.println(WiFi.localIP());

 server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send_P(200, "text/html", index_html);
  });



 server.begin();

}

void loop() {

  int wert1;
  float wert2;
  float temp;
  wert1 = analogRead(0);
  temp = wert1 / 6.600;
  wert1 = (int)temp;
  wert2 = ((wert1 % 100) / 10.0);


  sensors.requestTemperatures();

  Motortemperatur = sensors.getTempCByIndex(0);

  Umgebungstemperatur = dht.readTemperature();

  Luftfeuchte = dht.readHumidity();

  Batteriespannung = wert2;


  if (Motortemperatur < 80)
  {
    analogWrite(PWM_Pin, 0);
  }
  if (Motortemperatur > 81)
  {
    analogWrite(PWM_Pin, 255);
  }
  if (Motortemperatur > 83)
  {
    analogWrite(PWM_Pin, 60);
  }

  if (Motortemperatur > 90)
  {
    analogWrite(PWM_Pin, 90);
  }

  if (Motortemperatur > 95)
  {
    analogWrite(PWM_Pin, 120);
  }

  if (Motortemperatur > 99)
  {
    analogWrite(PWM_Pin, 160);
  }

  if (Motortemperatur > 104)
  {
    analogWrite(PWM_Pin, 255);
  }

  Serial.print("Umgebungstemp. ist: ");
  Serial.print(Umgebungstemperatur, 1);
  Serial.println("°C");
  Serial.println();
  Serial.print("Motortemp ist: ");
  Serial.print(Motortemperatur, 1);
  Serial.println("°C");
  Serial.println();
  Serial.print("Batteriespannung ist: ");
  Serial.print(wert2, 1);
  Serial.println("V");
  Serial.println();
  Serial.print("Luftfeuchte ist: ");
  Serial.print(Luftfeuchte, 0);
  Serial.println(" %");
  Serial.println();

}

Sieht dann so aus wie im Anhang aus.

Dann warte ich mal..

nö sorry. Ich habe bisher nichts mit dem async webserver gemacht, und weis daher nicht was da genau passiert. Außerdem fehlen mir die Links zu den ganzen Libraries.

Was jetzt im HTML von #3 ist, ist die gleiche id="Motortemperatur" im HTML, dann kann das nicht funktionieren.

Und in deinem Sketch von #6 fehlt nun das Javascript zum ersetzen, die handler für die einzelnen Daten vom Server und der Parser zum Ersetzen.

Ich bin für alles offen, habe dieses Beispiel nur gefunden und versucht das anzupassen.
Sollte es mit einer anderen Variante auch gehen das die Werte auf meiner Seite ersetzt und aktualisiert werden versuche ich das ich gerne.

Ja im letzten Post stehe ich jetzt an, da ich nicht weiß wie ich die Werte ersetze und das Beispiel der Seite verstehe ich nicht.

Gruß

arduino_neuling:
ich lese nun schon ein Weile mit ...

Dann kennst Du sicherlich https://fipsok.de/ und dort "Esp8266 OnBoardLed Tab".

Da wird JSON für den Datenaustausch und Javasript in der HTML-Datei verwendet. Daran versuche ich mich gerade, allerdings mit einem ESP32 unter Verwendung von SPIFFS für HTML-, CSS- und ICO-Datei. Könnte das auch ein Ansatz für Dich sein?

Anna.png

Anna.png

Hallo,

schau dich mal auf der Seite von Fips hier im Forum um. Leider funktioniert hier im Moment die Suche nicht. Jedenfalls das gibts viele verschiedene Beispiele.

Es gibt wie immer mehere Möglickeiten die Daten auf die Webseite zu bekommen. Und dann ist auch die Frage wie viele Daten sind das und wie oft müssen sie aktualisiert werde.

Möglichkeit 1 mit java Skript und z.B Ajax. Da ist der Aufwand für die HTML Seite etwas grösser. Beim aktualisiren der Daten werden dann allerdings nur die Daten übertragen. Das ist sicher die technisch beste Lösung. Dabei bliebt die HTML Seite erhalten und nur die Daten werden aktualisiert.

Möglichkeit 2 wenn jetzt nur ein paar Daten übertragen werden kann man die Daten auch in die HTML Seite reinkopieren. Dazu kann man die Funktion sprintf() benutzen. Im HTML Teil gibt man dann z.B an den Stellen an denen die Variable stehen soll mit %3.1F das Format der Varablen an. Mit sprintf(sendbuffer,htmlseite,variable1,variable2,.....) wird dann der Formatplatzhalter(%3.1F) durch Variable der Reihenfolge nach ersetzt. Nachteil der Speicherbedarf der beiden Zeichenketten sendbuffer und htmlseite ist ziemlich groß. Die geamte HTML Seite wird übertragen und neu aufgebaut.

Wenn Du einen ESP benutz kannst Du den reinen HTML code auch mit einem normalen Editor erstellen, auf dem PC testen und auf dem ESP im internen Filesystem speichern. Dann wenn es nötig ist auslesen, mit sprintf() bearbeiten und versenden.

Heinz

Anstelle von AJAX kannst Du auch die einfachere Fetch-API benutzen. Beispiele dazu findest Du bei Fips. Für HTML könnte SelfHtml oder W3Schools helfen.

Gruß Tommy

Rentner:
schau dich mal auf der Seite von Fips hier im Forum um. Leider funktioniert hier im Moment die Suche nicht. Jedenfalls das gibts viele verschiedene Beispiele.

Habe ich gerade und verstehe nur Bahnhof :slight_smile:

Rentner:
Möglichkeit 1 mit java Skript und z.B Ajax. Da ist der Aufwand für die HTML Seite etwas grösser. Beim aktualisiren der Daten werden dann allerdings nur die Daten übertragen. Das ist sicher die technisch beste Lösung. Dabei bliebt die HTML Seite erhalten und nur die Daten werden aktualisiert.

Kannst du mir hierfür ein deutsches Beispiel nennen. Mit Programmierung habe/hatte ich nichts am Hut bis heute. Das Java Thema wurde heute schon angesprochen.

Danke dir

arduino_neuling:
Habe ich gerade und verstehe nur Bahnhof :slight_smile:

Wenn Du konkrete Fragen stellst, könnte ich eine Antwort versuchen.

Nachtrag: JSON: JavaScript Object Notation. Es werden beispielsweise gleiche Datentypen verwendet. JavaScript wird als Teil einer HTML-Seite zur Aktualisierung von Daten durch den Browser verwendet.

das Java Thema wurde heute schon angesprochen

Nein. Wir sprechen hier von JavaScript. Das ist nicht Java.

Mach dir einen Kaffee, und versuche z.B. dieses (mein) Geschreibe zu verstehen.

https://werner.rothschopf.net/201809_arduino_esp8266_server_client_0.htm

Für alle 5 Teile wirst du etwa 1h benötigen. Es behandelt einige Grundlagen. Danach klappt es auch mit komplexeren Sachen.

Nach 16:00 Uhr habe ich wieder etwas Zeit.

Gut ich versuche es zu verstehen, verspreche aber es zu lesen :slight_smile:

Okay meine konkrete Frage lautet, wie kann ich meine Variablen

Motortemperatur = sensors.getTempCByIndex(0);

  Umgebungstemperatur = dht.readTemperature();

  Luftfeuchte = dht.readHumidity();

  Batteriespannung = wert2;

auf meine HTML Seite kopieren, Motorteil z.B. alle 800ms den Rest alle 2 Sek.

Abgeschaut habe ich mir das mit den Platzhaltern %xxx%

<p>
    <span class="dht-labels">Batteriespannung</span>
    <span id="Batteriespannung">%BAT%</span>
    <sup class="units">Volt</sup>
  </p>

Das heißt ich würde gerne den Wert2 auf die %BAT% stelle kopieren.

Das ist der JSON-String:

{"animation":[{"bez":"Temp","wert":"20.14" },{"bez":"Hum","wert":"45.22" },{"bez":"Druck","wert":"1020.53" }]}

den ich so verschicke:

void bme280() {       // Funktionsaufruf "bme280();" muss im Setup eingebunden werden
  server.on("/bme280", []() {
    server.send(200, "application/json", handleBme());
#ifdef DEBUGGING
  Serial.println(handleBme());
#endif
  });
}

In der HTML-Datei dann die Anzeige:

     <script>
         function renew() {
         fetch('/bme280').then(function (response) {
         return response.json();
         }).then(function (array) {
         var elem = document.querySelector('#temp');
 elem.innerHTML = array.animation[0].bez + ' ' + array.animation[0].wert + '°C'
         var elem = document.querySelector('#hum');
 elem.innerHTML = array.animation[1].bez + ' ' + array.animation[1].wert + ' %'
         var elem = document.querySelector('#pres');
 elem.innerHTML = array.animation[2].bez + ' ' + array.animation[2].wert + ' hPa'
         });
         }

         document.addEventListener('DOMContentLoaded', renew);
         setInterval(renew, 1000)      
      </script>
   </head>
   <body>
      <section>
         <span id='temp'></span>
         <span id='hum'></span>
         <span id='pres'></span>
      </section>
   </body>

Das sind natürlich nur Fragmente, die auf den Ausführungen von Fips basieren, aber zeigen, wie gut JSON und Javascript harmonieren.

Gerne mehr, allerdings würde ich das verlockende Angebot ab 16 Uhr annehmen ;D

agmue:
...allerdings würde ich das verlockende Angebot ab 16 Uhr annehmen..

noiasca arbeitet aber nicht mit der fetch Api, dann wird es wieder Ajax!

Asynchronous JavaScript and XML

Gruß Fips

Gibt es den Access Point Tab auch schon für Esp8266?

agmue:
Gibt es den Access Point Tab auch schon für Esp8266?

Nein.
Du weißt doch wie es geht!

Mach ich noch.

Gruß Fips