actualizar variable mientras ejecuta el loop

hola esto es para hacer un arco desinfectante automático uso un sensor ultrasónico ,tres led , un rele y arduino uno.
funcionamiento: cuando el sensor ultrasónico detecta presencia en un rango de 30-70 cm durante 3 segundos acciona un relé que activa bomba activándose durante 3 seg.
en el segundo 1 de detección se prende un led verde , en el segundo 2 un led amarillo en el segundo 3 un led rojo junto con el relé.
el problema es que el sensor apenas detecta algo en ese rango sin esperar los 3 segundo ejecuta toda la instrucción dentro del if.

este es el codigo

#define Pecho 6
#define Ptrig 7
long duracion;
long distancia;

int LEDVERDE =  9;
int LEDAMARILLO = 10;
int LEDROJO = 11;
int RELE  = 5 ;
unsigned long time ; 
int RETARDO = 1000 ;

void setup (){
   Serial.begin (9600);       // inicializa el puerto seria a 9600 baudios
   pinMode(9, OUTPUT);
   pinMode (10, OUTPUT);
   pinMode(Pecho, INPUT);     // define el pin 6 como entrada (echo)
   pinMode(Ptrig, OUTPUT);    // define el pin 7 como salida  (triger)
   pinMode(11,OUTPUT);
   pinMode( RELE ,OUTPUT); 

}

void loop (){
 
    
     digitalWrite(Ptrig, LOW);
  delayMicroseconds(2); 
  digitalWrite(Ptrig, HIGH);                   // genera el pulso de triger por 10ms
  delayMicroseconds(10);
  digitalWrite(Ptrig, LOW);
  
  duracion = pulseIn(Pecho, HIGH);
  distancia = (duracion/2) / 29;            // calcula la distancia en centimetros 
   

  int RANGO =  distancia <= 70 && distancia >= 30 ;   // variable que guarda rando util de distacia
  if (RANGO == true){
 
 
   digitalWrite ( LEDVERDE , HIGH);                  //al detectar presencia el sensor ultrasonico en el rango estipulado durante el primer segundo , prende led verde 
 delay ( 1000);

 
digitalWrite ( LEDAMARILLO , HIGH );                 //al detectar presencia el sensor ultrasonico en el rango estipulado durante el segundo segundo , prende led amarillo 
 delay ( 1000);

 
 digitalWrite ( LEDROJO , HIGH);                      //al detectar presencia el sensor ultrasonico en el rango estipulado durante el tercer segundo , prende led rojo y rele durante 3seg 
 digitalWrite ( RELE , LOW); 
   delay ( 3000);

  } 
else {
  digitalWrite ( LEDVERDE , LOW);
      digitalWrite ( LEDAMARILLO , LOW );
        digitalWrite ( LEDROJO , LOW );    
    digitalWrite ( RELE , HIGH);
      
  
Serial.println(distancia );
delay ( 500);
digitalWrite ( RELE , HIGH);
}

Hola, me parece raro lo que dices, trata de probar con delays mas largos (bueno deberias usar millis(), mejor) simplemente para ver si percibes mejor la secuencia

int RANGO =  distancia <= 70 && distancia >= 30 ;   // variable que guarda rando util de distacia
  if (RANGO == true){
 
 
 digitalWrite ( LEDVERDE , HIGH);                  //enciende ni bien se detecta RANGO=true
 delay ( 3000);

 
digitalWrite ( LEDAMARILLO , HIGH );                 //enciende luego de 3 seg de haber sido detectado RANGO=true
 delay ( 3000);

 
 digitalWrite ( LEDROJO , HIGH);                      //enciende luego de 6 seg de haber sido detectado RANGO=true
digitalWrite ( RELE , LOW);    // rele es ON durante 3,5 seg
  delay ( 3000);

  }
else {
  digitalWrite ( LEDVERDE , LOW);
      digitalWrite ( LEDAMARILLO , LOW );
        digitalWrite ( LEDROJO , LOW );   
    digitalWrite ( RELE , HIGH);
     
 
Serial.println(distancia );
delay ( 500);
digitalWrite ( RELE , HIGH);
}

Puedes explicar mas detallado la función? creo que quieres que si el sensor detecta algo mas de 3 segundos se active pero no estoy seguro.

si eso mismo , perdon me cuesta explicarlo bien

El sensor no va a detectar algo por 3 segundos!! Eso es algo que TU te imaginas.
El sensor detecta movimiento y lo informa. Tiene un retardo en apagarse y según este ajustado mantiene su salida en ON durante X tiempo. Puede ser breve o durar incluso minutos.

Lo mejor para lo que propones es que sea lo mas breve posible y que Arduino diga... ahhh se ha detectado un objeto, bien... este objeto sigue detectándose por 3 segundos? Si.. okay, entonces hago todo lo que te has imaginado.

El problema es que los detectores de movimiento solo detectan MOVIMIENTO y cuando alguien llega y se detiene suelen INDICARLO como que ya no hay movimiento, de manera que lo que esperabas hacer que era confirmar que algo permanece ahí por 3 segundos no es tarea simple con ese sensor. La persona o cosa debe moverse.

Nunca has jugado delante de un PIR a desplazarte sin que te detecte? Yo si y con paciencia puedes engañarlo. Incluso actuar como si fueras un ladrón.

Llevo el comentario al extremo, tal vez eso no pase la mayoría de los casos pero es bueno tenerlo en cuenta por si falla.

Entonces según mi punto de vista, o detectas algo y listo, o detectas algo varias veces en esos 3 segundos.
Qué sugieres? Yo para guiarte necesito esa respuesta.

El resto con delay() no se puede hacer. SI o SI millis() y máquina de estados asi que ve a la sección Documentación y lee en el Indice de temas tutoriales los apartados para millis() y máquina de estados.