Error nan con sensor dht 22

Hola estoy intentando subir los valores de un sensor de temperatura dht 22 con un modulo wifi esp8266 generico el tema es que cuando lo subo a la pagina me da nan los valores y ya no se como convertir los floats a strings si alguien sabe se lo agradecería este es mi codigo:

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include "DHT.h"

// Uncomment one of the lines below for whatever DHT sensor type you're using!
//#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

/*Put your SSID & Password*/
const char* ssid = ;  // Enter SSID here
const char* password = ;  //Enter Password here

ESP8266WebServer server(80);

// DHT Sensor
uint8_t DHTPin = 2; 
 int sensor;              
// Initialize DHT sensor.
DHT dht(DHTPin, DHTTYPE);                

float  Temperature;
float Humidity;
 
void setup() {
  Serial.begin(115200);
  delay(100);
  
  pinMode(DHTPin, INPUT);

  dht.begin();              

  Serial.println("Connecting to ");
  Serial.println(ssid);

  //connect to your local wi-fi network
  WiFi.begin(ssid, password);

  //check wi-fi is connected to wi-fi network
  while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected..!");
  Serial.print("Got IP: ");  Serial.println(WiFi.localIP());

  server.on("/", handle_OnConnect);
  server.onNotFound(handle_NotFound);

  server.begin();
  Serial.println("HTTP server started");

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

void handle_OnConnect() {
  Temperature = dht.readTemperature();
 Serial.print(Temperature );// Gets the values of the temperature
 Humidity = dht.readHumidity(); 
 Serial.print("Humidity: ");
 Serial.print(Humidity);
 delay(500);
 
   server.send(200, "application/json", SendJSON(Temperature,Humidity));
}

void handle_NotFound(){
  server.send(404, "text/plain", "Not found");
}

String SendHTML(float Temperaturestat,float Humiditystat){
  String ptr = "<!DOCTYPE html> <html>\n";
  ptr +="<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
  ptr +="<title>ESP8266 Weather Report</title>\n";
  ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
  ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
  ptr +="p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
  ptr +="</style>\n";
  ptr +="</head>\n";
  ptr +="<body>\n";
  ptr +="<div id=\"webpage\">\n";
  ptr +="<h1>ESP8266 NodeMCU Weather Report</h1>\n";
  
  ptr +="<p>Temperature: ";
  ptr +=(int)Temperaturestat;
  ptr +="°C</p>";
  ptr +="<p>Humidity: ";
  ptr +=(int)Humiditystat;
  ptr +="%</p>";
  
  ptr +="</div>\n";
  ptr +="</body>\n";
  ptr +="</html>\n";
  return ptr;
}

String SendJSON(float Temperaturestat,float Humiditystat){

   String  Temperature = ""
    Temperature.concat(Temperaturestat);
    String  Humidity = ""
    Humidity.concat(umiditystat);


  return "{\"temperature\":" + String (Temperaturestat) +"\",\"Humidity\":" + String (Humiditystat) + "\"}";
}

¿Por consola que te muestra? ¿Las lecturas son correctas?

¿Por qué no usas isnan() para confirmar que las lecturas son correctas?

Al margen, veo un error en SendJSON()

Humidity.concat(umiditystat);

Lo correcto es

Humidity.concat(Humiditystat);

Saludos

PD: Para convertir float a String podés usar, por ej.

String sTemp = String(Temp);

Edito: Obviamente Temp es float.

Siempre viene bien pegar una mirada con Google :wink:

Probe para que me muestre las lecturas por consola serial pero me dan NAN pero esto solo me pasa cuando lo conecto con el modulo

Si en handle_OnConnect() en la consola muestra NAN es porque no está leyendo el sensor.

¿Por qué no subís el esquema de conexiones así vemos si viene por ese lado?

tendria que hacerlo en fritzing y subirlo porque mostrarlo por foto no creo que se entienda mucho.
Basicamente el modulo esta alimentado a 3.3v con conexion de rx y tx, el gpi0 esta en gnd
y el sensor dht 22 esta alimentado con 5 v el pin de daton tiene una resistencia de 4,7 khoms y esta conectado al pin 2 del arduino.

y la resistencia es de 4,7k

Perfecto, queda clarísimo.

Probá así

void handle_OnConnect() {
   Temperature = dht.readTemperature();
   Humidity = dht.readHumidity(); 

   server.send(200, "application/json", SendJSON(Temperature,Humidity));
}

Es más, yo quitaría todas las impresiones porque no se cómo le caen al módulo los mensajes que imprimes en el setup().
Otra alternativa sería usar SoftwareSerial para el módulo.

Edito: Viendo mejor el esquema, no puedes alimentar el módulo desde el arduino ya que solo entrega 50 mA como máximo y el módulo consume 80 mA como mínimo. Además es conveniente usar adaptadores de nivel para Rx y Tx.

Lo he probado y me sigue dando lo mismo y el otro tema es que cuando lo alimento con una fuente externa me da un error a la hora de subir el programa, la otra cosa es que habia visto que se podia usar sin necesidad de adaptador de nivel.

Te dije que es conveniente usar conversores porque en la hoja de datos no queda claro que los pines sean tolerantes a 5V solo por la resistencia que tienen en serie (de hecho dice que la tensión máxima que soportan es 3.6V) y, tal vez, a la larga se terminen "friendo".

Lo que haría es usar SoftwareSerial para manejar el ESP durante las pruebas y por Serial verificar por consola los datos que se van a enviar al ESP.
Una vez que todo funciona bien, vuelves a usar Serial solo para el ESP.

En cuanto a la alimentación, da por seguro que el arduino no soporta ese consumo, tienes que alimentar el ESP con otra fuente o poner un regulador de 3.3V desde el que alimentarlo, por rj. desde la salida de 5V del UNO.

Si te genera problemas al cargar el código (lo cual es lógico porque tienes el ESP colgado del Rx y Tx) , simplemente carga el código con el ESP desconectado.

bueno probare con eso , y como seria cargar el codigo con el sp desconectado sin alimentacion???

Quita los cables verde y amarillo del esquema y listo.

Es buena costumbre dividir tu proyecto en 3.
Primero pruebas el DHT con Arduino, usando el ejemplo de la librería que has elegido. Funciona entonces sigues
Segundo prueba el ESP01 comunicandose como Server HTML, funciona sigues
Luego miras como comunicar un ESP (cualquiera) a un arduino.
Acá te digo que puedes conectar el TX del ESP al pin RX de tu softwareSerial pero el TX del softwareSerial debe ir con alguna adaptador de niveles (divisor de tension, zener, transistor, etc) al pin RX del ESP01.
Compartir GND entre ambos.
Entonces con lo anterior funcionando pasas a la ultima situacion donde unes todo.
Antes no.

Hola gracias por el consejo aunque la duda que tengo seria como programarlo para que los datos que reciba el esp por parte del arduino los mande a una pagina mediante una http request.

Si por consola del UNO recibes NAN por favor no avances porque tienes un problema.
Yo estoy en un problema similar con los DHT22 o AM2302. No esta claro que es.
La cuestión es que en algunos casos funciona y en otros no.
Probé con resistencia de 4k7 y de 10k. Sin resistencia tmb. El inconveniente ya lo hemos comentando un power cycle o sea un apagado y encendido del Arduino o del sensor lo resuelve. Yo decidí que cuando lee NAN se haga un pase de LOW a HIGH usando un pin del Arduino que alimenta el DHT22 o el modelo que sea.
Asi resuelvo mi inconveniente que en algunos casos a demorado 2 y 3 dias sin fallar, pero siempre falla.
Ahora estoy usando una nueva librería que se llama DHTNew que da mas información de lo que ocurre en el DHT. Lo reconoce automáticamente. Sea DHT11/22 o AM2301/02
Prueba a ver, tengo mejores resultados pero a la larga falla tmb.

muchas gracias por esa info, hace mucho habia probado conectarle el gpi2 del modulo wifi a pin de los datos del sensor y me funciono pero muchas gracias por esa aviso lo tendre en cuenta si me da problemas a futuro o no mida bien la temperatura.

Bueno por lo que leo usas un ESP01, ten cuidado, porque es muy muy delicado. En IDE o Platformio lo encuentro mas estable que como lo estoy usando que es platformio pero dentro de Home Assistant. La cosa es que deja de funcionar, o no arranca. He puesto las resistencias pull up para garantizar el correcto boot up pero tampoco.
Asi que funciona con el parche del GPIOxx que lo alimenta, o bien, un PMOS que lo alimenta de manera mas eficiente y ahi el GPIOxx solo le entrega un LOW a la compuerta del PMOS para que conduzca, y éste pone los 3.3V directamente al VCC del sensor.
He conseguido unos Dmg 3401(Vsd=30V Idss=-3A RDSon 0.085 Ohm) a un bajo precio.

gracias lo tendre en cuenta aunque ahora estoy con otra parte del proyecto que tengo que hacer porque tengo que hacer un codigo para que mande los datos a una pagina pero me dijeron que el codigo tiene que estar cargado al arduino y que desde el arduino tiene que pasarle los datos al esp para que este lo envie a la pagina pero ni idea como podria formular un codigo asi.
Investigando descubri que seria posible con comandos AT pero muchos dicen que no es muy recomendable asi que no se como podria programarlo.

[edito] Entendí mejor lo el ejercicio. Ahora veo que quieres comunicar un Arduino con un ESP, supongo que para lo clásico, enviar la info del sensor de temperatura y humedad.
Hay ejemplos para rato. Comunicación Serial y fin.

Si eso estaba viendo estuve probando con un codigo pero no me conecta al servidor. no se porque

No hay tal cosa cómo "conectar" al servidor. El ESP hace un mini server web LOCAL y tú refrescas los valores cada X (Lo aconsejable es usar Jquery y Ajax en el ESP8266 para que visualmente sea decente)

Los datos de tu DHT22 vendrán de tu Arduino, tu Arduino envía por Serial la información necesaria y cuando llegue al ESP, actualizas la web. No hay más, no es conectar el DHT ni el Arduino a un server. Tú sólo escribes el valor y lo mandas por Serial.

Google: Jquery Ajax ESP8266

No estoy seguro pero por cómo te expresas, creo, repito, creo, que tienes dudas de base sobre la comunicación entre los microcontroladores. Empieza por ahí de ser el caso.