Bloqueado. Conectar 2 sensores dht11 + relog ds3231.Ayuda

Hola Estoy haciendo un programa que lea dos sensores dht 11, 2 sensores lm35 y 1 fotorresistencia aqui todo va bien pero cuando meto el reloj ds3231 el primer sensor dht11 me da valores 0. y read failed.

Me he bloqueado si me echais una mano por favor. Muchas Gracias

Arduino Leonardo

//-----------------------------------------------Con reloj-----------------------------------

#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;

// Lectura del sensor DHT11 http://zygzax.com

#include <dht11.h>

dht11 DHT11;

#define DHT11PIN 2 //Sensor interior va al pin DIGITAL 2; indica aquí el que tú uses
#define DHT11DOS 4 //Sensor exterior va al pin DIGITAL 8; indica aquí el que tú uses

//Personalizable; Salida digital para el relé , uso la 10
int errorPin=5; //Personalizable; Para activar el LED de error, yo uso el 11 digital
int onPin=12; //Personalizable; Para indicar "en marcha"; pin 12 digital

int tempint; //Variables para guardar los valores y poder comparar
int tempext;
int humint;
int humext;

boolean data_error; //Guardamos el error en esta variable

// .................................................
float temp, temp_med = 0;
float temp1, temp1_med = 0;
float acum = 0, Vout; // variables secundarias
float res = 0.010; // en V/ºC
float Offset = 0.0;
float temp_max, temp_min;

// Muestras.............................

int i,num_muestras=300;

int luzValue = 0;
int humeValue = 0;

int luz;
int humedad;
int regarPin = 11;
int ventiladorPin=6;
int ventilador1Pin=7;
int sensorHumedad = A3;
int sensorLuz = A2;
int tempPin= A0;
int temp1Pin = A1;

int regar;
int ventilar;
int ventilar1;

void setup() {

    Wire.begin(); // Inicia el puerto I2C
    RTC.begin(); // Inicia la comunicación con el RTC
    //RTC.adjust(DateTime(__DATE__, __TIME__)); // Establece la fecha y hora (Comentar una vez establecida la hora)

    pinMode(regarPin, OUTPUT);
    pinMode(ventiladorPin, OUTPUT);
    pinMode(ventilador1Pin, OUTPUT);
     pinMode(errorPin, OUTPUT);
    pinMode(onPin, OUTPUT);

    delay(2000); //Esperamos 2 seg antes de leer los sensores

    Serial.begin(9600);

}
void loop() {

    data_error=false; //reseteamos el byte de comprobación
    int chk = DHT11.read(DHT11PIN);
    switch (chk){
          case DHTLIB_OK:
        //Si es OK, cogemos datos
                      humint=DHT11.humidity;
                      tempint=DHT11.temperature;

        break;
          //case DHTLIB_ERROR_CHECKSUM: //Desactivamos estas opciones, no nos interesan en la práctica en este caso
          //   display.println("Checksum error");
                      //display.display();
        //break;
          //case DHTLIB_ERROR_TIMEOUT:
        //display.println("Time out error");
                      //display.display();
        //break;
          default: //en caso de cualquier otro resultado (default); error desconocido
              data_error=true; //activamos el LED de error
              break;
    }  
      chk = DHT11.read(DHT11DOS); //comprobamos sensor externo
      chk=DHTLIB_OK;
      switch (chk){ //Comprobamos que los datos son válidos
          case DHTLIB_OK:
        //Si es OK cogemos los datos del externo
                      humext=DHT11.humidity;
                      tempext=DHT11.temperature;
        break;
          default:
            //Si no es OK, activamos el LED de error
            data_error=true;
            break;
          }

    // Sensores Lm35
    acum = 0;

    for (i = 0; i < num_muestras; i++) {
          Vout = analogRead(tempPin) * 0.00488758553275; // step * V/step = V
          temp = ( (Vout - Offset) / res); // V/(V/ºC) = ºC
          acum += temp;
          temp_med = acum / num_muestras;
          delay(10);
    }//LM35D

    acum = 0;

    for (i = 0; i < num_muestras; i++) {
          Vout = analogRead(temp1Pin) * 0.00488758553275; // step * V/step = V
          temp1 = ( (Vout - Offset) / res); // V/(V/ºC) = ºC
          acum += temp1;
          temp1_med = acum / num_muestras;
          delay(10);
    }luzValue = analogRead(sensorLuz);
    humeValue = analogRead(sensorHumedad);

    // ----------------------------------------------------
    // Imprimir valores
    // ----------------------------------------------------

    luz = (100.0 * luzValue) / 1024;
    humedad = (100.0 * humeValue) / 1024;

    DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
     

      // Imprimimos los datos actuales.
     Serial.print("DATA, TIME,");// hora en excel 1ª fila

    Serial.print(temp_med);
    Serial.print(",");

    Serial.print(temp1_med);
    Serial.print(",");

    Serial.print(tempint+1);
     Serial.print(",");
     
     Serial.print(tempext);

    Serial.print(",");
     Serial.print(humint);
      Serial.print(",");
      Serial.print(humext);

    Serial.print(",");
    Serial.print(luz);
    Serial.print(",");
    Serial.print(humedad);
    Serial.print(",");
    Serial.print(regar);
    Serial.print(",");
    Serial.print(ventilar);
    Serial.print(",");
    Serial.print(ventilar1);

    //RELOJ
    Serial.print(now.year(), DEC); // Año
    Serial.print('/');
    Serial.print(now.month(), DEC); // Mes
    Serial.print('/');
    Serial.print(now.day(), DEC); // Dia
    Serial.print(' ');
    Serial.print(now.hour(), DEC); // Horas
    Serial.print(':');
    Serial.print(now.minute(), DEC); // Minutos
    Serial.print(':');
    Serial.print(now.second(), DEC); // Segundos
    Serial.println();

                 
      if (data_error==true) //al menos uno de los sensores no funciona; mensaje de error y apagado de ventilador y reseteo contadores (como si se reseteara el programa)
      {
         
          digitalWrite(errorPin, HIGH);

          }    
      else
      {
          digitalWrite(errorPin, LOW);

         
                }

    // ----------------------------------------------------
    // Chequeo si debo regar
    // ----------------------------------------------------
    if( humedad <= 50 && luz < 70 && tempint < 30) {
        digitalWrite(regarPin, HIGH);
        regar=1;
    }else{
        digitalWrite(regarPin, LOW);
        regar=0;
    }// ----------------------------------------------------
    // Chequeo ventilador 0
    // ----------------------------------------------------
    if( humint >= 53 ) {
        digitalWrite(ventiladorPin, HIGH);
        ventilar=1;
    }else{
        digitalWrite(ventiladorPin, LOW);
        ventilar=0;
    }//------------------------------------------------------
    // Chequeo ventilador 1
    //---------------------------------------------------------
    if( temp >= 35 ) {
        digitalWrite(ventilador1Pin, HIGH);
        ventilar1=1;
    }else{
        digitalWrite(ventilador1Pin, LOW);
        ventilar1=0;
    }
    delay(50);
}

moderator: reformatted code using notepad++ and textFX

Mirando la librería DTH.h leo esto

// max timeout is 100 usec.
// For a 16 Mhz proc 100 usec is 1600 clock cycles
// loops using DHTLIB_TIMEOUT use at least 4 clock cycli
// so 100 us takes max 400 loops
// so by dividing F_CPU by 40000 we "fail" as fast as possible
#define DHTLIB_TIMEOUT (F_CPU/40000)

Lo que implica que cuando agregaste el RTC ese tiempo de 100uSeg logícamente se esta superando.

modifica DHTLIB_TIMEOUT en la librería claro.
Yo te recomiendo que copies la libreria junto al directorio donde tienes el programa para hacerla personalizada digamos. Tanto DTH.cpp como DTH.h

el tiempo que debes darle implica esperar lo que demora o el timeout del RTC. Buscalo en la librería RTC y dale ese plus que necesite el DTH.

Que hace lo mismo pero la parte del reloj ds 3231 es distinta.

El teme es que da el error al intentar poner 2 sensores dht. Probar solo el reloj y los 2 sensores dht y da el error si es solo un sensor dht no da error. si sabeis otra manera de plantearlo pues os agradeceria mogollon ya que he buscado mogollon y no encuentro gran cosa.

Muchas gracias

//-------------2 dht, 2 lm35, 1 fotorresistencia, reloj ds3231
 
#include <Wire.h>
#include <gRTC.h>

gRTC rtc;

#include <dht11.h>

dht11 DHT11;

#define DHT11PIN 2 //Sensor interior va al pin DIGITAL 2; indica aquí el que tú uses
#define DHT11DOS 4 //Sensor exterior va al pin DIGITAL 8; indica aquí el que tú uses

//Personalizable; Salida digital para el relé , uso la 10
int errorPin=5; //Personalizable; Para activar el LED de error, yo uso el 11 digital
int onPin=11; //Personalizable; Para indicar "en marcha"; pin 12 digital

int tempint; //Variables para guardar los valores y poder comparar
int tempext;
int humint;
int humext;

boolean data_error; //Guardamos el error en esta variable

// .................................................
float temp, temp_med = 0;
float temp1, temp1_med = 0;
float acum = 0, Vout; // variables secundarias
float res = 0.010; // en V/ºC
float Offset = 0.0;
float temp_max, temp_min;

// Muestras.............................

int i,num_muestras=300;

int luzValue = 0;
int humeValue = 0;

int luz;
int humedad;
int regarPin = 12;
int ventiladorPin=6;
int ventilador1Pin=7;
int sensorHumedad = A3;
int sensorLuz = A2;
int tempPin= A0;
int temp1Pin = A1;

int regar;
int ventilar;
int ventilar1;

void setup()
{    pinMode(regarPin, OUTPUT);
    pinMode(ventiladorPin, OUTPUT);
      pinMode(ventilador1Pin, OUTPUT);
      pinMode(errorPin, OUTPUT);
      pinMode(onPin, OUTPUT);
     
     delay(2000); //Esperamos 2 seg antes de leer los sensores
     
     Serial.begin(9600);
    while(!Serial);
     delay(1000);
}void loop()
{    Tiempo t = rtc.getDatos();

     // HORA
     Serial.print(t.hora24h, DEC);   Serial.print(":");
     Serial.print(t.minutos, DEC);   Serial.print(":");
     Serial.print(t.segundos, DEC);  Serial.print(" del ");

     // FECHA
     Serial.print(t.diaMes, DEC);    Serial.print("/");
     Serial.print(t.mes, DEC);       Serial.print("/");
     Serial.print(t.anio, DEC);
     
     // TEMPERATURA
     Serial.print(", Tem: ");
     Serial.println(rtc.getTemperature());  
     
     delay(1000);
     
     
     data_error = false; //reseteamos el byte de comprobación

     int chk = DHT11.read(DHT11PIN);
     switch (chk)
    {
           case DHTLIB_OK: //Si es OK, cogemos datos
        humint=DHT11.humidity;
                tempint=DHT11.temperature;
        break;
           //case DHTLIB_ERROR_CHECKSUM: //Desactivamos estas opciones, no nos interesan en la práctica en este caso
           //   display.println("Checksum error");
                       //display.display();
        //break;
           //case DHTLIB_ERROR_TIMEOUT:
        //display.println("Time out error");
                       //display.display();
        //break;
           default: //en caso de cualquier otro resultado (default); error desconocido
               data_error=true; //activamos el LED de error
               break;
    }  

    chk = DHT11.read(DHT11DOS); //comprobamos sensor externo
    chk = DHTLIB_OK;
    switch (chk)
    { //Comprobamos que los datos son válidos
           case DHTLIB_OK:  // Si es OK cogemos los datos del externo
                       humext=DHT11.humidity;
                       tempext=DHT11.temperature;
        break;
           default:
             //Si no es OK, activamos el LED de error
             data_error=true;
             break;
           }
     

    // Sensores Lm35
    acum = 0;
     
     for (i = 0; i < num_muestras; i++) {
           Vout = analogRead(tempPin) * 0.00488758553275; // step * V/step = V
           temp = ( (Vout - Offset) / res); // V/(V/ºC) = ºC
           acum += temp;
           temp_med = acum / num_muestras;
           delay(10);
         }
     
     
     //LM35D
     
     acum = 0;
     
     for (i = 0; i < num_muestras; i++) {
           Vout = analogRead(temp1Pin) * 0.00488758553275; // step * V/step = V
           temp1 = ( (Vout - Offset) / res); // V/(V/ºC) = ºC
           acum += temp1;
           temp1_med = acum / num_muestras;
           delay(10);
         }
     
     luzValue = analogRead(sensorLuz);
     humeValue = analogRead(sensorHumedad);

    // ----------------------------------------------------
    // Imprimir valores
    // ----------------------------------------------------

    luz = (100.0 * luzValue) / 1024;
    humedad = (100.0 * humeValue) / 1024;

     
     
       // Imprimimos los datos actuales.
      Serial.print("DATA, TIME,");// hora en excel 1ª fila

    Serial.print(temp_med);
    Serial.print(",");

    Serial.print(temp1_med);
    Serial.print(",");

    Serial.print(tempint+1);
      Serial.print(",");
     
      Serial.print(tempext);

     Serial.print(",");
      Serial.print(humint);
       Serial.print(",");
       Serial.print(humext);

    Serial.print(",");
    Serial.print(luz);
    Serial.print(",");
    Serial.print(humedad);
    Serial.print(",");
    Serial.print(regar);
     Serial.print(",");
    Serial.print(ventilar);
     Serial.print(",");
    Serial.println(ventilar1);

                 
       if (data_error==true) //al menos uno de los sensores no funciona; mensaje de error y apagado de ventilador y reseteo contadores (como si se reseteara el programa)
       {
           
           digitalWrite(errorPin, HIGH);

           }    
       else
       {
           digitalWrite(errorPin, LOW);

           
                 }

    // ----------------------------------------------------
    // Chequeo si debo regar
    // ----------------------------------------------------
    if( humedad <= 50 && luz < 70 && tempint < 30) {
        digitalWrite(regarPin, HIGH);
        regar=1;
    }
    else{
        digitalWrite(regarPin, LOW);
        regar=0;
    }
     // ----------------------------------------------------
    // Chequeo ventilador 0
    // ----------------------------------------------------
    if( humint >= 53 ) {
        digitalWrite(ventiladorPin, HIGH);
        ventilar=1;
    }
    else{
        digitalWrite(ventiladorPin, LOW);
        ventilar=0;
    }
    //------------------------------------------------------
    // Chequeo ventilador 1
    //---------------------------------------------------------
    if( temp >= 35 ) {
        digitalWrite(ventilador1Pin, HIGH);
        ventilar1=1;
    }
    else{
        digitalWrite(ventilador1Pin, LOW);
        ventilar1=0;
    }
    delay(50);
}

moderator: used notepad + textFX to reformat the code

Primero es la segunda vez que presentas códigos sin [ code ] [/ code ] que esta en la barra de edición. Busca hasta que leas code y edita tu ultimo post.
No te excuses conque es tu primer post. Debes leer como se postea. Son normas del foro.

Segundo:

Que hace lo mismo pero la parte del reloj ds 3231 es distinta.
El teme es que da el error al intentar poner 2 sensores dht. Probar solo el reloj y los 2 sensores dht y da el error si es solo un sensor dht no da error. si sabeis otra manera de plantearlo pues os agradeceria mogollon ya que he buscado mogollon y no encuentro gran cosa.
Muchas gracias

Que pasó con lo que te sugerí, modificaste

#define DHTLIB_TIMEOUT (F_CPU/40000)

en la librería DTH.h?

Coincido, ya ayer Me di cuenta con la segunda pregunta que se me estaba convirtiendo la pregunta en una chapuza guarrada. Mi intencion seria borrar todo (si tu puedes hacer esto te agradeceria) y formular la pregunta de nuevo mas sencilla y con los protocolos que... "ahora los busco" perdon.

Sobre si he probado lo que me dices pues ahi ando pero soy nuevo en esto y no veas que puerta me has abierto por ahi, y me he quedado eh.. vamos estoy estudiando el tema de librerias editarlas donde estan incorporarlas al programa etc no habia tocado esto, todo lo ago con programa de otros, los estudio y los ago a mi manera, ni siquiera encuentro la linea de time out en la libreria como dices, quiza sea otra libreria de echo tengo un programa con la libreria al lado, Por ello de formular mejor la pregunta y con mas informacion.

Muchas gracias.

El único que puede borrar un post es el autor o el moderador.
Yo no soy moderador.

He estado estos dias con tema de librerias me he vuelto un poco majara en cuanto las cambias de sitio ya no van, si la agrego con el IDE de arduino Añadir archivo, tambien dejan de ir, vamos que no logro poner ficheros biblioteca en la carpeta del programa y es un tema que me interesa por que supongo que puedo llevar el programa a otro ordanador y no hace falta instalar las librerias...son preguntas me hago pues tampoco encuentro mucha mas informacion mas haya de crear una biblioteca con plantillas, si aprendi a editar los archivos de la biblioteca pero no encuentro niguna linea en Biblioteca DHT.h con la instrucion que me dices.
Paso el codigo del fichero dht.h de la biblioteca.

Si sabes alguna pagina sobre aprender tema librerias para estas dudas agradeceria.

MuchasGracias

#ifndef DHT_H
#define DHT_H
#if ARDUINO >= 100
 #include "Arduino.h"
#else
 #include "WProgram.h"
#endif

/* DHT library 

MIT license
written by Adafruit Industries
*/

// how many timing transitions we need to keep track of. 2 * number bits + extra
#define MAXTIMINGS 85

#define DHT11 11
#define DHT22 22
#define DHT21 21
#define AM2301 21

class DHT {
 private:
  uint8_t data[6];
  uint8_t _pin, _type, _count;
  unsigned long _lastreadtime;
  boolean firstreading;

 public:
  DHT(uint8_t pin, uint8_t type, uint8_t count=6);
  void begin(void);
  float readTemperature(bool S=false);
  float convertCtoF(float);
  float computeHeatIndex(float tempFahrenheit, float percentHumidity);
  float readHumidity(void);
  boolean read(void);

};
#endif

Intenta hablar en castellano neutro. Los mexicanismos (espero no equivocarme en tu nacionalidad) a veces no son bien entendidos por otras personas como yo mismo que soy de argentina. Todos debemos evitar nuestros localismos. Gracias.

No encuentras ninguna linea porque ese es el header file, busca el cpp file. El que termina con la extensión CPP.
Y sino publica el enlace o sube ambos archivos con el atachado por favor no copiando y pegando porque he tenido problemas luego, no se los demas con algunas Copy & paste que guardan algunos caracteres en un formato distinto al que entiende el compilador.
Junta todo, un archivo comprimido zip o rar y lo subes o ambos por separado usando el adjunto de archivos.

Note the 0.1.17 version of my DHT library does not work for the DHT11. A fix is underway but needs to be verified. Please use the 0.1.15 version, see attachment

Mando Libreria

Dht-Library.zip: para sensores dht11

Que junto con libreria rtclib (que por ahora no puedo mandar ya que esta en extension.rar)

uso en este programa de:

2 sensores dht11 y Reloj DS3231. (Si quitamos lo referente a reloj los sensores funcionan si lo ponemos da error en un sensor)

// Reloj Ds3231----------------
#include <gRTC.h>

gRTC rtc;

// Dht11---------------------

#include "DHT.h"  //Añadimos la libreria con la cual trabaja nuestro sensor
#include <Wire.h>


#define HT1 2 //Pin sensor dht1
#define HT2 4 //Pin sensor dht2

// El sensor que vas a emplear. En este caso usamos el DHT11
#define DHTTYPE DHT11   // DHT 11 

DHT dht1 (HT1, DHTTYPE);  //Indica el pin con el que trabajamos y el tipo de sensor
DHT dht2 (HT2, DHTTYPE);



void setup()   {
 
 Serial.begin(9600);     // Configuramos la conexion serie
 
 //RELOJ---------------------------------
 
  while(!Serial);
  delay(1000);
  Tiempo m = rtc.getDatos();
  // Permite la configurar de la fecha y la hora.
  // Descomentar para usar. Despues volver a comentar o grabar de nuevo el
  // codigo en el Arduino, si no cada vez que se reinicie se reconfigurara.
  
  // rtc.setFecha( MIERCOLES, 1, ENERO, 2014 );
  // rtc.setTiempo( 00, 00, 00 );
 
 
  // Sensores Dht1-------------------
  
  dht1.begin();  //Iniciamos el sensor
  dht2.begin();
  

  
  }

void loop() 
{
  //Sensores dht11
 
  float h1, h2, t1, t2 = 0;
  // La lectura de la temperatura o de la humedad lleva sobre 250 milisegundos  
  // La lectura del sensor tambien puede estar sobre los 2 segundos (es un sensor muy lento)
  h1 = dht1.readHumidity();  //Guarda la lectura de la humedad en la variable float h
  t1 = dht1.readTemperature();  //Guarda la lectura de la temperatura en la variable float t

  h2 = dht2.readHumidity();  //Guarda la lectura de la humedad en la variable float h
  t2 = dht2.readTemperature();  //Guarda la lectura de la temperatura en la variable float t

   
  
  
  //Mostramos mensaje con valores actuales de humedad y temperatura, asi como maximos y minimos de cada uno de ellos
  
  
 Serial.print("Humedad 1: ");
  Serial. print(h1);
  Serial. print(" %");
  

   Serial.print("Temp 1: ");
   Serial.print(t1);
   Serial.println(" *C");
  
  
  
  Serial. print("Humedad 2: ");
 Serial.  print(h2);
  Serial. print(" %");
  
  Serial. print("Temp 2: ");
  Serial. print(t2);
  Serial. println(" *C");


delay (1000);
 
 
 // Reloj Ds3231 Mostramos Datos Hora Fecha y Temperatura
 Tiempo m = rtc.getDatos();


  // HORA
  Serial.print(m.hora24h, DEC);   Serial.print(":");
  Serial.print(m.minutos, DEC);   Serial.print(":");
  Serial.print(m.segundos, DEC);  Serial.print(" del ");

  // FECHA
  Serial.print(m.diaMes, DEC);    Serial.print("/");
  Serial.print(m.mes, DEC);       Serial.print("/");
  Serial.print(m.anio, DEC);
  
  // TEMPERATURA
  Serial.print(", Tem: ");
  Serial.println(rtc.getTemperature());  
delay(1000);
  }

p.d. -Sigo sin encontrar la linea

DHT-Library.zip (4.04 KB)

Mirando la librería DHT encuentro esto

if (!firstreading && ((currenttime - _lastreadtime) < 2000)) {
    return true; // return last correct measurement

parece necesitas 2 segundos para tener lecturas continuas claro que lo hace sin detener la ejecución del resto del programa lo que de algún modo debe estar conspirando con el mismo.

A título de prueba sugiero que pongas un delay(2500); luego de la lectura de ambos sensores empezando por 1 y luego prueba con 1 en cada sensor.

Veremos que ocurre. No es una solución muy inteligente pero es para saber donde estamos parados.
Luego buscaremos el problema a ver, tal vez alguien lo haya resuelto de manera mas eficaz que generando dos retardos burdos como los que te indico.

CORRECCION:
Me corrijo a mi mismo. Es solo para la primer lectura, asumí que era siempre asi que ve si puedes generar un retardo en el setup o hacer que tengan una 1era lectura con ese tiempo y luego lecturas normales.

Puse los delay como dijiste pero nada.

Envio Libreria DS1307_DS3231_v1.3.ZIP que usa el programa para el reloj (que se me olvido..), para mas informacion y por si pudiera valer de algo.

DS1307_DS3231_v1.3 (2).zip (6.08 KB)

Hola la verdad que no he seguido estudiando este tema porque quise cambiar a sensores de humedad mejores y use los DHT 22 Y

Hola la verdad que no he seguido estudiando este tema porque quise cambiar a sensores de humedad mejores y use los DHT 22 y me di cuenta que con estos sensores no me dan ningun problema he puesto hasta 3 sensores DHT 22 y sin problema, el motivo no lo se pero dejo ahi esto por aportar algo y si a alguien le vale.