Webserver Wetterstation

Hallo ihr Lieben,

ich programmiere mir gerade eine eigene Wetterstation für den Balkon. Diese soll mittels Webserver erreichbar sein.

Nun habe ich das Problem, dass der Webserver zwar erstellt wird und auch erreichbar ist, aber aus irgendeinem Grund die Seite weiß bleibt. Der HTML Teil ist auch ersichtlich. Allerdings wird mittlerweile folgende Fehlermeldung auf dem Webserver ausgegeben: setInterval(function () { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState == 4 && this.status == 200) { // This code searches for the component with ID "dht" and replaces the component content with the returned content document.getElementById("dht").innerHTML = this.responseText; } }; // Request "/dht" via "GET" xhttp.open("GET", "/dht", true); xhttp.send(); }, 1000)

Folgenden Code nutze ich:

#include <Arduino.h>
#include "DHT.h"

#ifdef ESP32
  #include <WiFi.h>
  #include <AsyncTCP.h>
#elif defined(ESP8266)
  #include <ESP8266WiFi.h>
  #include <ESPAsyncTCP.h>
#endif

#include <ESPAsyncWebServer.h>

#include <analogWrite.h>
#include <ESP32_Servo.h>

#define DHTPIN 14    
#define LEDPIN          33  
#define LIGHTPIN        2
#define STEAMPIN 18  
#define DHTTYPE DHT22 
DHT dht(DHTPIN, DHTTYPE);

const char *SSID = "xxx";
const char *PASS = "xxx";

static int A = 0;
static int B = 0;
static int C = 0;

AsyncWebServer server(80);

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML>
<html>
<title>Wetterstation Kaulsdorf-Nord</title>
<head>
  <meta charset="utf-8">
</head>
<body>
  <div class="btn">
    <div id="dht"></div>
    
  </div>
</body>
    setInterval(function () {
      var xhttp = new XMLHttpRequest();
      xhttp.onreadystatechange = function () {
        if (this.readyState == 4 && this.status == 200) {
          // This code searches for the component with ID "dht" and replaces the component content with the returned content
          document.getElementById("dht").innerHTML = this.responseText;
        }
      };
      // Request "/dht" via "GET"
      xhttp.open("GET", "/dht", true);
      xhttp.send();
    }, 1000)
</script>
<style>
  /*Web page*/
  html,body{margin: 0;width: 100%;height: 100%;}
  body{display: flex;justify-content: center;align-items: center;}
  #dht{text-align: center;width: 100%;height: 100%;color: #fff;background-color: #47a047;font-size: 48px;}
  .btn button{width: 100%;height: 100%;border: none;font-size: 30px;color: #fff;position: relative;}
  button{color: #ffff;background-color: #89e689;margin-top: 20px;}
  .btn button:active{top: 2px;}
</style>
</html>
)rawliteral";


String Merge_Data(void)
{

 float Temperature = dht.readTemperature();

 float Humidity = dht.readHumidity();

  String dataBuffer;

  String Steam;
  String Light;

  Steam = String(analogRead(STEAMPIN);
  //Photoresistor
  Light = String(analogRead(LIGHTPIN));
  
 
  dataBuffer += "<p>";
  dataBuffer += "<h1>Sensoren Daten</h1>";
  dataBuffer += "<b>Temperatur:</b><b>";
  dataBuffer += Temperature;
  dataBuffer += "</b><b>℃</b><br/>";
  dataBuffer += "<b>Luftfeuchte:</b><b>";
  dataBuffer += Humidity;
  dataBuffer += "</b><b>%</b><br/>";
  dataBuffer += "<b>Regen:</b><b>";
  dataBuffer += Steam;
  dataBuffer += "</b><b>%</b><br/>";
  dataBuffer += "<b>Helligkeit:</b><b>";
  dataBuffer += Light;
  dataBuffer += "</b><b></b><br/>";


  return dataBuffer;
}
  void Config_Callback(AsyncWebServerRequest *request)
{
  if (request->hasParam("value")) 
  {

    String HTTP_Payload = request->getParam("value")->value();
 
    Serial.printf("[%lu]%s\r\n", millis(), HTTP_Payload.c_str());

  }
  request->send(200, "text/plain", "OK"); 
}


void notFound(AsyncWebServerRequest *request) {
    request->send(404, "text/plain", "Not found");
}
void setup()
{
  dht.begin(9600);
  Serial.begin(9600);
  
  WiFi.begin(SSID, PASS);
  while (!WiFi.isConnected())
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected.");
  Serial.println("IP address: "); 
  Serial.println(WiFi.localIP());

  
  //Set pins modes 
  pinMode(LEDPIN,OUTPUT);
  pinMode(STEAMPIN,INPUT);
  pinMode(LIGHTPIN,INPUT);

  delay(1000);

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


  server.on("/dht", HTTP_GET, [](AsyncWebServerRequest *request)
            { request->send(200, "text/plain", Merge_Data().c_str()); });


  server.on("/set", HTTP_GET, Config_Callback);   

  server.begin();  
  ;
}
void loop(){

}
tippe oder füge den Code hier ein

Werden die Daten aus der DHT Abfrage auch in den databuffer geladen, um auf dem Webserver angezeigt zu werden?

Wo ist mein Denkfehler?

Hallo, lösche bitte drine WLan Anmeldedaten raus.
Dann zeige deine Fehlermeldung komplett in Code-Tags.

Wo hast du den Sketch her und warum verwendest du die etwas komplizierten "Async-Module" ?

Sieh dir mal die Seite von Fips an und nutze die Beispiel. Die funktionieren alle sehr gut. Dazu auch die Einführung durchlesen.

Noch ein Tipp:
Baue nach den Beispielen von fips einen Webserver auf und erweitere den Stück für Stück mit deinen "Wetterstationsmodulen".
Klein anfangen ist immer besser. :wink:

da fehlt das öffnende Tag script vor deinem JavaScript.

Wie andere schon hingewiesen haben, lass den async webserver weg und arbeite mit dem "normalen" httpServer

Welchen µC verwendest Du?

Einen esp32 noname Board. Ich hoffe das hilft, bin newbie

Ganz klein, klein, anders klein oder etwas größer?

Link zum Produkt und/oder Foto wär nicht schlecht.

Du könntest auch als Neuling bitte alle Fragen beantworten, damit wir dir auch helfen können.
Merke, wir können nicht auf deinen Arbeitsplatz schauen.

Und alle Boards haben einen Namen.

Insofern hilft es, als ich jetzt weiß, daß es ein ESP32 und nicht ESP8266 ist.

"ESP32" ist aber inzwischen eher der Name einer Familie mit vielen Verzweigungen. Und manchmal kommt es auf kleine Details an. Am einfachsten ist ein Link zum Produkt, dann kann jeder, der möchte, nach diesen suchen :wink:

Der Vorteil eines korrekten Links ist, man muss nicht suchen, sondern sieht das genutzte Produkt auf Mausklick.
Mit den bisherigen Angaben fällt selbst ein Suuchen schwer und leicht findet man die falschen Artikel, ohne korrekte Angaben oder Link.

Ich meinte, man klickt auf den Link und kann dann nach Details suchen, die möglicherweise zur Beantwortung einer Frage notwendig sind :slightly_smiling_face:

Ahh...ok, das passt dann. :wink:

Dann hoffe ich mal, das @daria87 es jetzt auch soweit verstanden hat.

Dann schmeiße ich mal die Zeilen für ESP8266 raus.

Pin 2 für einen analogen Eingang funktioniert nicht, siehe ESP32 Pinout Reference: Which GPIO pins should you use?.

Meine Zugangsdaten stehen in zugangsdaten.h, damit ich nicht vergesse, sie vor Veröffentlichung zu löschen :wink:

Programm als Baustelle
#include "zugangsdaten.h"
#include <Arduino.h>
#include "DHT.h"

#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>

#define DHTPIN 14
#define LEDPIN          33
#define LIGHTPIN        34  // Pin 2 funktioniert nicht, da ADC2
#define STEAMPIN 18
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

const char *SSID = STA_SSID;
const char *PASS = STA_PASSWORD;

AsyncWebServer server(80);

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML>
<html>
<title>Wetterstation Kaulsdorf-Nord</title>
<head>
  <meta charset="utf-8">
</head>
<body>
  <div class="btn">
    <div id="dht"></div>
    
  </div>
</body>
<script>
    setInterval(function () {
      var xhttp = new XMLHttpRequest();
      xhttp.onreadystatechange = function () {
        if (this.readyState == 4 && this.status == 200) {
          // This code searches for the component with ID "dht" and replaces the component content with the returned content
          document.getElementById("dht").innerHTML = this.responseText;
        }
      };
      // Request "/dht" via "GET"
      xhttp.open("GET", "/dht", true);
      xhttp.send();
    }, 1000)
</script>
<style>
  /*Web page*/
  html,body{margin: 0;width: 100%;height: 100%;}
  body{display: flex;justify-content: center;align-items: center;}
  #dht{text-align: center;width: 100%;height: 100%;color: #fff;background-color: #47a047;font-size: 48px;}
  .btn button{width: 100%;height: 100%;border: none;font-size: 30px;color: #fff;position: relative;}
  button{color: #ffff;background-color: #89e689;margin-top: 20px;}
  .btn button:active{top: 2px;}
</style>
</html>
)rawliteral";


String Merge_Data(void)
{
  float Temperature = random(200, 300)/10.0; //dht.readTemperature();  // ersetzt fehlenden Sensor
  float Humidity = random(700, 900)/10.0; //dht.readHumidity();  // ersetzt fehlenden Sensor
  String dataBuffer;

  String Steam;
  String Light;

  Steam = String(analogRead(STEAMPIN)/40.96);
  //Photoresistor
  Light = String(analogRead(LIGHTPIN)/40.96);
  
  dataBuffer += "<p>";
  dataBuffer += "<h1>Sensoren Daten</h1>";
  dataBuffer += "<b>Temperatur:</b><b>";
  dataBuffer += Temperature;
  dataBuffer += "</b><b>℃</b><br/>";
  dataBuffer += "<b>Luftfeuchte:</b><b>";
  dataBuffer += Humidity;
  dataBuffer += "</b><b>%</b><br/>";
  dataBuffer += "<b>Regen:</b><b>";
  dataBuffer += Steam;
  dataBuffer += "</b><b>%</b><br/>";
  dataBuffer += "<b>Helligkeit:</b><b>";
  dataBuffer += Light;
  dataBuffer += "</b><b></b><br/>";

  return dataBuffer;
}

void Config_Callback(AsyncWebServerRequest *request)
{
  if (request->hasParam("value")) 
  {

    String HTTP_Payload = request->getParam("value")->value();

    Serial.printf("[%lu]%s\r\n", millis(), HTTP_Payload.c_str());

  }
  request->send(200, "text/plain", "OK"); 
}

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

void setup()
{
  dht.begin();
  Serial.begin(115200);
  delay(500);
  Serial.println("\nStart");
  
  WiFi.begin(SSID, PASS);
  while (!WiFi.isConnected())
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected.");
  Serial.println("IP address: "); 
  Serial.println(WiFi.localIP());

  
  //Set pins modes 
  pinMode(LEDPIN,OUTPUT);
  pinMode(STEAMPIN,INPUT);
  pinMode(LIGHTPIN,INPUT);

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


  server.on("/dht", HTTP_GET, [](AsyncWebServerRequest *request)
            { request->send(200, "text/plain", Merge_Data().c_str()); });


  server.on("/set", HTTP_GET, Config_Callback);   

  server.begin();  
}

void loop(){
}

Etwas sieht man schon: