Hola gracias por leer mi pregunta. Estoy realizando un termostato con un ESP8266-01 con un sensor DHT22. El problema que tengo con este sensor es que para que me marque la temperatura tengo que desconectar su alimentación y volver a conectarlo ya que si no me mide la temperatura (nan).
El ESP y el sensor van a estar alimentados con una batería por lo que el ESP entra en modo sleep (tengo un cable soldado del reset a un pin del micro) por lo que cada vez que se reinicia tengo que estar desconectando y conectando la alimentación del sensor y no es práctico.
He probado con el sensor DHT11 y funciona correctamente pero no tiene tanta resolución como el DHT22.
#include <Adafruit_Sensor.h>
#include "DHT.h"
//#define DHTTYPE DHT22
#define DHTTYPE DHT11
const int DHTPin = 2;
DHT dht(DHTPin, DHTTYPE);
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#define SLEEP_TIME 10
const char* ssid = "***"; //Indicamos el nombre de la red WiFi (SSID) a la que queremos conectarnos.
const char* password = "********"; //Indicamos la contraseña de de red WiFi
HTTPClient http;
float temperatura;
int val=0;
int t1=0;
int t2=0;
int i;
void setup()
{
dht.begin();
//pinMode(rele,OUTPUT);
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.printf("Conectando a la red: %s", WiFi.SSID().c_str());
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi conectada");
}
void loop()
{
if(WiFi.status() != WL_CONNECTED)
{
WiFi.begin(ssid, password);
delay(500);
t1=millis();
if((t1-t2)>=1000)
{
Serial.println("conectando");
t2=millis();
}
}
else
{
// t1=millis();
// if((t1-t2)>=15000)
// {
// Serial.println(t1-t2);
temperatura = dht.readTemperature();
http.begin("192.168.1.37", 80,(String("temperatura:"+String(temperatura)))); //Se manda petición
// Serial.println(String("temperatura:"+String(temperatura)));
//Serial.println(http.begin("192.168.1.37", 80,(String("temperatura:"+String(temperatura)))));
Serial.println(temperatura);
int httpCode1 = http.GET();
// t2=millis();
ESP.deepSleep(SLEEP_TIME * 1000000, WAKE_RF_DEFAULT);
// }
}
// if (millis() >= 10000)
// {ESP.deepSleep(SLEEP_TIME * 1000000, WAKE_RF_DEFAULT);}
}
NO sabria decirte si realmente te falla o no tu DHT22. Pero como solucion, podrias usar un pin digital para alimentar y controlar la alimentacion del DHT22.
Segun lo pongas en HIGH o LOW podras controlar el momento en que se alimenta o se apaga y solucionar asi el fallo que tienes al resetearlo.
Por lo poco que consume un DHT no tendras problemas de sobreconsumo.
Hi,
Normalmente el pin GPIO2 necesitan estar positivos cuando initializas el modulo.Tienen que tener una resistenci de 10K de pullup. Otra cosa es que el RST y el CH_PD tienen que estar conectado al 3.3 voltios. Especialmente si la tarjeta del relay es de una version de V1.0. Ahora la version V4.0 no tiene problemas pues ya tienen las resistencias instaladas en el modulo.
tauro0221:
Hi,
Normalmente el pin GPIO2 necesitan estar positivos cuando initializas el modulo.Tienen que tener una resistenci de 10K de pullup. Otra cosa es que el RST y el CH_PD tienen que estar conectado al 3.3 voltios. Especialmente si la tarjeta del relay es de una version de V1.0. Ahora la version V4.0 no tiene problemas pues ya tienen las resistencias instaladas en el modulo.
He realizado la conexión que me has comentado pero tampoco funciona, tengo que reiniciar la alimentación del sensor para que tome la temperatura.
Hi,
Que version tiene tu modulo V1.0 o V4.0. Si tienes el V1.0 ellos no tienen la resistencia de 10K en los puertos 0 , 2. El reset le falta conectarlo a los 3.3 igualmente el CH_PD. Otra cosa que tienes que tener en mente es que el port 0 debe de estar en high cuando reinitializs el modulo. Dejame saber que version tiene tu modulo. Se me olvido preguntarte si el modulo de wifi tuyo tiene relay o solamente el wifi.
Hi,
Los esp que yo uso los compro con el modulo que trae el relay y el modulo que tu montas el esp es de la version 1.0.Este no tiene resistencias de pullup. Debi haberte preguntado si es el modulo de esp solo.Yo uso el DTH22 pues es mas preciso que el DT11. Los que yo uso le anado un resistencia de 10K del pin de la salida del DHT modulo. Trata de anadirle una resistencia 10K y mira ver si te trabaja. Voy a tratar de buscar el sketch que yo uso pues no tengo problemas. Otra cosa es de anadirle un delay de 2 segundos antes de leerlo pues no lo puedes leer muy rapido. Adjunto una foto de como instalarlo y puedes ver la resistencia de 10K instalada.
He puesto la resistencia también pero no funciona, al despertar no toma correctamente la temperatura. La verdad no entiendo que es lo que ocurre como mencioné con el DHT11 funciona correctamente.
¿Alguna idea más?
Un saludo.
Hi,
Pregunta le anadiste el delay entre las lecturas? Debe de ser de 2 segundos entre las lecturas. Trata haber si te funciona con el delay. Otra cosa haz tratado de correr uno de los ejemplos que trae la libreria. Esta te puede decir si tienes problemas leyendolo. Tambien haz tratado de usar otra libreria. Adjunto un link de una que yo uso.
El sensor me mide correctamente hasta que entra en MODO SLEEP después deja de dar la temperatura. Si no pongo la parte del código que entra en Sleep funciona correctamente.
El retardo lo he puesto también aunque no debiera de ser ningún problema ya que cuando sale de la hibernación se conecta a la red WIFI y tarda 5 segundos y luego hace la petición de lectura.
He probado la librería con el ejemplo serial que me has pasado con un Mega y no funciona (he puesto la R=10K y probando con alimentación 3.3V y 5V:
#include <DHT22.h>
// Only used for sprintf
#include <stdio.h>
// Data wire is plugged into port 7 on the Arduino
// Connect a 4.7K resistor between VCC and the data pin (strong pullup)
#define DHT22_PIN 7
// Setup a DHT22 instance
DHT22 myDHT22(DHT22_PIN);
void setup(void)
{
// start serial port
Serial.begin(115200);
Serial.println("DHT22 Library Demo");
}
void loop(void)
{
DHT22_ERROR_t errorCode;
// The sensor can only be read from every 1-2s, and requires a minimum
// 2s warm-up after power-on.
delay(2000);
Serial.print("Requesting data...");
errorCode = myDHT22.readData();
switch(errorCode)
{
case DHT_ERROR_NONE:
Serial.print("Got Data ");
Serial.print(myDHT22.getTemperatureC());
Serial.print("C ");
Serial.print(myDHT22.getHumidity());
Serial.println("%");
// Alternately, with integer formatting which is clumsier but more compact to store and
// can be compared reliably for equality:
//
char buf[128];
sprintf(buf, "Integer-only reading: Temperature %hi.%01hi C, Humidity %i.%01i %% RH",
myDHT22.getTemperatureCInt()/10, abs(myDHT22.getTemperatureCInt()%10),
myDHT22.getHumidityInt()/10, myDHT22.getHumidityInt()%10);
Serial.println(buf);
break;
case DHT_ERROR_CHECKSUM:
Serial.print("check sum error ");
Serial.print(myDHT22.getTemperatureC());
Serial.print("C ");
Serial.print(myDHT22.getHumidity());
Serial.println("%");
break;
case DHT_BUS_HUNG:
Serial.println("BUS Hung ");
break;
case DHT_ERROR_NOT_PRESENT:
Serial.println("Not Present ");
break;
case DHT_ERROR_ACK_TOO_LONG:
Serial.println("ACK time out ");
break;
case DHT_ERROR_SYNC_TIMEOUT:
Serial.println("Sync Timeout ");
break;
case DHT_ERROR_DATA_TIMEOUT:
Serial.println("Data Timeout ");
break;
case DHT_ERROR_TOOQUICK:
Serial.println("Polled to quick ");
break;
}
}
Hi,
Aqui hay una nota que tienes que esperar 2000msec cuando le aplica energia al modulo. Por lo tanto trata de cambiar la linea 25 del sketch a delay(5000); y tambien un delay de 5000 cuando sale del modo sleep.
// The sensor can only be read from every 1-2s, and requires a minimum
// 2s warm-up after power-on.
delay(2000);
Tambien encontre esto que le incrementa el delay en el .cpp file.
So do you mean that you changed the 'original DHT22.cpp' library's delayMicroseconds(2) to delayMicroseconds(5) and it worked fine?
Saludos a todos, tengo una solución a dicho problema. El sensor en sí debe de recibir energía unos segundos despues para que el microcontrolador lo detecte. Lo que hice fue utilizando un Nodemcu es controlarlo por una de sus salida dándole un delay con millis de 2 o más segundos para poner esa salida en "HIGH" luego coloque una resistencia Pull Up de 220 ohm desde los 3.3v a el pin que determinemos como salida, ya que la potencia que brinda uno de esos pines no es suficiente para que trabaje estable. Probando sin la resistencia me di cuenta que cuando presionas el botón de reset funciona bien pero al quitarle la alimentación daba un error, para compensar esa caída de tensión utilice la resistencia de 220 ohm desde los 3.3v a el pin que determinemos como salida con el delay.