ESP32 DHT11 Server aktualisieren hängt

Hallo,
ich habe ein ESP32 D1 Mini ( ESP32-WROOM-32) und das Problem das die die Daten immer nach ca. 5 Minuten nicht mehr aktualisiert werden.

Den Code habe ich von >hier< und läuft auch aber nach ca. 5 Minuten kommen keine Daten mehr.
Um zu schauen ob der ESP sich "aufhängt" habe ich diesen Teil eingefügt.

 if(Serial.available())                                   
  {
    String command = Serial.readStringUntil('\n');        
    if(command == "1")
    {
   Serial.println("geht");                  
    }
    }

Also wenn ich im Serial Monitor "1" eingebe kommt auch die Antwort aber warum kommen keine Daten mehr an?

/*********
  Rui Santos
  Complete project details at https://randomnerdtutorials.com
*********/

// Import required libraries
#include "WiFi.h"
#include "ESPAsyncWebServer.h"
#include <Adafruit_Sensor.h>
#include <DHT.h>

// Replace with your network credentials
const char* ssid = "*****";
const char* password = "*****";

#define DHTPIN 25     // Digital pin connected to the DHT sensor

// Uncomment the type of sensor in use:
#define DHTTYPE    DHT11     // DHT 11
//#define DHTTYPE    DHT22     // DHT 22 (AM2302)
//#define DHTTYPE    DHT21     // DHT 21 (AM2301)

DHT dht(DHTPIN, DHTTYPE);

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

String readDHTTemperature() {
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  //float t = dht.readTemperature(true);
  // Check if any reads failed and exit early (to try again).
  if (isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return "--";
  }
  else {
    Serial.println(t);
    return String(t);
  }
}

String readDHTHumidity() {
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  if (isnan(h)) {
    Serial.println("Failed to read from DHT sensor!");
    return "--";
  }
  else {
    Serial.println(h);
    return String(h);
  }
}

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
   <link rel="stylesheet" href="https://site-assets.fontawesome.com/releases/v6.5.2/css/all.css" >

  <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>ESP32 DHT Server</h2>
  <p>
    <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 
    <span class="dht-labels">Temperature</span> 
    <span id="temperature">%TEMPERATURE%</span>
    <sup class="units">&deg;C</sup>
  </p>
  <p>
    <i class="fas fa-tint" style="color:#00add6;"></i> 
    <span class="dht-labels">Luftfeuchtigkeit</span>
    <span id="humidity">%HUMIDITY%</span>
    <sup class="units">&percnt;</sup>
  </p>
   <p>
     <i class="fa-thin fa-fan" style="color:#059e8a;"></i>
    <span class="dht-labels">Luefter</span>
    <span id="humidity">%HUMIDITY%</span>
    <sup class="units">&percnt;</sup>
  </p>
</body>
<script>
setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("temperature").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/temperature", true);
  xhttp.send();
}, 10000 ) ;

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();
}, 10000 ) ;
</script>
</html>)rawliteral";

// Replaces placeholder with DHT values
String processor(const String& var) {
  //Serial.println(var);
  if (var == "TEMPERATURE") {
    return readDHTTemperature();
  }
  else if (var == "HUMIDITY") {
    return readDHTHumidity();
  }
  return String();
}

void setup() {
  // Serial port for debugging purposes
  Serial.begin(115200);

  dht.begin();

  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }

  // Print ESP32 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", readDHTTemperature().c_str());
  });
  server.on("/humidity", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send_P(200, "text/plain", readDHTHumidity().c_str());
  });

  // Start server
  server.begin();
}

void loop() {
 if(Serial.available())                                   
  {
    String command = Serial.readStringUntil('\n');        
    if(command == "1")
    {
   Serial.println("geht");                  
    }
    }
}

Hallo,
ich finde den Sketch ziemlich verwirrend. Für mich wäre jetzt erst mal die Frage hängt der Webserver oder der DHT. Ich kann auch nicht verstehen warum immer wieder mit dem Asychron Webserver versucht wird , wo die ESP core doch alles mit an Bord hat.

Vorschlag schaudich mal bei Fips um da findes du besimmt was passendes

dazu gibts von @agmue noch eine Hilfe zur den Tabs , der wrd sicher den link nochmal posten

Einstieg zu Fips.

Gruß Tommy

Danke Tommy ich hätte mich jetzt usselig gesucht

Gruß Heinz

Habe mir mal "Fips" angeschaut und ist für mich verwirrend, geht schon los wo ich die Verbindung mit meinem Router herstelle...

Zum testen habe ich mal ein Code mit reingemacht der anzeigt ob der ESP immer noch mit dem Router verbunden ist und NEIN, also ist das Problem.

Dann hast du es nicht richtig gelesen, da alles sehr gut im Sketch selbst beschrieben ist und viele andere damit klar kommen.

Ich hab kein Beispiel für einen DHT Sensor, aber wenns nur darum geht, Werte auf einer Seite periodisch zu aktivieren, dann habe ich hier ein paar Beispiele:

https://werner.rothschopf.net/microcontroller/202310_esp_webserver_maxi_en.htm

Schlussendlich die Seite/das Beispiel 70 zeigt das Zusammenspiel von Webseite, JavaScript und Resource/JSON. Das kannst du entsprechend anpassen und die zwei Werte vom DHT übertragen.

Ein wenig Einarbeiten musst du dich aber schon.

Hallo,
Dann wäre jetzt erst mal die Frage warum ist dem so.
ich verwende eigentlich immer WiFi.setAutoReconnect(true) damit sich der ESP bei einem Verbindungsverlust selbst wieder verbindet.

damit sieht die function für statische IP Adressen dann so aus . Diese rufe ich im Setup() einmalig auf.

void conectWIFI() {
  byte maxzeit = 0;
  WiFi.disconnect();
  //WiFi.persistent(true);   // daten in EEprom
  WiFi.mode(WIFI_STA);
  Serial.printf("Connecting to %s ", ssid);

  WiFi.config(staticIP, gateway, subnet);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    maxzeit++;
    if (maxzeit > 60)return;

  }
  WiFi.setAutoReconnect(true);
  Serial.print(F(" connected...locale IP:"));
  Serial.println(WiFi.localIP());

}

Ich hab da vor einiger Zeit auch mal was für Einsteiger geschrieben. Das ist nicht mehr ganz auf dem neusten Stand, gilt im Grunde aber immer noch "Webserver mit Fetch-API"

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.