[SOLUCIONADO] MANEJO HUMEDAD RELATIVA+DATA LOGGING

Buenas tardes comunidad:

Es mi primer post, he leído mucho en esta comunidad y he podido solventar muchas inquietudes sobre la programación en Arduino. Pongo en contexto el proyecto:

Estoy utilizando un shield para el almacenamiento de datos de un sensor de humedad relativa y temperatura, hasta ahí no hay problema, El siguiente paso fue conectar establecer unas condiciones de humedad para que dada la condición este me diera un pulso a un re y se pudiera activar un ventilador. [Ahí es donde entra en conflicto mi proyecto, cuando tengo todo el montaje hecho y se cumplen las condiciones para prender el ventilador no da respuesta el pin que había asignado.

Ensaye separando los codigos, pensando que pudiera ser un conflicto con las variables pero descarte eso. (Aunque no estoy seguro si pueda ser). Y probé los códigos, cuando no tengo conectado el shield el pin que asigne para mandar la señal funciona, pero si tengo conectado el shield y cargo el código para la lectura no me responde el pin.

Mi pregunta es. ¿Puede ser un error en los códigos? ¿ O puede que la placa no pueda dar suficiente potencia?.

Codigo logger+Condiciones:

#include <DHT.h>
#include <SD.h>
#include <Wire.h>
#include <SPI.h>    
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define DHTTYPE DHT22
char daysOfTheWeek[7][12] = {"Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado"};
float temp=0;
float HR=0;
int DHTPin=6;
const int chipSelect = 10; 
const bool eco = true ;
int count = 0 ; 
DHT dht(DHTPin, DHTTYPE);
RTC_DS1307 rtc;
File logfile; 
     
void setup() 
{   lcd.noBacklight();
    lcd.init();
    Serial.begin(57600);
    pinMode(13, OUTPUT);
    pinMode(5, OUTPUT) ; 
    pinMode(7, OUTPUT) ;   
    pinMode(6, INPUT_PULLUP) ; 
    pinMode(chipSelect, OUTPUT); 
    digitalWrite(7, HIGH) ; 
    digitalWrite(5, LOW) ;

    if (!SD.begin(chipSelect)) 
          Serial.print("No hay tarjeta SD.");
    else
          Serial.println("Tarjeta SD inicializada.");

  // Elaboracion fichero de registro
  char filename[] = "LOGGER00.CSV";
  for (uint8_t i = 0; i < 100; i++) 
     {  
        filename[6] = i/10 + '0'; // Determina el primer digito del archivo
        filename[7] = i%10 + '0'; // Determina el segundo digito de archivo
        if (! SD.exists(filename)) // Si no existe el fichero, lo crea
            { 
              logfile = SD.open(filename, FILE_WRITE); 
              break;  // Termina de hacer el loop
            }
     }
       if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");

  }
  if (! logfile) 
      Serial.print("No se pudo crear el fichero de registro");
      Serial.print("Registrando en: ");   
      Serial.println(filename);
      lcd.print("Registrando en:");
      lcd.setCursor(0,1);
      lcd.print(filename);
      delay(5000);  
             
  // Verificar RTC
 
  Wire.begin();  
  if (!rtc.begin()) 
      logfile.println("No hay RTC.");   
  else
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      Serial.println("RTC correcto. Iniciando captura de datos");   
      logfile.print("Fecha") ; 
      logfile.print(", ");
      logfile.print("Dia");
      logfile.print(", ");
      logfile.print("Hora");
      logfile.print(", ");  
      logfile.print("Temperatura (C)") ; 
      logfile.print(", "); 
      logfile.println("Humedad Relativa (%)") ;
      logfile.println("Estado"); 

}

void loop() 
{ HR=dht.readHumidity();
  temp=dht.readTemperature(); 
  DateTime now = rtc.now();
      if(HR<60)
     {
       digitalWrite(13, LOW);
       Serial.println("Apagado ");
       delay(3000);
     }
     if(HR>75)
     {
      digitalWrite(13, HIGH);
      Serial.println("Encendido ");
      delay(3000);
     }

     if(HR<=75 && HR>=60)
     {
      digitalWrite(13,HIGH);
      Serial.println ("Encendido ");
      delay(3000);
      }
  
          {  now = rtc.now();                  
             logfile.print(now.year(), DEC);
             logfile.print('/');
             logfile.print(now.month(), DEC);
             logfile.print('/');
             logfile.print(now.day(), DEC);
             logfile.print(", ");
             logfile.print(" (");
             logfile.print(daysOfTheWeek[now.dayOfTheWeek()]);
             logfile.print(") ");
             logfile.print(", ");
             logfile.print(now.hour(), DEC);
             logfile.print(':');
             logfile.print(now.minute(), DEC);
             logfile.print(':');
             logfile.print(now.second(), DEC);
             logfile.print(", ");
             logfile.print(temp);
             logfile.print(", ");
             logfile.println(HR);
   
             if ( count++ > 5) 
                {   
                  logfile.flush(); // Para forzar la escritura en la SD
                  count = 0 ;       // Cada 5 lecturas
                }
             if (eco)
              {  
                Serial.print(now.year(), DEC);
                Serial.print('/');
                Serial.print(now.month(), DEC);
                Serial.print('/');
                Serial.print(now.day(), DEC);
                Serial.print(" (");
                Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
                Serial.print(") ");
                Serial.print(now.hour(), DEC);
                Serial.print(':');
                Serial.print(now.minute(), DEC);
                Serial.print(':');
                Serial.print(now.second(), DEC);
                Serial.println();
                Serial.print(", ");
                Serial.print(count);
                Serial.print(", ");
                Serial.print(temp);
                Serial.print(", ");
                Serial.println(HR);                
              }
              delay(1000);
              
lcd.clear();
lcd.print("Temp:");
lcd.print(temp);
lcd.print(" C");
lcd.setCursor(0,1);
lcd.print("H.R Amb:");
lcd.print(HR);
lcd.print("%");
          }
       delay(1000);           
}

Agradezco mucho a quien pueda ayudarme a identificar cual puede ser mi error.

Placa: Arduino Uno
Sensor: DHT-22
Logger: Adafruit Data Logger Shield

Muchas Gracias

Tal vez sea esta tontería
Defines a HR como float pero luego

if(HR<60)  {
      //
  }
  if (HR > 75) {
     //
  }

Tus if son como si fueran enteros.
Debe ser asi

if(HR<60.0)  {
      //
  }
  if (HR > 75.0) {
     //
  }

No sería más sencillo así?

if (HR < 60)
  {
    digitalWrite(13, LOW);
    Serial.println("Apagado ");
  }
  else
  {
    digitalWrite(13, HIGH);
    Serial.println("Encendido ");
  }

No entiendo para qué delays por ahí…

Lucario no entendiste el problema. Los condicionales no se ejecutan porque HR es float y uso 60 y 75 como entero. Deben tener .0 punto decimal Cero para que se cumplan las condiciones.

Estamos de acuerdo.

La idea era hacerle notar que:

No es necesario retrasar la ejecución del programa solo para mantener el estado del pin. No creo que el sensor dé lecturas inestables.

      if(HR<60)
     {
       digitalWrite(13, LOW);
       Serial.println("Apagado ");
       delay(3000);
     }
     if(HR>75)
     {
      digitalWrite(13, HIGH);
      Serial.println("Encendido ");
      delay(3000);
     }

     if(HR<=75 && HR>=60)
     {
      digitalWrite(13,HIGH);
      Serial.println ("Encendido ");
      delay(3000);
      }

Eso equivale a:

if (HR < 60)
  {
    digitalWrite(13, LOW);
    Serial.println("Apagado ");
  }
  else
  {
    digitalWrite(13, HIGH);
    Serial.println("Encendido ");
  }

surbyte: Muchas gracias por la observación, al colocar el decimal empiezo a tener una sensibilidad adecuada para la respuesta, así que de aquí en adelante siempre tendré en cuenta al momento de declarar esas variables con float.

Lucario448: Muchas gracias por la observación, tenia dudas sobre si el estado del pin se mantenía sin colocar un delay, era mas para que se mantuviera el ventilador en funcionamiento pero dada la recomendación voy a removerlos.

Sin embargo con las dos recomendaciones seguía persistiendo el problema ( No me daba señal el pin 13), así que decidí cambiar el pin de salida al pin 8; y empezo a funcionar sin problema. Dado eso revise el esquema del logger y encontré que el pin 13 es el SCK del logger. No se si eso pueda generar un conflicto pero mi conclusión puede ir por ese lado. ¿ Que opinan ustedes puede ser ese pequeño detalle?

Adjunto la variación del sketch y una imagen del esquema del logger:

#include <DHT.h>
#include <SD.h>
#include <Wire.h>
#include <SPI.h>    
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define DHTTYPE DHT22
char daysOfTheWeek[7][12] = {"Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado"};
float temp=0;
float HR=0;
int DHTPin=6;
const int chipSelect = 10; 
const bool eco = true ;
int count = 0 ; 
DHT dht(DHTPin, DHTTYPE);
RTC_DS1307 rtc;
File logfile; 
     
void setup() 
{   lcd.noBacklight();
    lcd.init();
    Serial.begin(57600);
    pinMode(7, OUTPUT);
    pinMode(5, OUTPUT) ; 
    pinMode(8, OUTPUT) ;   
    pinMode(6, INPUT_PULLUP) ; 
    pinMode(chipSelect, OUTPUT);
    digitalWrite(5, LOW);
    digitalWrite(7, HIGH); 

    if (!SD.begin(chipSelect)) 
          Serial.print("No hay tarjeta SD.");
    else
          Serial.println("Tarjeta SD inicializada.");

  // Elaboracion fichero de registro
  char filename[] = "LOGGER00.CSV";
  for (uint8_t i = 0; i < 100; i++) 
     {  
        filename[6] = i/10 + '0'; // Determina el primer digito del archivo
        filename[7] = i%10 + '0'; // Determina el segundo digito de archivo
        if (! SD.exists(filename)) // Si no existe el fichero, lo crea
            { 
              logfile = SD.open(filename, FILE_WRITE); 
              break;  // Termina de hacer el loop
            }
     }
  if (! logfile) 
      Serial.print("No se pudo crear el fichero de registro");
      Serial.print("Registrando en: ");   
      Serial.println(filename);
      lcd.print("Registrando en:");
      lcd.setCursor(0,1);
      lcd.print(filename);
      delay(5000);  
             
  // Verificar RTC
 
  Wire.begin();  
  if (!rtc.begin()) 
     logfile.println("No hay RTC.");   
  else
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      Serial.println("RTC correcto. Iniciando captura de datos");   
      logfile.print("Fecha") ; 
      logfile.print(", ");
      logfile.print("Dia");
      logfile.print(", ");
      logfile.print("Hora");
      logfile.print(", ");  
      logfile.print("Temperatura (C)") ; 
      logfile.print(", "); 
      logfile.println("Humedad Relativa (%)") ;
      logfile.println("Estado"); 
}
void loop() 
{ HR=dht.readHumidity();
  temp=dht.readTemperature(); 
  DateTime now = rtc.now();
      if(HR<60.0)
     {
       digitalWrite(8, LOW);
       Serial.println("Apagado ");
     }
     if(HR>75.0)
     {
      digitalWrite(8, HIGH);
      Serial.println("Encendido ");
     }

     if(HR<=75.0 && HR>=60.0)
     {
      digitalWrite(8,HIGH);
      Serial.println ("Encendido ");
      }
  
          {  now = rtc.now();                  
             logfile.print(now.year(), DEC);
             logfile.print('/');
             logfile.print(now.month(), DEC);
             logfile.print('/');
             logfile.print(now.day(), DEC);
             logfile.print(", ");
             logfile.print(" (");
             logfile.print(daysOfTheWeek[now.dayOfTheWeek()]);
             logfile.print(") ");
             logfile.print(", ");
             logfile.print(now.hour(), DEC);
             logfile.print(':');
             logfile.print(now.minute(), DEC);
             logfile.print(':');
             logfile.print(now.second(), DEC);
             logfile.print(", ");
             logfile.print(temp);
             logfile.print(", ");
             logfile.println(HR);
   
             if ( count++ > 5) 
                {   
                  logfile.flush(); // Para forzar la escritura en la SD
                  count = 0 ;       // Cada 5 lecturas
                }
             if (eco)
              {  
                Serial.print(now.year(), DEC);
                Serial.print('/');
                Serial.print(now.month(), DEC);
                Serial.print('/');
                Serial.print(now.day(), DEC);
                Serial.print(" (");
                Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
                Serial.print(") ");
                Serial.print(now.hour(), DEC);
                Serial.print(':');
                Serial.print(now.minute(), DEC);
                Serial.print(':');
                Serial.print(now.second(), DEC);
                Serial.println();
                Serial.print(", ");
                Serial.print(count);
                Serial.print(", ");
                Serial.print(temp);
                Serial.print(", ");
                Serial.println(HR);                
              }
              delay(1000);
              
lcd.clear();
lcd.print("Temp:");
lcd.print(temp);
lcd.print(" C");
lcd.setCursor(0,1);
lcd.print("H.R Amb:");
lcd.print(HR);
lcd.print("%");
          }
       delay(1000);           
}

Muchisimas gracias por la ayuda, para mi podría darse como SOLUCIONADO, pero pues no esta demás el poder tener una segunda opinión.

jsbolivarz: Sin embargo con las dos recomendaciones seguía persistiendo el problema ( No me daba señal el pin 13), así que decidí cambiar el pin de salida al pin 8; y empezo a funcionar sin problema. Dado eso revise el esquema del logger y encontré que el pin 13 es el SCK del logger. No se si eso pueda generar un conflicto pero mi conclusión puede ir por ese lado. ¿ Que opinan ustedes puede ser ese pequeño detalle?

Si usas Arduino Uno, el pin 13 está reservado para el SCK del SPI (protocolo que se utiliza para comunicarse con la tarjeta SD). Has notado cómo el LED incorporado parpadea (o se enciende) cuando se lee/escribe a la tarjeta SD? Definitivamente iban a haber conflictos.

Si usas Arduino Mega, no habría problemas con el pin 13.

PD: por "Gateway time-out" es que me tardé en responder.

Lucario 448 Vale muchas gracias por el dato, creo que me pondre a leer un poco mas sobre el SPI del arduino, soy bastante noob en esto.

¿ He tratado de buscar un editor del post para dar solucionado pero no lo encuentro? ¿ Y he buscado en la normas pero no he encontrado respuesta de como dan edición? Si alguien me puede explicar para darle cierre al tema agradeceria mucho.

PD: Cambie el subject en esta respuesta esperando a que funcione, la verdad no se si sirva.