[SOLUCIONADO] Encender Rele a una hora determinada y apagarlo a otra

Hola buenas, he leido varios temas parecidos por el foro y usado sus ejemplos y nada me ha podido ayudar, soy nuevo en este mundillo (interesantisimo por cierto) bueno a lo que voy, como rtc estoy usando un DS3231 y con el quiero que mi arduino UNO lleve el control del tiempo para poder encender el rele ( es una chorrada es para poner en marcha el filtro de la piscina de nivel que tengo en la terraza, pero por algo se empieza) agradeceria cualquier tipo de ayuda, ha sido un drama para mi lograr poner en hora el rtc, he copiado como hacia la gente los IF y nada, el relel lo probe y va osea que descarto que sea el rele, os dejo una copia del codigo que estoy usando, es un test con un lcd 16x2 que tengo por auqi y un dht22 pero que prescendire de todos los extras y dejare el DS3231 y el rele.

Gracias!

#include <Time.h>
#include <Wire.h>
#include <hd44780.h>
#include <hd44780_I2Cexp.h>
#include <hd44780_I2Clcd.h>
#include <hd44780_pinIO.h>
#include <DS3231.h>
#include "cactus_io_DHT22.h"

#define DHT22_PIN 2
DHT22 dht (DHT22_PIN);

// Init the DS3231 using the hardware interface
DS3231  rtc(SDA, SCL);
time_t   b; 
Time t;    //inicia la estructura tiempo/fecha
const int rele = 8 ;


hd44780_I2Cexp lcd; // declare lcd object: auto locate & config exapander chip

// LCD geometry
const int LCD_ROWS = 2;
const int LCD_COLS = 16;



void setup()
{


// pinMode(rele,  OUTPUT) ;
  // Setup Serial connection
  Serial.begin(115200);
  // Uncomment the next line if you are using an Arduino Leonardo
  //while (!Serial) {}
// initialize LCD with number of columns and rows: 
  if( lcd.begin(LCD_COLS, LCD_ROWS))

 // Se inicial la interfaz I2c
  Wire.begin();
  // Iniciamos el Reloj
  rtc.begin();
  // Iniciamos el Termometro DHT22
  dht.begin();

 rtc.setTime ( 12,  59,  30);  //Descomentar Para Fijar Hora
 rtc.setDate (8, 13, 2016); //Descomentar para fijar fecha Formato fecha americana


}

void loop()
{
  
  dht.readHumidity ();
  dht.readTemperature();
    if (isnan(dht.humidity) || isnan(dht.temperature_C)) {
Serial.println("DHT sensor read failure!");
return;
    }
  // recibir Datos del DS3231
 t = rtc.getTime();
  // Send current temperature
  Serial.print ("\t    ");
  Serial.print("Fecha: \t");  
  Serial.print (rtc.getDateStr() );
  Serial.print ("\t    ");
  Serial.print ("\t    ");
  Serial.print ("Hora: \t"); 
  Serial.println (rtc.getTimeStr() );
  Serial.print ("\t    ");
  Serial.print ("\t    ");
  Serial.print("Temperatura: \t");
  Serial.print(dht.temperature_C);
  Serial.println(" C");
  Serial.print ("\t    ");
  Serial.print ("\t    ");
  Serial.print ("Humedad: \t");
  Serial.print(dht.humidity);
  Serial.print ("\t    ");
  Serial.println ("");
  //delay (900);

 lcd.setCursor(0, 0);
 lcd.print ("Humedad: ");
 lcd.print (dht.humidity);
 lcd.print ("%");
 lcd.print (" Sensa. Term.: ");
 lcd.print (dht.computeHeatIndex_C());
 lcd.print (" C");

lcd.scrollDisplayLeft();
 
lcd.setCursor (0, 1);


lcd.print ("Temperatura: ");
lcd.print (dht.temperature_C);
lcd.print (" C "  );
lcd.print ("Hora: ");
lcd.print (rtc.getTimeStr());
lcd.scrollDisplayLeft();
delay (400);

//control de las luces segun la hora:
//
//void luces()


if( t.hour == 13 && t.min == 00 && t.sec == 00)
{
digitalWrite (rele, HIGH);
}

if( t.hour == 13 && t.min == 02 && t.sec == 00)
{
digitalWrite (rele, LOW);
}






/*
digitalWrite (rele, HIGH);
delay (2000);

digitalWrite (rele, LOW);

delay (2000);
*/


}

Pd.

se que esas lineas hara sangrar muchos ojos experimentados, pero bueno ya lo ire puliendo!

Muchas Gracias!

pd.2. aqui estan las librerias que utilice.

Muchas Gracias a todos por vuestra ayuda combinando vuestros posts me ha quedado Genial! Gracias de nuevo

Así por encima, creo que tienes un problema en la condición IF.
Creo que es demasiado exacta, es decir tu pides una acción en t.hour == 13 && t.min == 02 && t.sec == 00
Es es un segundo exacto de tiempo de esa hora y ¿que pasa si en ese momento justo el Arduino está haciendo otra cosa?, pues que el momento de la condición habrá pasado y no hará nada.
Tienes muchos print y un delay de 400 y eso se lleva quizás ese segundo critico

Seamos mas flexibles

Prueba algo que yo usé una vez (con otra librería)

if (now.hour() == 22 && now.minute() == 0 && (now.second() >= 21 && now.second() <= 26))

Pobre Arduino, dale un margen para que respire

Yo te recomiendo usar estas librerías Time y TimeAlarms

/*
 * TimeAlarmExample.ino
 *
 * This example calls alarm functions at 8:30 am and at 5:45 pm (17:45)
 * and simulates turning lights on at night and off in the morning
 * A weekly timer is set for Saturdays at 8:30:30
 *
 * A timer is called every 15 seconds
 * Another timer is called once only after 10 seconds
 *
 * At startup the time is set to Jan 1 2011  8:29 am
 */
 
#include <Time.h>         // https://www.pjrc.com/teensy/td_libs_Time.html
#include <TimeAlarms.h>   // https://www.pjrc.com/teensy/td_libs_TimeAlarms.html

void setup()
{
  Serial.begin(9600);
  setTime(12,59,30,13, 8,16); // set time to 12:59:30 13/08/2016 
  // create the alarms 
  Alarm.alarmRepeat(13, 0, 0, Arranque);  // 13:00:00 todos los dias
  Alarm.alarmRepeat(13, 2, 0, Apagado);   // 13:02:00 todos los dias 
}

void  loop(){  
  digitalClockDisplay();
  Alarm.delay(1000); // wait one second between clock display
}

// functions to be called when an alarm triggers:
void Arranque(){
  Serial.println("Alarm: - arranque 13:00:00");
  digitalWrite(rele, HIGH);    
}

void Apagado(){
  Serial.println("Alarm: - apagado 13:02:00");           
  digitalWrite(rele, LOW);
}
void digitalClockDisplay()
{
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.println(); 
}

void printDigits(int digits)
{
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

Amigos, el DS3231 es lo mas robusto que tenemos para manejar hora y fecha en arduino. Al usarlo con librerías extra, creo que le restamos toda la precisión que tiene. Propongo que Gabba82 use una librería que le permita leer la hora del DS3231.

La estructura del if y de la forma en la que llamas al relevador, parece ser el problema.

Para el relevador, usa estas lineas dentro del setup:

 pinMode(rele, OUTPUT);
 digitalWrite(rele, HIGH);

Te sugiero que uses la estructura de la alarma controlada por if en niveles:

void Alarma1(int Hor, int Minu, int Segu){
 if (Hor==HAlarma1){
   if (Minu==MAlarma1){
     if (Segu==SAlarma1){
         digitalWrite(51, LOW);    // RELE AUDIO ENCENDIDO
         Alarmaled1(200,0,0);  pixels.show();
         GD.play(CAROUSEL, 70);  //SONIDO CONTINUO  
          delay(3500);     //ojo: sustituir por millis()
         GD.play(0); //DETIENE SONIDO               
        digitalWrite(51, HIGH);   // RELE AUDIO APAGADO         
      }
    }
  }
}

En este ejemplo if, el relevador permite enviar la señal de audio de la pantalla FT813 a los parlantes de la computadora. Ahora que lo veo, allí se pueden usar millis en lugar del delay(3500) (duelen los ojos solo de verlo XD, en cuanto pueda lo voy a quitar).

Puedes definir en el encabezado la alarma o alarmas deseadas y llamarlas desde cualquier parte de tu programa, no importa que tu programa esté realizando otras acciones:

//Set up Alarmas
int HAlarma1=6, MAlarma1=10, SAlarma1=0;    
int HAlarma2=21, MAlarma2=10, SAlarma2=0;

La función de llamado de alarmas, debe ubicarse después de la función que accede a la hora del DS3231, dentro de cualquier bucle infinito.

En tu caso el relevador estará conectado al arrancador del sistema de filtrado.

PD: por favor no dejes de lado ese DHT, no afectará para nada el funcionamiento del 3231 o del rele, solo recuerda aprender a usar millis() en lugar del molesto delay().

Muchas Gracias a todos, hoy no estare en casa, pero en lo que pueda me pondre a ver si lo consigo, muchisimas Gracias por el soporte! que pasada de comunidad!