Lectura de sensor dht11 fallida

Buenas tardes estoy trabajando para realizar un sistema de riego semiautomático y ya cuento con el código y el ensamble de la parte eléctrica, pero al ejecutar el código aunque no da error en el monitor serie no muestra las variables que necesito.

#include <SimpleDHT.h>
#include <SPI.h>
#define humidity_sensor_pin A0
#define ldr_pin A5

int pinDHT11 = 2;
SimpleDHT11 dht11;
int ldr_value = 0;
int water_pump_pin = 3;
int water_pump_speed = 255;
void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println("*******************************");
  Serial.println("Muestra DHT11...");
  byte temperature = 0;
  byte humidity_in_air = 0;
  byte data[40] = {0};
  if (dht11.read(pinDHT11, &temperature, &humidity_in_air, data)) {
    Serial.print("Lectura del sensor DHT11 fallida");
    return;
  }
  
  Serial.print("Muestra RAW Bits: ");
  for (int i = 0; i < 40; i++) {
    Serial.print((int)data[i]);
    if (i > 0 && ((i + 1) % 4) == 0) {
      Serial.print(' ');
    }
  }
  Serial.println("");
  Serial.print("Muestra OK: ");
  Serial.print("Temperatura: ");Serial.print((int)temperature); Serial.print(" *C, ");
  Serial.print("Humedad relativa en aire: ");Serial.print((int)humidity_in_air); Serial.println(" %");
  int ground_humidity_value = map(analogRead(humidity_sensor_pin), 0, 1023, 100, 0);
  Serial.print("Humedad en suelo: ");
  Serial.print(ground_humidity_value);
  Serial.println("%");
  int ldr_value = map(analogRead(ldr_pin), 1023, 0, 100, 0);
  Serial.print("Luz: ");
  Serial.print(ldr_value);
  Serial.println("%");
   Serial.println("*******************************");
 if( ground_humidity_value <= 50 && ldr_value < 20 && temperature < 20) {
 digitalWrite(water_pump_pin, HIGH);
 Serial.println("Irrigación");
 analogWrite(water_pump_pin, water_pump_speed);
 }
 else{
 digitalWrite(water_pump_pin, LOW);
 Serial.println("Riego detenido");
 }
 delay (1000); 
}

Adjunto el circuito junto con el monitor serie.
Muchas gracias cualquiera que me intente colaborar.

El código está mal presentado, edita el post, selecciona todo el código y toca el símbolo </> en la barra del editor.

Por otro lado, creo que el error está en el if() donde lees los datos del sensor.
Te sugiero que revises el ejemplo "DHT11WithRawBits.ino" de la librería SimpleDHT.

Saludos

Vale, voy a verificar a ver si ese es el problema.
Muchas gracias por la recomendación.

Y otra cosa ese sensor da como salida un tren de pulsos digitales, tu lo estas conectando a un pin analógico, no se que hará esa librería al respecto, pero seria conveniente cambiarlo a un pin digital.
saludos.

Es indistinto porque los pines analógicos también funcionan como digitales (excepto A6 y A7 en el Nano).

Saludos

Totalmente de acuerdo, pero esa libreria se espera un HIGH o un LOW , ¿y si pilla la lectura en la rampa de subida o bajada?, yo no lo se, yo lo cambiaria a uno digital ya que sensor da pulsos digitales asi me quito de posibles problemas, ademas todos los ejemplos se basan en pines digitales. Por algo sera.
saludos.

Vale lo voy a checar a ver como funciona.
Gracias por la recomendación.

Si la señal es digital (o sea, cuadrada) y además el pin se lee como digital (que usa internamente un circuito que no pasa por el conversor ADC), no hay posibilidad de tener ninguna rampa ascendente ni descendente porque no hay rampa alguna.

A nivel de código para nosotros es algo transparente, pero analogRead() no solo accede al pin, se encarga de setear toda la circuitería interna del micro como corresponde para hacer una lectura analógica.
Lo mismo digitalRead() para hacer la lectura digital.

1 Like

Use el ejemplo aplicado pero ahora suelta un error distinto te muestro.

paso de este:

void loop() {
  Serial.println("*******************************");
  Serial.println("Muestra DHT11...");
  byte temperature = 0;
  byte humidity_in_air = 0;
  byte data[40] = {0};
  if (dht11.read(pinDHT11, &temperature, &humidity_in_air, data)) {
    Serial.print("Lectura del sensor DHT11 fallida");
    return;
  }

A este:

void loop() {
  Serial.println("*******************************");
  Serial.println("Muestra DHT11...");
  byte temperature = 0;
  byte humidity_in_air = 0;
  byte data[40] = {0};
  int err = SimpleDHTErrSuccess;
  if ((err = dht11.read(&temperature, &humidity_in_air, data)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT11 failed, err="); Serial.print(SimpleDHTErrCode(err));
    Serial.print(","); Serial.println(SimpleDHTErrDuration(err)); delay(1000);
    return;
  }

imagen_2021-05-21_210731|690x335
El 23 en el error se referirá a la línea en la que presenta fallas?

Pd: Estoy iniciando aun en esto de programar lo hago solo en mis tiempos libres ténganme un poco de paciencia muchas gracias.
!

Eso no lo sabia me desdigo de lo dicho.

Aunque cambie el sensor de humedad en tierra a un sensor analógico aun me sigue presentando errores con el DHT11 no obstante gracias por tu recomendación para evitar posibles conflictos con este otro sensor.

Moderador:
He movido tu hilo a Software porque no reúne las condiciones para la sección Proyectos.
Debiste leer los 2 primeros hilos del foro.

Mi estimado porque no pruebas los ejemplos de la librería que estes usando y luego pasas a TU programa?
En la prueba que hagas desconecta el motor tambien.

@sadguacate el DHT que estás usando es como el del esquema, o sea versión en módulo (que viene con plaqueta), o es el sensor "suelto" (solo la cajita celeste con sus pines)?

Como el de la izquierda o como el de la derecha?

Es el de la izquierda el que incluye una plaqueta.
Al probar el sensor funciona correctamente pero al incluirlo en el código genera conflictos, estoy planteándome retirar el sensor de humedad tierra.

Mil disculpas lo tendré en cuenta para próximas ocasiones.

Como no tengo experiencia con este sensor no notaba el error, ahora que lo encontré te cuento.

El error 23 que te apareció antes significa que no se ha inicializado el pin.
No es un error del sensor en sí sino un mensaje que genera la propia librería para informar qué es lo que anda mal.

Estas son las definiciones de los mensajes de salida de la librería, los encuentras viendo el código de SimpleDHT.h

// Success.
#define SimpleDHTErrSuccess 0
// Error to wait for start low signal.
#define SimpleDHTErrStartLow 16
// Error to wait for start high signal.
#define SimpleDHTErrStartHigh 17
// Error to wait for data start low signal.
#define SimpleDHTErrDataLow 18
// Error to wait for data read signal.
#define SimpleDHTErrDataRead 19
// Error to wait for data EOF signal.
#define SimpleDHTErrDataEOF 20
// Error to validate the checksum.
#define SimpleDHTErrDataChecksum 21
// Error when temperature and humidity are zero, it shouldn't happen.
#define SimpleDHTErrZeroSamples 22
// Error when pin is not initialized.
#define SimpleDHTErrNoPin 23
// Error when pin mode is invalid.
#define SimpleDHTErrPinMode 24

Ya aclarado cual es el error, veo que tu haces esto

SimpleDHT11 dht11;

o sea, no le indicas a la librería en cual pin está conectado el sensor.

Lo debes inicializar así

SimpleDHT11 dht11(pinDHT11);

Probablemente, de haber comparado tu código con el ejemplo que te sugerí en el post #2, hubieras encontrado el error tú mismo.

Saludos

1 Like

Disculpa la demora para responder.

El error si se encontraba allí muchas gracias por tu ayuda.

En el caso del error 0 y 16 el problema se hallaría en la conexión del circuito? de no ser así me podrías explicar estos dos errores y posibles soluciones para estos, me parecen un tanto curiosos pero no los termino de entender.

Error 0: Success = Éxito.
O sea, todo perfecto

Error 16: Error esperando señal de inicio en bajo. Según la hoja de datos, las transmisiones comienzan con un bit 0 (nivel bajo), imagino que se da este error cuando no se detecta ese bit de inicio.

Como te dije no tengo experiencia usando el DHT11 ni la librería, más no te puedo ayudar.

Saludos

De igual forma muchísimas gracias por toda la ayuda ya tengo el sistema funcionando a full.