Problemas con sensor DHT11? Y controlador temperatura

Hola,buenas tardes
Soy nuevo por aquí y si no es este el lugar donde tendría que exponer el problema,pido disculpas a los administradores y por favor,póngalo donde mejor se adapte.gracias

Paso a explicar el problema:
Estoy haciendo un proyecto para un controlador de temperatura con el Dht11,pero este software es un poco copy pega,con algunas cosas modificadas por mi a base de prueba error,pero he llegado a un punto donde no consigo leer los datos del dht11 ya que previamente el código estaba planeado para un sensor DS18B20
El código hace una lectura del sensor y si no hay comunicación en pantalla sale "FALLA EL SENSOR".
Hasta el momento y después de tanto darle vueltas he conseguido que funcione con un Lcd normal ,el código estaba concebido para un lcd_i2c, pero como me dice en la pantalla "FALLA EL SENSOR" el programa se detiene cosa que esta programada en el código.
He incluido la librería DHT.h y efectuado algunas modificaciones,pero no logro que lea el dht11.
Si pudiera ser me hecharan una mano para salir de este problema se lo agradecería infinitamente.
Trabajo con arduino nanoProcesando: Documento (3).docx...
; dht11 ; 1 pulsador; 1 rele simple para arduino

Para todo el software y programación lo hago a través de la aplicación Ardudroid para móviles
Les pongo el código y ya me dicen que modificaciones podría hacer.gracias nuevamente

/*
 * Arduino nano pinout:
 *        _______________
 *       |      USB      |
 *       |13           12|
 *       |3V3          11|boton  
 *       |AREF         10|Relay
 *       |A0            9| 
 *       |A1            8| 
 *       |A2            7|LCD
 *       |A3            6|LCD 
 *       |A4            5|LCD
 *       |A5            4|LCD
 *       |A6            3|LCD 
 *       |A7            2|LCD
 *       |5V          GND|
 *       |RST         RST|
 *       |GND   1/INT2/RX|
 *       |VIN   0/INT3/TX|
 *       |MISO         SS|
 *       |SCK        MOSI|
 *       |_______________|
 *
*/
 /*  LIBRERIAS NECESARIAS PARA EL FUNCIONAMIENTO DEL CODIGO
 */

#include <OneWire.h>
#include <OneButton.h>
#include <DallasTemperature.h>
OneButton button(11, true);// Pin del boton
#include <DHT.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd (2,3,4,5,6,7);

#include <EEPROM.h>
#define DHTPIN 8
#define DHTTYPE DHT11
DHT dht(DHTPIN,DHTTYPE);

OneWire oneWire(8); //se estancia la libreria dallas; Pin del sensor
DallasTemperature sensors(&oneWire);
DeviceAddress outsideThermometer;

int TempVal;  // Valor de temperatura establecido
float Frio;   // Valor capturado por el sensor

int Relay=10;  // Pin salda para el Relay
byte RelayEstatus = 0;
byte cursor = 0;

int tmax = 30;  
int tmin = 15;
int MargenTemp = 3;  // Histéresis de temperatura

void setup() {
  lcd.begin(16,2);
 
  
  pinMode(Relay, OUTPUT);
  digitalWrite(Relay,HIGH);
  
  button.attachClick(click);
  button.attachDoubleClick(doubleclick);
  button.attachLongPressStart(longPressStart);
  
  if (EEPROM.read(50) == 255) EEPROM.put(0,-5);  // Si es la primera vez que se graba en la eeprom
  EEPROM.get(50 , TempVal); // Establece el valor de lo previamente guardado

  sensors.requestTemperatures();
  delay(1000);
  lcd.setCursor(0,0);
  lcd.print("T: ");
  MideTemperatura();
  lcd.setCursor(10,0);
  lcd.print("E:");
  lcd.setCursor(12,0);
  lcd.print(TempVal);
  lcd.print("\337");

}

void loop() {
  unsigned long currentMillis = millis();
  button.tick();
  
  if (currentMillis > 60000) {  // Pasado el primer minuto de arranque del programa
    if (currentMillis % 20000 < 3) {  // Cada 20 segundos 
      MideTemperatura();  // Mide la temperatura
      Termostato();       // Consulta el termostato
      delay(3);
     }
   }

   if(RelayEstatus == 1) {  // Si el motor esta funcionando muestra en pantalla una animación
    if (currentMillis % 1000 < 2) {  // Por cada segundo transcurrido
      lcd.setCursor(cursor,1);
      lcd.print(" ");
      cursor++;
      if (cursor > 15) cursor = 0;
      lcd.setCursor(cursor,1);
      lcd.print("*");
      delay(2);
    }
   }

}

void click() {   //  Baja la temperatura establecida y la muestra en pantalla
  TempVal--;
  if(TempVal < tmin) TempVal = tmin;
  lcd.setCursor(12,0);
  lcd.print("    ");
  lcd.setCursor(12,0);
  lcd.print(TempVal);
  lcd.print("\337");
}

void doubleclick() {  // Sube la temperatura establecida y la muestra en pantalla
  TempVal++;
  if(TempVal > tmax) TempVal = tmax;
  lcd.setCursor(12,0);
  lcd.print("    ");
  lcd.setCursor(12,0);
  lcd.print(TempVal);
  lcd.print("\337");
}

void longPressStart() {  // Graba en la eeprom ell valor establecido
  EEPROM.put(50 , TempVal);
  lcd.setCursor(cursor,1);
  lcd.print(" ");
  lcd.setCursor(0,1);
  lcd.print("** Guardado **");
  delay(1500);
  lcd.setCursor(3,1);
  lcd.print("            ");
}

void MideTemperatura() {
    if (sensors.getAddress(outsideThermometer, 0))  {  // Si hay comunicación con el sensor DS18B20
      sensors.requestTemperatures();   //Se envía el comando para leer la temperatura
      Frio = sensors.getTempCByIndex(0); //Se obtiene la temperatura en ºC
      lcd.setCursor(3,0);
      lcd.print("    ");
      lcd.setCursor(3,0);
      lcd.print(Frio,1); // Imprime la temperatura con un decimal
      lcd.print("\337"); // Imprime simbolo °
    }
    else  {  // Si no hay comunicación con el sensor porque se ha cortado el cable, etc.
      lcd.clear();
      lcd.setCursor(2,1);
      lcd.print("Falla sensor"); // Falla el sensor.
      digitalWrite(Relay,HIGH);  // Apaga el motor.
      while(1){ }  // Detiene el programa.
    }
}

void Termostato() {
      if (Frio <= TempVal) {
        digitalWrite(Relay,HIGH); RelayEstatus = 0;  // Apaga el rele
        lcd.setCursor(0,1); lcd.print("                ");
        }
      if (Frio > TempVal + MargenTemp) {
        digitalWrite(Relay,LOW); RelayEstatus = 1;  // Activa el rele
        }
}

hola. no sé si es para estar en Spanish aqui.
el DHT11 es simple de funcionar. hazlo funcionar con un sketch simple . luego integra eso a tu código.

Hola,gracias por responder.
El código ya de por sí era para un lcd I2C y un DS18B20 yo lo he podido implementar para un lcd normal,la cosa es que he estado mirando,comprobando e intentando implementarlo, pero al quitar algunas funciones del sensor DS18B20, el código me da error y es cuando ya me pierdo.
Soy muy novato en esto del arduino,he comprendido y aprendido muchas cosas a base de leer,pero en esto ya se me va del todo.
Sigo haciendo pruebas, en algún momento podré sacarlo adelante,pero en estos momentos estoy estancado ya que no salgo de esa dichosa pantalla "FALLA EL SENSOR"
seguiré probando y exponiendo aquí los cambios y progresos que voy haciendo.
Gracias nuevamente

para leer de un DHT11:

  DHT dht(DHTPIN,DHTTYPE);

  float h = dht.readHumidity();
  float t = dht.readTemperature();

es diferente del DS18B20. hay q cambiar "midetemperatura" y los objetos dallas y onewire no tienen q ver con el DHT11.

tienes q reescribir midetemperatura. adaptandolo.
el finde si puedo te ayudo.

#include <OneWire.h>
#include <OneButton.h>
#include <DallasTemperature.h>
OneButton button(11, true);// Pin del boton
#include <DHT.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd (2,3,4,5,6,7);

#include <EEPROM.h>
#define DHTPIN 8
#define DHTTYPE DHT11
DHT dht(DHTPIN,DHTTYPE);

//OneWire oneWire(8); //se estancia la libreria dallas; Pin del sensor
//DallasTemperature sensors(&oneWire);
//DeviceAddress outsideThermometer;

int TempVal;  // Valor de temperatura establecido
float Frio;   // Valor capturado por el sensor

int Relay=10;  // Pin salda para el Relay
byte RelayEstatus = 0;
byte cursor = 0;

int tmax = 30;  
int tmin = 15;
int MargenTemp = 3;  // Histéresis de temperatura

void setup() {
  lcd.begin(16,2);
 
  dht.begin();
  pinMode(Relay, OUTPUT);
  digitalWrite(Relay,HIGH);
  
  button.attachClick(click);
  button.attachDoubleClick(doubleclick);
  button.attachLongPressStart(longPressStart);
  
  if (EEPROM.read(50) == 255) EEPROM.put(0,-5);  // Si es la primera vez que se graba en la eeprom
  EEPROM.get(50 , TempVal); // Establece el valor de lo previamente guardado

  //sensors.requestTemperatures();
  delay(1000);
  lcd.setCursor(0,0);
  lcd.print("T: ");
  MideTemperatura();
  lcd.setCursor(10,0);
  lcd.print("E:");
  lcd.setCursor(12,0);
  lcd.print(TempVal);
  lcd.print("\337");

}

void loop() {
  unsigned long currentMillis = millis();
  button.tick();
  
  if (currentMillis > 60000) {  // Pasado el primer minuto de arranque del programa
    if (currentMillis % 20000 < 3) {  // Cada 20 segundos 
      MideTemperatura();  // Mide la temperatura
      Termostato();       // Consulta el termostato
      delay(3);
     }
   }

   if(RelayEstatus == 1) {  // Si el motor esta funcionando muestra en pantalla una animación
    if (currentMillis % 1000 < 2) {  // Por cada segundo transcurrido
      lcd.setCursor(cursor,1);
      lcd.print(" ");
      cursor++;
      if (cursor > 15) cursor = 0;
      lcd.setCursor(cursor,1);
      lcd.print("*");
      delay(2);
    }
   }

}

void click() {   //  Baja la temperatura establecida y la muestra en pantalla
  TempVal--;
  if(TempVal < tmin) TempVal = tmin;
  lcd.setCursor(12,0);
  lcd.print("    ");
  lcd.setCursor(12,0);
  lcd.print(TempVal);
  lcd.print("\337");
}

void doubleclick() {  // Sube la temperatura establecida y la muestra en pantalla
  TempVal++;
  if(TempVal > tmax) TempVal = tmax;
  lcd.setCursor(12,0);
  lcd.print("    ");
  lcd.setCursor(12,0);
  lcd.print(TempVal);
  lcd.print("\337");
}

void longPressStart() {  // Graba en la eeprom ell valor establecido
  EEPROM.put(50 , TempVal);
  lcd.setCursor(cursor,1);
  lcd.print(" ");
  lcd.setCursor(0,1);
  lcd.print("** Guardado **");
  delay(1500);
  lcd.setCursor(3,1);
  lcd.print("            ");
}

void MideTemperatura() {
   
   Frio = dht.readTemperature() ;/Se obtiene la temperatura en ºC
      lcd.setCursor(3,0);
      lcd.print("    ");
      lcd.setCursor(3,0);
      lcd.print(Frio,1); // Imprime la temperatura con un decimal
      lcd.print("\337"); // Imprime simbolo °
    }
    else  {  // Si no hay comunicación con el sensor porque se ha cortado el cable, etc.
      lcd.clear();
      lcd.setCursor(2,1);
      lcd.print("Falla sensor"); // Falla el sensor.
      digitalWrite(Relay,HIGH);  // Apaga el motor.
      while(1){ }  // Detiene el programa.
    }
}

void Termostato() {
      if (Frio <= TempVal) {
        digitalWrite(Relay,HIGH); RelayEstatus = 0;  // Apaga el rele
        lcd.setCursor(0,1); lcd.print("                ");
        }
      if (Frio > TempVal + MargenTemp) {
        digitalWrite(Relay,LOW); RelayEstatus = 1;  // Activa el rele
        }
}

Gracias,me pongo a ver si consigo que esto marche.
Lo que no entiendo es lo de cambiar Midetemperatura,estoy en ello

Esta línea da error. Asi que comienza posteando correctamente. Si la comentas es //

El DHT11 para mi es un mal sensor. Es mi mirada del mismo. Tengo como 10 de los que solo funcionan 2 o 3. ya no les presto atención. Miden mal, miden lo que quieren medir, etc, etc.
Uso los DHT22 con los que tengo otro problema que es que debo reiniciarlos cada 1 o 2 dias en forma azarosa.

Vamos con otro enfoque.
Probaste el DHT11 solo, te funciona?

Para que si en una sentencia que dices se ejecuta cada 20 segundos agregas un delay(3)? Qué sentido tiene?

Hola Surbyte.
Respondiendo a tus preguntas.
El Dht funciona bien,lo probé solo con el lcd y da las lecturas.

El delay(3); se me pasaría de otras pruebas.
Respecto a la parte de comentar,en mi código está bien,quizás sea una respuesta del compañero osea que no puedo ver ya que la ha borrado y si lo que has puesto era parte de su respuesta, es lo que estaba cambiando en mi código ,por lo que deduzco que iba por buen camino.

Quiero agradecer el tiempo que dedicáis a solucionar problemas de otros compañeros y el mío propio,con eso voy aprendiendo.

El código que te pasó @anon9970404 como te funciona?

Hola.
El código de oswe aún no lo he probado ya que se me hizo tarde y el trabajo hay que respetarlo,jj
Hoy lo probaré y expondré los resultados.
Como soy algo novato,lo que hago primero es leer el código e intentar comprenderlo antes de probar.
Gracias nuevamente

Hola.
Pues ya en casa he probado el código de oswe y he obtenido el siguiente error:

/sdk/hardware/tools/avr/bin/avr-g++ -no-canonical-prefixes -std=gnu++11 -c -g -Os -w -mmcu=atmega328p -DF_CPU=16000000L -DUSB_VID=null -DUSB_PID=null -DARDUINO=10812 -DIDE="ArduinoDroid" -DARDUINO_ARCH_AVR -DARDUINO_AVR_NANO /build/codigo_oswe.cpp -o /build/codigo_oswe.cpp.o codigo_oswe.ino:122:5: error: expected unqualified-id before 'else'
Return code is not 0

Correspondiente al
void Midetemperatura()
Intentaré solucionarlo mirando otros códigos.
Gracias

posteo aqui, adaptado para el sensor DHT11; (for the sake of politics)

//#include <OneWire.h>
#include <OneButton.h>
//#include <DallasTemperature.h>
OneButton button(11, true);// Pin del boton
#include <DHT.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd (2,3,4,5,6,7);

#include <EEPROM.h>
#define DHTPIN 8
#define DHTTYPE DHT11
DHT dht(DHTPIN,DHTTYPE);

//OneWire oneWire(8); //se estancia la libreria dallas; Pin del sensor
//DallasTemperature sensors(&oneWire);
//DeviceAddress outsideThermometer;

int TempVal;  // Valor de temperatura establecido
float Frio;   // Valor capturado por el sensor

int Relay=10;  // Pin salda para el Relay
byte RelayEstatus = 0;
byte cursor = 0;

int tmax = 30;  
int tmin = 15;
int MargenTemp = 3;  // Histéresis de temperatura

void setup() {
  lcd.begin(16,2);
 
  dht.begin();
  pinMode(Relay, OUTPUT);
  digitalWrite(Relay,HIGH);
  
  button.attachClick(click);
  button.attachDoubleClick(doubleclick);
  button.attachLongPressStart(longPressStart);
  
  if (EEPROM.read(50) == 255) EEPROM.put(0,-5);  // Si es la primera vez que se graba en la eeprom
  EEPROM.get(50 , TempVal); // Establece el valor de lo previamente guardado

  //sensors.requestTemperatures();
  delay(1000);
  lcd.setCursor(0,0);
  lcd.print("T: ");
  MideTemperatura();
  lcd.setCursor(10,0);
  lcd.print("E:");
  lcd.setCursor(12,0);
  lcd.print(TempVal);
  lcd.print("\337");

}



void click() {   //  Baja la temperatura establecida y la muestra en pantalla
  TempVal--;
  if(TempVal < tmin) TempVal = tmin;
  lcd.setCursor(12,0);
  lcd.print("    ");
  lcd.setCursor(12,0);
  lcd.print(TempVal);
  lcd.print("\337");
}

void doubleclick() {  // Sube la temperatura establecida y la muestra en pantalla
  TempVal++;
  if(TempVal > tmax) TempVal = tmax;
  lcd.setCursor(12,0);
  lcd.print("    ");
  lcd.setCursor(12,0);
  lcd.print(TempVal);
  lcd.print("\337");
}

void longPressStart() {  // Graba en la eeprom ell valor establecido
  EEPROM.put(50 , TempVal);
  lcd.setCursor(cursor,1);
  lcd.print(" ");
  lcd.setCursor(0,1);
  lcd.print("** Guardado **");
  delay(1500);
  lcd.setCursor(3,1);
  lcd.print("            ");
}

void MideTemperatura() {
   
   Frio = dht.readTemperature() ; //Se obtiene la temperatura en ºC
      lcd.setCursor(3,0);
      lcd.print("    ");
      lcd.setCursor(3,0);
      lcd.print(Frio,1); // Imprime la temperatura con un decimal
      lcd.print("\337"); // Imprime simbolo °

}

void Termostato(){
      if (Frio <= TempVal) {
        digitalWrite(Relay,HIGH); RelayEstatus = 0;  // Apaga el rele
        lcd.setCursor(0,1); lcd.print("                ");
        }
      if (Frio > TempVal + MargenTemp) {
        digitalWrite(Relay,LOW); RelayEstatus = 1;  // Activa el rele
        }
}


void loop() {
  unsigned long currentMillis = millis();
  button.tick();
  
  if (currentMillis > 60000) {  // Pasado el primer minuto de arranque del programa
    if (currentMillis % 20000 < 3) {  // Cada 20 segundos 
      MideTemperatura();  // Mide la temperatura
      Termostato();       // Consulta el termostato
      delay(3);
     }
   }

   if(RelayEstatus == 1) {  // Si el motor esta funcionando muestra en pantalla una animación
    if (currentMillis % 1000 < 2) {  // Por cada segundo transcurrido
      lcd.setCursor(cursor,1);
      lcd.print(" ");
      cursor++;
      if (cursor > 15) cursor = 0;
      lcd.setCursor(cursor,1);
      lcd.print("*");
      delay(2);
    }
   }

}

has probado todo ?

Hola Oswal
Si,efectivamente he probado tu código y si funciona al 100%, gracias por eso,peroooo,,,
Lo que quería hacer a parte de esto,es lo siguiente:

Intento hacer es poner dos reles,
1 para frio
2 para calor,

1//tal que si la temperatura del sensor sea igual a la deseada,tanto rele1,rele2 se apaguen; parte de esto esta en el código que me pusiste,,;

2// que si la temperatura del sensor es más alta que la deseada, rele1 se active y rele 2 siga apagado

3// que si la temperatura del sensor sea menor que la deseada, rele1 se apague y siga apagado y rele2 se active.

Entre paso de rele1 a rele2 y viceversa tenga un tiempo de unos 2 minutos.

Tengo código casi terminado, lo que me ocurre es que al bajar la temperatura a mano 3 grados como estipula la isterisis,se enciende rele1,pero al subir tan solo 1 grado manualmente a través del pulsador,se encienden los 2 reles y se mantiene hasta que sibrepaso el calor deseado 3 grados del sensor.
Pongo el código tal como lo tengo ahora

if (Frio<= TempVal) {
  digitalWrite(Relay1,HIGH); 
  digitalWrite(Relay2,HIGH);        RelayEstatus = 0; // Apaga el rele1  para Frio y Rele2 para Calor
        RelayEstatus=0;
        lcd.setCursor(0,1); lcd.print("                ");
        }
  if (Frio>=TempVal){
  digitalWrite(Relay2,HIGH);// Apaga Rele2 para Calor
  RelayEstatus=0;
    }    
  
    if (Frio>TempVal+MargenTemp) {
        digitalWrite(Relay1,LOW);
        digitalWrite(Relay2,HIGH); RelayEstatus = 1; // Activa el rele1 para Frio y apaga rele2 Calor
        }
   if (Frio<TempVal+MargenTemp){
    digitalWrite(Relay2,LOW);
    digitalWrite(Relay1,HIGH); // Activa Rele2 para Calor y apaga Rele1 Frio 
    RelayEstatus=1;
// MargenTemp isterisis de temperatura 3°

Alguna sujetencia?

Perdon por cambiarte el nombre Osval..

No he querido postear nada hasta tenerlo todo o casi todo el codigo entendido.
Pido disculpas por ello si he molestado y hacer creer que una vez funciona todo,dejo de postear y ni siquiera agradecer por ello.
Sigo leyendo y averiguando como hacerlo

Hola estimado, si, hé perdido mi nombre y todos los posts anteriores así como mi pequeña reputation jejeje

oie para tu proyecto puedes analizar este aqui q está bien similar y tiene lo q te he sugerido

  1. chequear la temperatura cada cierto tiempo mediante comparación del tiempo transcurrido
  2. frio y calor

ahi tienes todas las pistas para arreglar tu código

Hola Osval,,esta vez lo he puesto bien,jj

Estoy buscando información referente a lo que me dijiste,eso por descontado,un pequeño lío entre tanto código leído,pero voy haciéndome a la idea.
Gracias por ponerme el enlace,lo miraré y empezaré a trastear.
Gracias nuevamente.

Es un poco difícil para el que no tiene ni idea de arduino,pero se va aprendiendo a base de tirones de orejas y copy pega con arreglos,jjj

Que tal si vas a Documentación y lees alguno de los libros alli sugeridos y ordenas las ideas. Estan en indice de temas tutoriales, 1ro o 2do hilo.
Si no se entiende lo básico es todo muy cuesta arriba.

1 Like

Buenos días Surbyte.
Gracias por el consejo,eso haré

Hola.

No se si esto está bien o no,pero por el momento funciona como yo espero,lo he probado y va bien.
Pongo el código anterior modificado.
Ya me contáis si puedo añadir algo más. Gracias

if (Frio<= TempVal) {
  digitalWrite(Relay1,HIGH);// Apaga el rele1 frio
        RelayEstatus=0;
lcd.setCursor(0,1); 
lcd.print("                ");
        }
  if (Frio>TempVal+MargenTemp)
    {
    digitalWrite(Relay1,LOW);
        RelayEstatus=1; // Enciende Rele1
    }
  if (TempVal>=Frio)
    {
     digitalWrite(Relay2,HIGH);// Apaga Relay2
         }
  if (TempVal>Frio+MargenTemp)
    digitalWrite(Relay2,LOW); // Enciende Relay2
}