Apagar led si te detecta 3 segundos un sensor Hc-sr04.

Hola estoy con un sensor Hc-sr04 y mide perfectamente la distancia de cuatro centimetros, cuando acerco la mano a esos cuatro centimetros se enciende un led, pero necesito que si dejo la mano durante 3 segundos a esos cuatro centimentros el sensor lo detecte y el led se apague.

Me pueden ayudar ha realizarlo, muchas gracias.

Salu2.CRIS.

Y que has hecho hasta ahora?

Lee las normas del foro para postear tu código por favor!!

Perdon.

#include "SR04.h"
#define TRIG_PIN 12
#define ECHO_PIN 11
SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
long distancia;

void setup() {
   Serial.begin(9600);
   delay(1000);
}

void loop() {
   distancia=sr04.Distance();
   Serial.print(distancia);
   Serial.println("cm");
   delay(10);

if (distancia>=1 && distancia <=4){  //
  analogWrite (53,255);
}
}

Esto no esta mal pero...

analogWrite (53,255);

es lo mismo que poner

digitalWrite(53,HIGH);

si no vas a usar el PWM tiene poco sentido.

Cuando se inicia el evento deberías comenzar una cuenta usando millis()
Te recomiendo que leas esto y luego... si te animas intenta ver si puedes agregar algo que cuente a partir del momento que inica el disparo..

Ve a Documentación => Indice de temas tutoriales => millis()

Algo mas que tampoco es un error pero si es redundante.
El sensor devuelve valores entre 0 y Distancia Máxima de modo que

if (distancia <=4){  //

es suficiente.

Según lo que indicas,

if (distancia <=4){ //
este es el evento que iniciaría el tiempo que deseas para apagar el led si la mano permanece X seg.

Como supongo has leído millis(), debes tomar el tiempo cuando comienza la primer detección y luego esperar a que se cumpla el criterio que has adoptado.

como global creas una variable

#define INTERVALO 3000 // se expresa en milisegundos
unsigned long start;   // variable para llevar el tiempo.
bool flag = false,        // flat para detectar cuando se inicie la cuenta

// estos como globales.

// en tu loop
void loop() {
   distancia=sr04.Distance();
   Serial.print(distancia);
   Serial.println("cm");
   delay(10);

  if (distancia <=4){  //
     if (!flag) {
         start = millis();             // toma el valor de millis() cuando x primera vez entramos en este if
         flag = true;                  // entonces solo lo hace 1 vez
     }
     
     if (millis()-start > INTERVALO) {  // cuando millis() - start supere INTERVALO apago sino mantengo ON
        //analogWrite (53, 0);
        digitalWrite(53, LOW);
     else {
        //analogWrite (53,255);
        digitalWrite(53, HIGH);
     }
  }
  else {
        flag = false;                 // restauro flag a false porque ya no tenemos un objeto a 4 cm.
        digitalWrite(53, LOW);
}

Muchas gracias, estaba leyendo todo lo relacionado con milli, voy a ver como funciona. Gracias de nuevo.

Funciona bien, pero el problema es que ahora no se queda encendido el led al pasar la mano, se enciende y se apaga rapidamente y necesito que se quede encendido al pasar la mano.

flag = false;   // restauro flag a false porque ya no tenemos un objeto a 4 cm.
digitalWrite(53, LOW);

Solucionado, he omitido digitalWrite(53, LOW) y ya no se apaga.

Gracias.

Bueno, me alegro mucho porque pudiste encontrar y entender la lógica de funcionamiento.
Por eso te pedí que leyeras millis() para tener la base para entenderlo

Efectivamente, estuve dándole vueltas para entender como funcionaba todo y gracias a tu ayuda pude hacer que funcionase perfectamente. Soy nuevo en este mundillo y estoy aprendiendo poco a poco, me he embarcado en un proyecto que creo que podre sacar adelante.

Es conectar mi aplicación creada en delphi con un cajero gestionado con arduino y poco a poco me va saliendo todo.

Salu2.CRIS.

Eres nuevo pero te aseguro que no muchos resuelven cosas como las que has resuelto. Vas por buen camino y creo que aprenderás rápido
Buen trabajo!!

Nota: si esta solucionado me dices y lo cierro.
Y lo segundo, el foro ayuda y el que recibe la ayuda se compromete siempre en poner la solución final.

Asi que te toca colocar como quedó el código para que le sirva a otra persona.