MillisTimer - Solucionado !!!

Hola a todos, bueno decidí avanzar un poco más en el aprendizaje con arduino y me he encontrado un obstáculo que quizás sea sencillo, pero me tiene -………Necesito retrasar la ejecución de una función a unos 10s y claro esta delay no es una opción.
Tengo una función llamada alarma, pero quiero que pasen 10s antes de que se ejecute después de ser llamada en el código.
Probé con MillisTimer y funciona bien cuando está ella sola, pero al introducir en el código donde se requiere no funciona, simplemente se ejecuta al instante.
Así funciona bien:

int pLedO = 4;
int pLedF = 5;
int buz = 6;
int sActA = 3;
int sActL = 2;
int pir = 7;

int valorLuz0 = 0;
int valorLuz1 = 0;
int estadoLuz = 0;
int valor0 = 0;
int valor1 = 0;
int estado = 0;
int asistenteP = 0;


void setup() {
  Serial.begin(9600);
  pinMode(pLedF, OUTPUT);
  pinMode(pLedO, OUTPUT);
  pinMode(buz, OUTPUT);
  pinMode(sActA, INPUT);
  pinMode(sActL, INPUT);
  pinMode(pir, INPUT);
}

void loop() {
  long retardo_alarma;
  swAlarma();
  swLuz();
  controlPir();

  if (digitalRead(pLedF) == HIGH) {
    if (asistenteP == 1) {
      if (digitalRead(pLedO) == LOW) {
        estadoLuz = 1;
        retardo_alarma = millis();
        ///coloque un Serial.print(retardo_alarma) y todo ok
        if (millis() > (retardo_alarma + 10000)) {
          ///coloque un Serial.print(retardo_alarma) y nada muestra
          alarma();
        }
      }
    }
  } else {
    if (asistenteP == 1) {
      if (digitalRead(pLedO) == LOW) {
        estadoLuz = 1;
      }
    }
  }
}
//////////////////bocinita
void alarma() {
  digitalWrite(buz, HIGH);
}
//////////////////sensor PIR
void controlPir() {
  if (digitalRead(pir) == HIGH) {
    asistenteP = 1;
  } else {
    asistenteP = 0;
  }
}
///////////////////switch activa/desactiva alarma
void swAlarma() {
  valor0 = digitalRead(sActA);
  delay(10);
  if ((valor0 == HIGH) && (valor1 == LOW)) {
    estado = 1 - estado;
  }
  valor1 = valor0;
  if (estado == 1) {
    digitalWrite(pLedF, HIGH);
    delay(10);
  }
  else {
    digitalWrite(pLedF, LOW);
    digitalWrite(buz, LOW);
    delay(10);
  }
}
///////////////////switch activa/desactiva luz
void swLuz() {
  valorLuz0 = digitalRead(sActL);
  delay(10);
  if ((valorLuz0 == HIGH) && (valorLuz1 == LOW)) {
    estadoLuz = 1 - estadoLuz;
  }
  valorLuz1 = valorLuz0;
  if (estadoLuz == 1) {
    digitalWrite(pLedO, HIGH);
    delay(10);
  }
  else {
    digitalWrite(pLedO, LOW);
    delay(10);
  }
}

Sin usar ninguna libreria adicional:

  1. crea una variable donde almacenaras un tiempo
    long tiempo

  2. al momento de llamar a tu funcion, no ejecutes, solo almacena el tiempo
    tiempo=millis()

  3. solo ejecuta la funcion si ha pasado mas de cierto tiempo, en tu caso 10 segundos
    if (millis() > (tiempo + 10000)) {ejecutar}

  4. dependiendo de como sea lo que quieras ejecutar quizas debas poner una variable boolean para que se ejecute solo una vez

Saludos.

bueno use su opción y nada, alarma ni se actva, arriba pongo el codigo completo

Hola venenodcuba, por cierto, podrias haber elegido mejor nick!!

Este código esta mal

if (asistenteP == 1) {
      if (digitalRead(pLedO) == LOW) {
        estadoLuz = 1;
        retardo_alarma = millis();
        ///coloque un Serial.print(retardo_alarma) y todo ok
        if (millis() > (retardo_alarma + 10000)) {
          ///coloque un Serial.print(retardo_alarma) y nada muestra
          alarma();
        }
      }
    }

Cuando se cumplen las condiciones retardo_alarma = millis() pero luego preguntas si es mayor que ese valor mas 10 seg.
estaría bien si retardo_alarma no se actualizara mas pero en cada ciclo vuelve a hacerlo lo que indica que tienes que encontrar el modo que esto

retardo_alarma = millis();

se ejecute una vez y luego si hacer cumplir la codición de si es mayor a 10 seg.

Se comprende?

Una solución sería que lo haga en la transición 1 a 0 o HIGH a LOW de digitalRead(pLedO) == LOW

Acá te dejo la versión modificada

int pLedO = 4;
int pLedF = 5;
int buz = 6;
int sActA = 3;
int sActL = 2;
int pir = 7;

int valorLuz0 = 0;
int valorLuz1 = 0;
int estadoLuz = 0;
int valor0 = 0;
int valor1 = 0;
int estado = 0;
int asistenteP = 0;
bool estadopLed0, estadopLed0Ant = LOW;

void setup() {
  Serial.begin(9600);
  pinMode(pLedF, OUTPUT);
  pinMode(pLedO, OUTPUT);
  pinMode(buz, OUTPUT);
  pinMode(sActA, INPUT);
  pinMode(sActL, INPUT);
  pinMode(pir, INPUT);
}

void loop() {
  long retardo_alarma;
  swAlarma();
  swLuz();
  controlPir();

  estadopLed0 = digitalRead(pLedO);
  if (digitalRead(pLedF) == HIGH) {
      if (asistenteP == 1) {
          
        if (!estadopLed0 && estadopLed0Ant) {
           retardo_alarma = millis(); // solo se ejecuta en la transición 1 a 0   
        if (!estadopLed0) {
            estadoLuz = 1;
            
            ///coloque un Serial.print(retardo_alarma) y todo ok
            if (millis() > (retardo_alarma + 10000)) {
              ///coloque un Serial.print(retardo_alarma) y nada muestra
              alarma();
            }
        }
      }
  } else {
      if (asistenteP == 1) {
          if (!estadopLed0) {
              estadoLuz = 1;
          }
      }
  }
  estadopLed0Ant = estadopLed0;
}
//////////////////bocinita
void alarma() {
  digitalWrite(buz, HIGH);
}
//////////////////sensor PIR
void controlPir() {
  if (digitalRead(pir) == HIGH) {
    asistenteP = 1;
  } else {
    asistenteP = 0;
  }
}
///////////////////switch activa/desactiva alarma
void swAlarma() {
  valor0 = digitalRead(sActA);
  delay(10);
  if ((valor0 == HIGH) && (valor1 == LOW)) {
    estado = 1 - estado;
  }
  valor1 = valor0;
  if (estado == 1) {
    digitalWrite(pLedF, HIGH);
    delay(10);
  }
  else {
    digitalWrite(pLedF, LOW);
    digitalWrite(buz, LOW);
    delay(10);
  }
}
///////////////////switch activa/desactiva luz
void swLuz() {
  valorLuz0 = digitalRead(sActL);
  delay(10);
  if ((valorLuz0 == HIGH) && (valorLuz1 == LOW)) {
    estadoLuz = 1 - estadoLuz;
  }
  valorLuz1 = valorLuz0;
  if (estadoLuz == 1) {
    digitalWrite(pLedO, HIGH);
    delay(10);
  }
  else {
    digitalWrite(pLedO, LOW);
    delay(10);
  }
}

ook surbyte entendí todo y me funciona perfecto tu opción, gracias, trasteando y mirando un poco también logre al final de otra forma usando la librería MillisTimer

...
MillisTimer retardo_alarma (10000);
...
boolean alarma_tmp;
...
if (digitalRead(pLedF) == HIGH) {
    if (asistenteP == 1) {
      if (digitalRead(pLedO) == LOW) {
        alarma_tmp = true;
        retardo_alarma.setTimer();
      }
    }
  } 
if (alarma_tmp) {
    if (retardo_alarma.checkTimer()) {
      alarma();
    }
  }
...

Gracias a todos