Diseño de un Control de Luminarias Horario

Saludos, he estado desarrollando un temporizador horario con Arduino UNO R3, un módulo RTC I2C DS3231, una pantalla LCD 16x2 1602 y varios relays con el propósito de controlar las luminarias externas de mi casa. El problema que me trae hasta acá es que he logrado que las luces se enciendan y apaguen a determinadas horas, pero no he podido indicarle a Arduino que después de la hora especificada, en caso de interrupción eléctrica, conserve el ultimo estado de los puertos que controlan los relays. les muestro el fragmento de código que escribí para esto:

 if (cadena == "18:45:00")
  {
    digitalWrite(rl1, HIGH);
    digitalWrite(rl2, HIGH);
    lcd.clear();
    lcd.setCursor(4, 0);
    lcd.print("Exterior");
    lcd.setCursor(3, 1);
    lcd.print("Iluminado");
    tone(10, 2000, 240);
    delay(5000);
    contador = 2;
  }
  else if (cadena == "06:25:00")
  {
    digitalWrite(rl1, LOW);
    digitalWrite(rl2, LOW);
    lcd.clear();
    lcd.setCursor(4, 0);
    lcd.print("Exterior");
    lcd.setCursor(4, 1);
    lcd.print("Apagado");
    tone(10, 2000, 1000);
    delay(5000);
    contador = 2;
    contador2 = 2;
  }

¿Como puedo hacer para que por ejemplo, si son las 18:45 horas se mantenga encendido incluso si reinicio la tarjeta Arduino y si son las 06:30 horas (que sería en la mañana), se mantenga apagado?. Agradezco la ayuda que puedan prestarme. PD. la variable cadena es de tipo string y es la que me entrega la libreria del modulo RTC y la variable contador es para el cambio entre pantallas, es decir, visualizar varios mensajes o "páginas".

Lo que deberías hacer es que tu sistema arranque en los horarios establecidos pero que considere la posibilidad que si arranca en un horario COMPRENDIDO en un rango también lo haga.
Claro que es lo mismo que tu preguntas dicho de otra manera.

Yo veo en tu código esto

if (cadena == "18:45:00")   {
   // Acciones que correspondan
  }

me sorprende la comparación que haces una cadena contra algo fijo.
probaste que ocurre si preguntaras

if (cadena >= "18:45:00" && cadena < "06:25:00") {

Si esto lo permitiera cosa que dudo, estaría resuelto.
Busca el modo de preguntar horas y usar >= y < .

gracias por responder, surbyte, te comento que la libreria RTC me permite obtener los datos con números enteros, es decir:

if ((d.minutes == 0) && (d.seconds == 0) && (d.hour >= 6) && (d.hour <= 12))
    {
     for (int i = 0; i <= d.hour - 1; i++)
     {
       digitalWrite(bl, HIGH);
       tone(10, 2000, 60);
       delay(500);
       digitalWrite(bl, LOW);
       delay(500);
     }
     digitalWrite(bl, HIGH);
    }

hice lo que me dijiste antes hace unos dias atras pero no funciona

Como estoy interactuando con otros lenguajes, se me estan cruzando algunos límites y por eso te pedí que tu lo probaras.
Yo haría esto… te explico la idea, porque no tengo tiempo para probarla.
convierto todo a segundos o sea…
Tu hora de arranque es “18:45:00” convertido a segundos sería 183600+4560=67500 seg[/color]
Tu hora de apagado es “06:25:00” convertido a segundos sería 63600+2560=23100 bien… pero le tengo que sumar un dia no?
24*3600 + 23100= 86400+23100=109500

Entonces si tu reloj esta en algo entre 67500 y 109500 debe volver a activarse.
Solo cambia la forma de comparar, en lugar de hacerlo por strings usa la conversión a números unsigned long o long que será suficiente y preguntas

if (tiempo >= 67500) {
    if (!ActivaAccion1) {
       // accion 1 
       // activo reles etc etc lo que ya tienes
        ActivaAccion1 = true; // variable boolean que declaro como global si 
                              //  me asegura que se ejecute una sola vez

    }
}
]if (tiempo < 109500) {
   // apago accion 1
}

tambien podrias crear una funcion que convierta tu cadena a segundos o si investigas debe estar hecha.

Saludos, hace un tiempo consulté acerca de como hacer que arduino evalue entre dos rangos de horas para efectuar dos tareas diferentes mediante el módulo RTC DS3231. Su libreria me permite leer la hora y la fecha mediante cadenas o con números, en ultima instancia opté por comparar mediante números tal como muestro a continuación:

if ((d.minutes == 0) && (d.seconds == 0) && (d.hour == 6) && (d.hour <= 18))
    {      
       digitalWrite(bl, LOW);
    }

El formato de hora esta en 24H y, para el caso de encendido, sería cuestión de cambiar el rango asi:

if ((d.minutes == 0) && (d.seconds == 0) && (d.hour ==18) && (d.hour <= 6))
    {      
       digitalWrite(bl, HIGH);
    }

Ahora bien, he hecho esto buscando que Arduino evalúe estos rangos con la finalidad de que si ocurre un reseteo de la tarjeta o falle el suministro eléctrico, ésta sea capaz de mantener su ultimo estado al reiniciar la tarjeta. He descartado evaluar los estados de las salidas, debido a que toda variable que declare se inicializará en cero luego de un eventual reinicio. El asunto está en que tal cual como están las sentencias arriba descritas, no funciona como me interesa. ¿que me sugieren hacer? Gracias.

Guarda el ultimo estado y la informacion asociada en EEPROM, y tras un reset debido a fallo electrico o cualquier otra cosa, accede a esos datos y obra en consecuencia.

Como sabes la EEPROM no pierde la informacion almacenada aunque Arduino se quede sin alimentacion.