Sensor dht22 con lectura errónea

Hola a todos! Me da mucho gusto poder ser parte de esta hermosa comunidad.
Tengo un sensor dht22, al comparar la temperatura con un termohigrometro (chino) me marca un valor de humedad distinto (-10%) y de temperatura (+3°). Para el uso que le quiero dar la diferencia es mucha.
Tengo 2 medidores de temperatura de distinta marca y modelo, ambos dan una lectura de temperatura igual, salvo el dht22 con esa diferencia.
Alimente el sensor por 3.3 y 5v pero no hay resultados.
Si aumento los valores de humedad y temperatura el sensor los persibe.
Hice casi todo lo que vi en el foro pero sigo sin poder solucionarlo y avanzar con mi proyecto.

Como estas sensando? estas utilizando la librería?
Adjunta el código sino como se puede diagnosticar

Dejo el codigo, hace poco programo en arduino, no se si este muy bien.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <DHT_U.h>
#include "DHT.h"
LiquidCrystal_I2C lcd(0x27,20,4); 
#define Type DHT22 
int dhtPin = 2; 
DHT HT(dhtPin, Type); 
int humidity;  
int tempC; 
int dt (900);
void setup() {
     lcd.init(); 
     lcd.backlight();
     lcd.clear();
     lcd.home();

     
       Serial.begin(9600); 
       HT.begin(); 
}
void loop() {
  humidity = HT.readHumidity(); 
  tempC = HT.readTemperature(); 
  Serial.print("Humedad Relativa: ");
  Serial.print(humidity); 
  Serial.print("% / Temperatura: "); 
  Serial.print(tempC);
  Serial.println("ºC / ");
     lcd.setCursor(4,0);
     lcd.print("SENSOR");
     lcd.setCursor(0,2); 
     lcd.print("Temperatura: "); 
     lcd.print(tempC); 
     lcd.print((char)223);
     lcd.setCursor(0,3);
     lcd.print("Humedad: ");
     lcd.print(humidity);
     lcd.print("%");
  delay(dt); 
}í

Estás incluyendo librerías innecesarias
El principio debería ser


#include <Wire.h> 
#include <LiquidCrystal_I2C.h> 
#include <DHT.h> 
// #include <DHT_U.h>   // no va
// #include "DHT.h"     // no va
LiquidCrystal_I2C lcd(0x27,20,4); 
#define Type DHT22 
int dhtPin = 2; 
DHT HT(dhtPin, Type);

Luego

int humidity;
int tempC; 

Si las declaras enteras, olvídate de los decimales.

Esto

int dt (900);

Va generar un error al compilar
Debería ser

int dt = 900;

aunque lo correcto (ya que el valor no cambia) sería definirla como constante

const int dt = 900;

o mejor

const int DT = 900;

ya que se acostumbra nombrar las constantes en mayúsculas.

Muchas gracias! Me sirvio la modificación para mejorar el codigo, pero el problema sigue igual

Es que si el dht tiene error no vas a poder solucionarlo fácilmente, hasta donde conozco no se puede calibrar.
Lo único que se me ocurre es que hagas una tabla de calibración (o sea, toma nota de los valores que te da el dht en comparación a los otros sensores para diferentes T y H) para luego corregirlo por soft, otra cosa no se me ocurre.

Edito: En realidad si se me ocurre otra solución...
Compra otro DHT22 (en lo posible de otro proveedor) o mejor un BME280.

1 Like

Veo que estas usando delay para controlar las lecturas y que es de (900) ms esto esta mal ya que el mismo datasheet define que todo el proceso de recolección de variables se establece en un intervalo minimo de 2 segundos, esta descrito en la misma libreria

#include "DHT.h"

#define MIN_INTERVAL 2000 /**< min interval value */

Aqui adjunto el datasheet DHT22 Datasheetdonde sugiere añadir un capacitor de 100 nF entre VDD y GND para un mejor filtrado, así como añadir una resistencia de 1K entre VDD y el pin de datos
image

1 Like

Si pero no. Te faltó adentrarte en el código de la librería.

¿Para qué definirían una constante que luego no fuese usada?

Justamente MIN_INTERVAL es el intervalo mínimo en el que la librería realiza lecturas

void DHT::begin(uint8_t usec) { 
// set up the pins! 
  pinMode(_pin, INPUT_PULLUP); 
// Using this value makes sure that millis() - lastreadtime will be 
// >= MIN_INTERVAL right away. Note that this assignment wraps around, 
// but so will the subtraction. 
_lastreadtime = millis() - MIN_INTERVAL;
...

y lo verifica mediante millis() y _lastreadtime.

bool DHT::read(bool force) {
// Check if sensor was read less than two seconds ago and return early 
// to use last reading. 
  uint32_t currenttime = millis(); 
  if (!force && ((currenttime - _lastreadtime) < MIN_INTERVAL)) {
    return _lastresult; // return last correct measurement 
  } 
  _lastreadtime = currenttime;
...

Entonces no importa que las lecturas se intenten hacer cada 900 mseg porque la librería solo lo hace cada 2 segundos.

1 Like

Probé poniendo la resistencia pero el problema continua. estoy pensando cambiar el sensor por un bme280 ya que necesito una precisión exacta, me recomiendan ese o algún otro? por lo que vi en el foro es muy fiable pero un poco mas difícil de configurar, aunque ya guarde varios hilos donde explican sobre el sensor.

No vas a lograr la precisioin que quieres con sensores de 2 USD.
Es un sensor de +-5% o mas de error y punto.
Quieres algo mejor, debes gastar mas.
La única solucion siempre y cuando el sensor tenga buena repetibilidad es que hagas la curva de calibración que te dice @MaximoEsfuerzo.
Lees 15 y lo conviertes en 18 porque eso es lo que te indicó un sensor de presición.
Lees 85 y lo conviertes a 82 por la misma razón.
En todo punto o en los puntos que logres medir, estableces una conversión y los que te faltan interpolas.

paso a actualizar por si le sirve a alguien. probe con otro sensor dht22 que me prestaron y este si tuvo lecturas correctas. el problema esta en que es algo inestable pero funciona bien.
Al mismo tiempo me regalaron un sensor bmp280 el cual no estoy pudiendo hacer andar. Leyendo el foro modifique la librería de .76 a`77, media el voltaje entre pines para ver que me de 3.3v y esta todo bien. por el puerto serie solo muestra "iniciando"

#include <Wire.h>		// incluye libreria de bus I2C
#include <Adafruit_Sensor.h>	// incluye librerias para sensor BMP280
#include <Adafruit_BMP280.h>

Adafruit_BMP280 bmp;		// crea objeto con nombre bmp

int TEMPERATURA;		// variable para almacenar valor de temperatura
void setup() {
  Serial.begin(9600);				// inicializa comunicacion serie a 9600 bps
  Serial.println("Iniciando:");			// texto de inicio
  if ( !bmp.begin() ) {				// si falla la comunicacion con el sensor mostrar
    Serial.println("BMP280 no encontrado !");	// texto y detener flujo del programa
    while (1);					// mediante bucle infinito
  }
  
}				

void loop() {
  TEMPERATURA = bmp.readTemperature();		// almacena en variable el valor de temperatura
  Serial.print("Temperatura: ");		// muestra texto
  Serial.print(TEMPERATURA);			// muestra valor de la variable
  Serial.print(" C ");				// muestra letra C indicando grados centigrados
  delay(5000);					// demora de 5 segundos entre lecturas
}

Lo que prueba en parte lo que yo sostengo, infinidad de DHT22 falsos.

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