Como no utilizar Delay??

Buenas,
Necesito de su ayuda. Tengo que hacer una secuencia de activacion y apagado de reley, son muchas secuencias, por logeneral los hacia con DELAY pero el problema que ahora tambien quiero agregar unos sensores y no puedo sensar mientar corren los delay. Como puedo hacer???....les dejo un ejemplo del codigo que suelo hacer.
Gracias

int RELAY_1 = 24; //ALCA
int RELAY_2 = 8;  //AGUA
int RELAY_3 = 25; //PERA
int RELAY_4 = 10;  //ESCAPE
int RELAY_5 = 9; //DESAGUE
int RELAY_6 = 22; //RETORNO ALCA
int RELAY_7 = 23; //RETORNO PERA
int BOT = 13;


void setup() {

pinMode(RELAY_1, OUTPUT);
pinMode(RELAY_2, OUTPUT);
pinMode(RELAY_3, OUTPUT);
pinMode(RELAY_4, OUTPUT);
pinMode(RELAY_5, OUTPUT);
pinMode(RELAY_6, OUTPUT);
pinMode(RELAY_7, OUTPUT);
pinMode(BOT, INPUT);
digitalWrite(RELAY_1, HIGH);
digitalWrite(RELAY_2, HIGH);
digitalWrite(RELAY_3, HIGH);
digitalWrite(RELAY_4, HIGH);
digitalWrite(RELAY_5, HIGH);
digitalWrite(RELAY_6, HIGH);
digitalWrite(RELAY_7, HIGH);

}

void loop() {

  if(digitalRead(BOT)==LOW){

    delay (500);
    digitalWrite(RELAY_4, LOW);
    delay (1500);
    digitalWrite(RELAY_4, HIGH);
    delay (1000);

    ////////  CICLO 1  /////////
    digitalWrite(RELAY_2, LOW);
    digitalWrite(RELAY_5, LOW);
    delay (1500);
    digitalWrite(RELAY_2, HIGH);
    delay (100);
    digitalWrite(RELAY_4, LOW);
    delay (4500);
    digitalWrite(RELAY_4, HIGH);
    delay (100);
    digitalWrite(RELAY_2, LOW);
    delay (1500);
    digitalWrite(RELAY_2, HIGH);
    delay (100);
    digitalWrite(RELAY_4, LOW);
    delay (4500);
    digitalWrite(RELAY_4, HIGH);
    digitalWrite(RELAY_5, HIGH);    
   }
   
}

Esto se explica casi a diario en el foro. Es cambiar el uso de los delays por un timer usando millis() o micros(). Obvio no es sólo usando esas funciones. También hay librerías de timers para Arduino que con añadirlas ya sales del apuro. En el playground de Arduino salen, busca las más recientes porque permiten varias instancias de la clase (En las antiguas no todas).

Pero reitero en el foro hay múltiples ejemplos y cada 2 días o menos veo un tema relacionado con los delays

Ve a Documentación y lee máquina de estados. Por el post#14 creo o antes (no recuerdo) yo respondo con un ejemplo práctico de como hacerlo.

A ver si logras entenderlo?

Surbyte, Gracias, pero sigo sin entender mucho como aplicarlo. Vi las librerias Ms Timer2 y Timer y por lo poco que entiendo son ciclicos, y no creo que se adecuen.
Gracias a ambos por la ayuda

probe hacer esto y no me funciona...pulso el boton y no pasa nada.... ademas no se si el concepto esta bien aplicado. Soy bastante novato

int RELAY_1 = 24; //ALCA
int RELAY_2 = 8;  //AGUA
int RELAY_3 = 25; //PERA
int RELAY_4 = 10;  //ESCAPE
int RELAY_5 = 9; //DESAGUE
int RELAY_6 = 22; //RETORNO ALCA
int RELAY_7 = 23; //RETORNO PERA
int BOT = 13;


void setup() {

  pinMode(RELAY_1, OUTPUT);
  pinMode(RELAY_2, OUTPUT);
  pinMode(RELAY_3, OUTPUT);
  pinMode(RELAY_4, OUTPUT);
  pinMode(RELAY_5, OUTPUT);
  pinMode(RELAY_6, OUTPUT);
  pinMode(RELAY_7, OUTPUT);
  pinMode(BOT, INPUT);
  digitalWrite(RELAY_1, HIGH);
  digitalWrite(RELAY_2, HIGH);
  digitalWrite(RELAY_3, HIGH);
  digitalWrite(RELAY_4, HIGH);
  digitalWrite(RELAY_5, HIGH);
  digitalWrite(RELAY_6, HIGH);
  digitalWrite(RELAY_7, HIGH);

}

void loop() {

 if (digitalRead(BOT) == LOW) {

    unsigned long timer1 = 0;
    timer1 = millis(); // asignamos los ms actuales al timer1
    if (millis() - timer1 > 500) // comprobamos si han pasado mas de 10000 ms
    {
      digitalWrite(RELAY_4, LOW); // si ya han pasado 0.5s apagamos el relay
    }

    unsigned long timer2 = 0;
    timer2 = millis();
    if (millis() - timer2 > 1500)
    {
      digitalWrite(RELAY_4, HIGH);
    }

    unsigned long timer3 = 0;
    timer3 = millis();
    if (millis() - timer3 > 1000)
    {
      digitalWrite(RELAY_2, LOW);
      digitalWrite(RELAY_5, LOW);
    }

    unsigned long timer4 = 0;
    timer4 = millis();
    if (millis() - timer4 > 1500)
    {
      digitalWrite(RELAY_2, HIGH);
    }

    unsigned long timer5 = 0;
    timer5 = millis();
    if (millis() - timer5 > 100)
    {
      digitalWrite(RELAY_4, LOW);
    }

    unsigned long timer6 = 0;
    timer6 = millis();
    if (millis() - timer6 > 4500)
    {
      digitalWrite(RELAY_4, HIGH);
    }

    unsigned long timer7 = 0;
    timer7 = millis();
    if (millis() - timer7 > 100)
    {
      digitalWrite(RELAY_2, LOW);
    }

    unsigned long timer8 = 0;
    timer8 = millis();
    if (millis() - timer8 > 1500)
    {
      digitalWrite(RELAY_2, HIGH);
    }

    unsigned long timer9 = 0;
    timer9 = millis();
    if (millis() - timer9 > 100)
    {
      digitalWrite(RELAY_4, LOW);
    }

    unsigned long timer10 = 0;
    timer10 = millis();
    if (millis() - timer10 > 4500)
    {
      digitalWrite(RELAY_4, HIGH);
      digitalWrite(RELAY_5, HIGH);
    }
  }
 }

A ver ahora

int RELAY_1 = 24; //ALCA
int RELAY_2 = 8;  //AGUA
int RELAY_3 = 25; //PERA
int RELAY_4 = 10;  //ESCAPE
int RELAY_5 = 9; //DESAGUE
int RELAY_6 = 22; //RETORNO ALCA
int RELAY_7 = 23; //RETORNO PERA
int BOT = 13;
unsigned long timer1  = 0;
unsigned long timer2  = 0;
unsigned long timer3  = 0;
unsigned long timer4  = 0;
unsigned long timer5  = 0;
unsigned long timer6  = 0;
unsigned long timer7  = 0;
unsigned long timer8  = 0;
unsigned long timer9  = 0;
unsigned long timer10 = 0;


void setup() {

  pinMode(RELAY_1, OUTPUT);
  pinMode(RELAY_2, OUTPUT);
  pinMode(RELAY_3, OUTPUT);
  pinMode(RELAY_4, OUTPUT);
  pinMode(RELAY_5, OUTPUT);
  pinMode(RELAY_6, OUTPUT);
  pinMode(RELAY_7, OUTPUT);
  pinMode(BOT, INPUT);
  digitalWrite(RELAY_1, HIGH);
  digitalWrite(RELAY_2, HIGH);
  digitalWrite(RELAY_3, HIGH);
  digitalWrite(RELAY_4, HIGH);
  digitalWrite(RELAY_5, HIGH);
  digitalWrite(RELAY_6, HIGH);
  digitalWrite(RELAY_7, HIGH);

}

void loop() {

 if (digitalRead(BOT) == LOW) {

    
                // asignamos los ms actuales al timer1
    if (millis() - timer1 > 500)  // comprobamos si han pasado mas de 500 ms
    {
      digitalWrite(RELAY_4, LOW); // si ya han pasado 0.5s apagamos el relay
      timer1 = millis();
    }

    
    if (millis() - timer2 > 1500)
    {
      digitalWrite(RELAY_4, HIGH);
      timer2 = millis();
    }

    
    if (millis() - timer3 > 1000)
    {
      digitalWrite(RELAY_2, LOW);
      digitalWrite(RELAY_5, LOW);
      timer3 = millis();
    }

    
    if (millis() - timer4 > 1500)
    {
      digitalWrite(RELAY_2, HIGH);
      timer4 = millis();
    }

    if (millis() - timer5 > 100)
    {
      digitalWrite(RELAY_4, LOW);
      timer5 = millis();
    }


    if (millis() - timer6 > 4500)
    {
      digitalWrite(RELAY_4, HIGH);
      timer6 = millis();
    }


    if (millis() - timer7 > 100)
    {
      digitalWrite(RELAY_2, LOW);
      timer7 = millis();      
    }

    if (millis() - timer8 > 1500)
    {
      digitalWrite(RELAY_2, HIGH);
      timer8 = millis();      
    }

    
    if (millis() - timer9 > 100)
    {
      digitalWrite(RELAY_4, LOW);
      timer9 = millis();
    }

    
    if (millis() - timer10 > 4500)
    {
      digitalWrite(RELAY_4, HIGH);
      digitalWrite(RELAY_5, HIGH);
      timer10 = millis();
    }
  }
 }

Surbyte,

Con tu correcion el comando funciono. Ahora el problema que se desvirtuo la secuencia que plantie en el comienzo con los delay. Cuando se corre el programa se activan todos los timer y no cuando termina uno debe comenzar el siguente. Sin contar que el boton le debo hacer una bandera para que cuando comience el bucle no tenga que tener apretado el pulsador hasta terminar el ultimo ciclo de tiempo. Se entiende?

Gracias por tus aporte.

Entonces tus relays se activan en secuencia tal como esta en el primer codigo con delays.
arranca 1 sigue el otro hasta el 10mo timer.
Es correcto?

Si correcto...asi como lo decis

int RELAY_1 = 24; //ALCA
int RELAY_2 = 8;  //AGUA
int RELAY_3 = 25; //PERA
int RELAY_4 = 10;  //ESCAPE
int RELAY_5 = 9; //DESAGUE
int RELAY_6 = 22; //RETORNO ALCA
int RELAY_7 = 23; //RETORNO PERA
int BOT = 13;
unsigned long timer1  = 0;
unsigned long timer2  = 0;
unsigned long timer3  = 0;
unsigned long timer4  = 0;
unsigned long timer5  = 0;
unsigned long timer6  = 0;
unsigned long timer7  = 0;
unsigned long timer8  = 0;
unsigned long timer9  = 0;
unsigned long timer10 = 0;
byte estado = 0;


void setup() {

  pinMode(RELAY_1, OUTPUT);
  pinMode(RELAY_2, OUTPUT);
  pinMode(RELAY_3, OUTPUT);
  pinMode(RELAY_4, OUTPUT);
  pinMode(RELAY_5, OUTPUT);
  pinMode(RELAY_6, OUTPUT);
  pinMode(RELAY_7, OUTPUT);
  pinMode(BOT, INPUT);
  digitalWrite(RELAY_1, HIGH);
  digitalWrite(RELAY_2, HIGH);
  digitalWrite(RELAY_3, HIGH);
  digitalWrite(RELAY_4, HIGH);
  digitalWrite(RELAY_5, HIGH);
  digitalWrite(RELAY_6, HIGH);
  digitalWrite(RELAY_7, HIGH);

}

void loop() {

	if (digitalRead(BOT) == LOW) {
		switch(estado) {
			case 0: timer1 = 500UL + millis();
					estado = 1;
					break;
			case 1: if (millis() > timer1) {
						digitalWrite(RELAY_4, LOW); // si ya han pasado 0.5s apagamos el relay
						timer2 = 1500UL + millis();
						estado = 2;
					}
					break;
			case 2: if (millis() > timer2) {
						digitalWrite(RELAY_4, HIGH);		
						timer3 = 1000UL + millis();
						estado = 3;
					}
		  			break;
		  	case 3: if (millis() > timer3) {
				      	digitalWrite(RELAY_2, LOW);
				      	digitalWrite(RELAY_5, LOW);
				      	timer4 = 1500UL + millis();
				      	estado = 4;
				    }
				    break;
			case 4: if (millis() > timer4) {
				      	digitalWrite(RELAY_2, HIGH);
				      	timer5 = 100UL + millis();
				      	estado = 5;
				    }
				    break;
			case 5: if (millis() > timer5) {
				      	digitalWrite(RELAY_4, LOW);
				      	timer6 = 4500UL +millis();
						estado = 6;
				    }
				    break;
			case 6: if (millis() > timer6) {
				      	digitalWrite(RELAY_4, HIGH);
				      	timer7 = 100UL + millis();
				      	estado = 7;
				    }
				    break;
			case 7: if (millis() > timer6) {
		  				digitalWrite(RELAY_2, LOW);
		  				timer8 = 1500UL + millis();      
		  				estado = 8;
					}
					break;
			case 8: if (millis() > timer8) {
						digitalWrite(RELAY_2, HIGH);
				      	timer9 = 100UL + millis();      
				      	estado = 9;
				    }
				    break;
			case 9: if (millis() > timer9) {
				      	digitalWrite(RELAY_4, LOW);
				      	timer10 = 4500UL + millis();
				      	estado = 10;
					}
					break;
			case 10: if (millis() > timer10) {
					     digitalWrite(RELAY_4, HIGH);
					     digitalWrite(RELAY_5, HIGH);
					     estado = 0;
					 }
					 break;
			default: estado = 0;
					 break;
			}
		}
}