millis LED multiple ejecución

Tengo problema/duda con funcion millis() y el encendido de LED (es más complejo que esto pero por simplificarlo). Al ejecutar esta función, el LED se enciende tantas veces como se está cumpliendo el IF. Si pongo 30segundos, cada vez que se cumpla que Timer<millis+intervalo; se irá el led a HIGH. En el terminal al incluir un print, me sale el mismo texto del print pero en muchas lineas continuamente, hasta que sale del IF. Si enciendo una luz, ya sea LED o lampara con tele, estará cada 20ms dando la orden de encender y se mantendrá high aunque se ejecute el if 500 veces hasta que el tiempo es mayor al intervalo?

Y porque no posteas el código en lugar de explicar algo que sería mas fácil de entender con el código como elemento para entenderte.

Desde ya que esta mal programado.

Cuando postees por favor usa etiquetas para el código. Si no sabes, lee las normas del foro y mira otros hilos para entender como debe verse. Antes de postear usa preview para asegurarte.
Sino me tendrás reclamándotelo jajaja

Este es el codigo. Hay mas codigo pero este es la parte que quiero retardar 15segundos. Cuando detecta movimiento, me manda la señal a la raspberry y ademas se enciende un led. A los 15 segundos se tiene que apagar el led.

unsigned long TIMER_pir1;   // almacenará la última vez que el estado del LED
const unsigned long intervalo_pir1=15000;      // intervalo del parpadeo (en milisegundos)


void setup() 
{
TIMER_pir1=0;
(...)
}


void loop() 
{

if (WiFi.status() == WL_CONNECTED)
{
estado_pir=digitalRead(pir);

if (client.connected())
  {
    if (estado_pir==HIGH)
{
       TIMER_pir1 = millis()+intervalo_pir1; 
       
    Serial.println(String(alarmON))  ;
    client.publish("Movimiento1",String(alarmON));
    digitalWrite(salida5, HIGH); 
    estado_salida5=1;
    Serial.println("Salida 5 On");
        client.publish("esp6en1",String(on5));
    Serial.print(TIMER_pir1);
}
   if (TIMER_pir1 > 0 && millis()>TIMER_pir1)
   {
    TIMER_pir1=0;
   
    Serial.println(String(alarmOFF))  ;
    client.publish("Movimiento1",String(alarmOFF));
    digitalWrite(salida5, LOW); 
    estado_salida5=0;
    Serial.println("Salida 5 Off"); 
    client.publish("esp6en1", String(off5));
   }
  }
}

Los primeros 2,5seg aprox al activarse el sensor salen en arduino COM4 como en la raspberry muchas lineas de ejecución “1” o “on” con el mismo mensaje pero el tiempo que muestro por pantalla va cambiando. Despues de esos 2,5seg aprox que no se de donde salen, ya no salen lineas y a los 15 segundos despues (como marco en la programacion) se apaga la luz. Es decir, la luz no se paga a los 15seg, sino a los 2,5+15.

pir.txt (1.27 KB)

Hola.
Supongo que parte de tu problema está en esta parte:

    if (estado_pir==HIGH)

Deberías actuar sólo cuando se encienda el pir, no cuando esté encendido; osea, cuando transite de apagado a encendido. Es uno de los problemas por los que todo arduinero ha pasado en un momento u otro y una consulta recurrente. Por ejemplo, aquí se responde sobre el mismo problema a otro forero que plantea el mismo problema justo ayer.

Pero ese if si uso delay no tengo el problema, por lonque me da que pensar que es por los if del millis, no del pir. Con delay, me aparece un 1 y luego un 0. Con los millis me salen multitud de 1 y lurgo un 0 al pasar el tiempo 15+2,5

Obvio, porque si usas delay el micro no hace nada más hasta que termina la espera. Con millis ejecuta el if, finaliza el loop, vuelve a entrar en el loop y como sigue HIGH vuelve a entrar en el if, etc.
Sin embargo, si la condición es doble; es decir, si la condición es "si el sensor está en HIGH y antes estaba en LOW", sólo entrará cuando "salte".