problema con control de reinicio de reloj interno

estoy haciendo un pequeño sistema de riego por asuntos de viaje, consiste en encender encender una bomba de agua por 5 segundos cada 3 horas y estoy teniendo un problema de error con el codigo de reinicio de reloj interno, soy nuevo en esto y se me complico un poco..

int Rele=12; //Pin de salida para el Rele.
unsigned long time; // varible para el reloj interno. 
unsigned long CadaX; // varible para decir cada cuanto tiempò se enciende el Rele. 
unsigned long IntervaloCadaX; // varible para decir cuanto tiempo se encendera.
boolean encendido = false; // variable para saber el estado del Rele.
unsigned long TimedeReseteo; // Variable para contener el tiempo de reseteo aproximado.

// the setup function runs once when you press reset or power the board
void setup() {
  pinMode(Rele, OUTPUT); // Inicializamos el pin del Rele a salida.
  time = millis(); // tomamos el tiempo inicial.
  CadaX = 10800000; // (cada 3 horas) 
  IntervaloCadaX = 5000; // (5 segundos) 
}

// función principal por siempre.
void loop() {
  if (!encendido){ // Si esta apagado, entramos para ver si es tiempo de encenderlo.
    // Punto de encendido del Rele.
    if ((millis() - time) > CadaX){
       digitalWrite(Rele, HIGH);
       time = millis(); // Tomamos nuevo tiempo.
       encendido = true;
    }  
  }
  
  if (encendido){  // Si esta encendido, entramos para ver si es tiempo de apagarlo.
    // Punto de apagado del Rele.
    if ((millis() - time) > IntervaloCadaX){
       digitalWrite(Rele, LOW);
       time = millis(); // Tomamos nuevo tiempo.
       encendido = false;
    }  
  }
   
  // Control del reinicio del reloj de arduino.
  if ((millis()+1800) (menorQue)time
     time = millis();
  }

se agradecen las criticas

A pesar de no ser amigo del uso del delay() tal vez si lo unico que tener que hacer es prender y apagar una bomba podrías usar un delay(5000) una vez activado el relé. Total no hay ninguna otra función que atender durante ese período. Lo que no entiendo es el último if. Simplemente cuando prendés la bomba esperás 5 segundos, la apagás y reiniciás la variable time= millis() para que vuelva a esperar 3 horas

Empecemos por cosas que me gustan:
En general bastante bien.
Has usado unsigned long para los tiempos y boolean para flags
un error es que esto

CadaX = 10800000; // (cada 3 horas)

debe ser asi

CadaX = 10800000UL; // (cada 3 horas)

Puede que funcione bien pero agregar el UL le dice al compilador que tu número será un unsigned long.

Lo que no me gusta tiene que ver conque estas regando en cualquier momento del dia.
Eso en un invernadero puede tener sentido pero si lo haces al sol no lo tiene.

Supongamos que este bien.

Entonces prueba esta versión

const byte Rele = 12;         // Pin de salida para el Rele.
unsigned long time;           // varible para el reloj interno. 
unsigned long CadaX;          // varible para decir cada cuanto tiempò se enciende el Rele. 
unsigned long IntervaloCadaX; // varible para decir cuanto tiempo se encendera.
unsigned long TimedeReseteo;  // Variable para contener el tiempo de reseteo aproximado.

boolean encendido = false; // variable para saber el estado del Rele.

// the setup function runs once when you press reset or power the board
void setup() {
  pinMode(Rele, OUTPUT);      // Inicializamos el pin del Rele a salida.
  CadaX = 10800000UL;           // (cada 3 horas) 
  IntervaloCadaX = 5000UL;      // (5 segundos) 
  Serial.begin(9600);
}

// función principal por siempre.
void loop() {

  switch(estado) {
    case 0: digitalWrite(Rele, LOW);       // enciendo el rele x 5 segundos
            Serial.println("Arranco bomba");
            time = millis(); // Tomamos nuevo tiempo.
            estado = 1;
            break;
    case 1: if (millis() - time > CadaX) {
                digitalWrite(Rele, HIGH);     // apago el rele. Asegúrate que LOW apague!!!
                Serial.println("Apago bomba");
                time = millis();
                estado = 2;
            }  
            break;
    case 2: if (millis() - time > IntervaloCadaX){
                estado = 0;
                Serial.println("Se cumplio intervalo de 3 hs");
            }  
            break;
  }
}

muchas gracias surbyte, ahora pruebo, el riego funciona solo durante el día ya que durante la fase de oscuridad no es conveniente, quería usar la función de reinicio pero me di cuenta que es innecesario ya que durante la fase de oscuridad se apaga y vuelve a reiniciar el contador

Lo de conveniente o no.. no estoy tan seguro. Deberías regar cuando la planta necesita agua.