Temporizador en sensor

Hola.

Estos días he estado realizando un proyecto con un sensor infrarrojo E18-D80NK que activa un relé y un led cuando encuentra un obstáculo. Sin embargo, tengo un problema y es que si el obstáculo no se mueve el relé y led nunca apagarán, quisiera saber si existe alguna forma de programar un temporizador que logre apagarlos en un tiempo dado sin importar que el obstáculo siga ahí.

Muchas gracias.

Adjunto mi código por si es de ayuda.

const int led = 13;
const int rel = 12;
const int sens = 11;

void setup()

{
  Serial.begin (9600);
  pinMode (led, OUTPUT);
  pinMode (rel, OUTPUT);
  pinMode (sens, INPUT);
}

void loop()

{

  int sensst = digitalRead (sens); // leo el status del sensor

  if (sensst == LOW)

  {
    digitalWrite (led, HIGH); //prende led
    digitalWrite (rel, LOW); // prende relé
  }

  else 

  {
    digitalWrite (led, LOW); //apaga led
    digitalWrite (rel, HIGH); //apaga relé
  }

}

Hola, me parece que la solucion esta en la funcion millis(), esta es una funcion que comienza su conteo (en milisegundos) desde que el programa comienza a correr y puedes echar mano en ella en cualquier momento.
Asi, cuando se encienden rele y led puedes poner:

t_inicio = millis()

// y si tu decides que a los 5 segundos debe apagarse entonces

if ((millis()-t_inicio) > 5000) 
{

// aqui apagas rele y led y todo vuelve como antes

}

En "Documentacion" de este Foro tienes excelentes guias de esta funcion. Saludos.

No conozco el sensor en cuestion pero veo que activas (led+rele) con estado LOW, el tema es que si aun con el objeto estatico el sensor sigue en estado LOW el problema pasa por otro lado. No se , tal vez tengas que leer por monitor serie que es lo que arroja el sensor en cada caso.

(si el sensor es del tipo de esos que siguen trazos en un papel, seguro que si el objeto no sale de su campo el estado no va a cambiar)

Moderador:
Hola, bienvenido al foro Arduino.
En la sección proyectos tienes estos dos hilos que debiste haber leído antes de postear

Como tu consulta es para otra sección lo muevo a Software.
Agradezco que hayas posteado debidamente el código. Solo ubicaste mal tu tópico.
Normas del foro

Hi,
Adjunto un sketch para ver si te trabaja siguiendo tus datos. Tratalo para ver si te trabaja y es lo que estas buscando.

[code]

const int led = 13;
const int rel = 12;
const int sens = 11;
byte flag = 0;
int sensst ;
unsigned long time;
long tiempo_led_rly_on = 5000;  //5 milliseconds prendido
//*******************************************
void setup() {
  Serial.begin (9600);
  pinMode (led, OUTPUT);
  pinMode (rel, OUTPUT);
  pinMode (sens, INPUT);
}
//******************************************
void loop() {
  if (digitalRead (sens) == 1 && flag == 1)flag = 0;
  if (digitalRead (sens) == 0 && flag == 0) detecto_obstacle() ;
}
//******************************************
void detecto_obstacle() {
  Serial.println(" Prende LED & Relay ");
  digitalWrite (led, HIGH); //prende led
  digitalWrite (rel, LOW); // prende relé
  do {
    //no hagas nada
  } while (millis() < time + tiempo_led_rly_on);
  Serial.println(" Apaga  LED & Relay ");
  digitalWrite (led, LOW); //apaga led
  digitalWrite (rel, HIGH); //apaga relé
  flag = 1;
}
//*******************************************

[/code]