Problemas con un módulo de reles

Buenos días, es mi primer mensaje en el foro y el problema que tengo es el siguiente:

Quiero programar un módulo de relés de tal forma que el primero se active desde el segundo 1 hasta el segundo 165 el segundo se active pasados 15 segundos y este activo igualmente hasta el segundo 165, el tercero se active a los 30 segundos y igualmente se apague al segundo 165 y el cuarto se active en el segundo 45 y se apague en el 165.

El módulo es un HL-54S V1.0 de cuatro relés y da igual que lo alimente por el arduino o por una fuente de alimentación externa conectada a GND y JDVcc. Logicamente si alimento por una externa los optoaclopadores los alimento por el arduino.

El hecho es que se comporta de una forma erratica, Si en el código cambio LOW por HIGH y HIGH por LOW, se encienden todos a la vez luego se apagan los tres primeros y el último se queda encendido todo el tiempo, si LOW e HIGH los permuto no funciona.

Creo que el fallo tiene que estar en el código, pero no lo veo. Si podéis echarme una mano.... muy agradecido

unsigned long time;

int rele1=2; // asigna el pin 2 para el relé1
int rele2=3; // asigna el pin 3 para el relé2
int rele3=4; // asigna el pin 4 para el relé3
int rele4=5; // asigna el pin 5 para el relé4



void setup(){
 pinMode (rele1, OUTPUT); // declara el rele1 como salida
 pinMode (rele2, OUTPUT); // declara el rele2 como salida
 pinMode (rele3, OUTPUT); // declara el rele3 como salida
 pinMode (rele4, OUTPUT); // declara el rele4 como salida
 time= millis();
}
 

void loop(){
 
 //RELE 1
 if(millis()-time>1 && millis()-time<16500)
   digitalWrite(rele1,HIGH);
 else
 if (millis()-time>16500)
   digitalWrite(rele1,LOW);
 
 //RELE 2
 if(millis()-time>1500 && millis()-time<16500)
   digitalWrite(rele1,HIGH);
 else
 if (millis()-time>16500)
   digitalWrite(rele2,LOW);
 
 //RELE 3
 if(millis()-time>3000 && millis()-time<16500)
   digitalWrite(rele3,HIGH);
 else
 if (millis()-time>16500)
   digitalWrite(rele3,LOW);

 //RELE 4
 if(millis()-time>4500 && millis()-time < 16500)
   digitalWrite(rele3,HIGH);
 else
 if (millis()-time>16500)
   digitalWrite(rele3,LOW);  
}

Los fallos por los que funciona erraticamente:

unsigned long time;

int rele1=2; // asigna el pin 2 para el relé1
int rele2=3; // asigna el pin 3 para el relé2
int rele3=4; // asigna el pin 4 para el relé3
int rele4=5; // asigna el pin 5 para el relé4



void setup(){
 pinMode (rele1, OUTPUT); // declara el rele1 como salida
 pinMode (rele2, OUTPUT); // declara el rele2 como salida
 pinMode (rele3, OUTPUT); // declara el rele3 como salida
 pinMode (rele4, OUTPUT); // declara el rele4 como salida
 time= millis();
}
 

void loop(){
 
 //RELE 1
 if(millis()-time>1 && millis()-time<16500)
   digitalWrite(rele1,HIGH);
 else
 if (millis()-time>16500)
   digitalWrite(rele1,LOW);
 
 //RELE 2
 if(millis()-time>1500 && millis()-time<16500)
   digitalWrite(rele1,HIGH); // -> ¿por qué enciendes el 1? ¿No será el 2?
 else
 if (millis()-time>16500)
   digitalWrite(rele2,LOW);
 
 //RELE 3
 if(millis()-time>3000 && millis()-time<16500)
   digitalWrite(rele3,HIGH);
 else
 if (millis()-time>16500)
   digitalWrite(rele3,LOW);

 //RELE 4
 if(millis()-time>4500 && millis()-time < 16500)
   digitalWrite(rele3,HIGH); // Si es el relé 4 por qué usas el 3?
 else
 if (millis()-time>16500)
   digitalWrite(rele3,LOW);  // Si es el relé 4 por qué usas el 3?
}

Y aunque la secuencia:

if ( millis()-tiempo > minimo && millis()-tiempo < maximo ) {
  funcion();
else
if ( millis-tiempo < maximo )
  funcion2();

No está mal, el segundo if sobra:

if ( millis()-tiempo > minimo && millis()-tiempo < maximo )
  digitalWrite(pin,HIGH);
else
  digitalWrite(pin,LOW);

Es más eficiente y hace lo que quieres.

Por lo demás, para no llamar tanto a millis() optaría por crear una variable "t" y hacer solo una llamada al principio del loop:

unsigned long t;

void loop()
{
  t = millis();
  /* resto de codigo usando t */
}

victorjam:
Por lo demás, para no llamar tanto a millis() optaría por crear una variable "t" y hacer solo una llamada al principio del loop

Ademas si solo quieres que la secuencia funciona una vez para que usas la variable time. mejor reusala asi:

unsigned long time;

const byte rele1 = 2;   //asigna el pin 2 para el relé1
const byte rele2 = 3;   //asigna el pin 3 para el relé2
const byte rele3 = 4;   //asigna el pin 4 para el relé3
const byte rele4 = 5;   //asigna el pin 5 para el relé4

void setup(){
   pinMode(rele1, OUTPUT);   //declara el rele1 como salida
   pinMode(rele2, OUTPUT);   //declara el rele2 como salida
   pinMode(rele3, OUTPUT);   //declara el rele3 como salida
   pinMode(rele4, OUTPUT);   //declara el rele4 como salida
}

void loop(){
   time = millis();
   //RELE 1
   if (time > 1 && time < 16500)
      digitalWrite(rele1, HIGH);
   else
      digitalWrite(rele1, LOW);  

   //RELE 2
   if (time > 1500 && time < 16500)
      digitalWrite(rele2, HIGH);
   else
      digitalWrite(rele2, LOW);  

   //RELE 3
   if (time > 3000 && time < 16500)
      digitalWrite(rele3, HIGH);
   else
      digitalWrite(rele3, LOW);  

   //RELE 4
   if (time > 4500 && time < 16500)
      digitalWrite(rele4, HIGH);
   else
      digitalWrite(rele4, LOW);  
}

Muchas gracias a los dos. He estado de viaje y hoy veo las respuestas. Mañana os comento.

Perdonad por tardar en responder, pero trabajo, trabajo....

Perfecto, cualquiera de las dos opciones ha servido.
Aunque supongo que para vosotros era fácil, para mí que estoy empezando.....

Gracias a todos