Sensores Ultrasonicos HC-SR04

Hola, Resulta que soy usuario nuevo de Arduino y tengo un proyecto escolar, cuento con un Arduino UNO, lo que necesito hacer es que, utilizando sensores ultrasonicos HC-SR04 al detectar una distancia <= 10 cm activar un Relay, pero solo si la distancia <= 10 se mantiene por 30 segundos, al aumentarse la distancia dicha desactivar el Relay, y si la distancia disminuye de nuevo volver a activar el Relay, por el momento cuento con este codigo:

#define Pecho 6
#define Ptrig 7
long duracion, distancia;   
 
void setup() {                
  Serial.begin (9600);       // inicializa el puerto seria a 9600 baudios
  pinMode(Pecho, INPUT);     // define el pin 6 como entrada (echo)
  pinMode(Ptrig, OUTPUT);    // define el pin 7 como salida  (triger)
  pinMode(13, 1);            // Define el pin 13 como salida
  }
  
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
  
  if (distancia >= 500 || distancia <= 0){  // si la distancia es mayor a 500cm o menor a 0cm 
    Serial.println("---");                  // no mide nada
  }
  else {
    Serial.print(distancia);           // envia el valor de la distancia por el puerto serial
    Serial.println("cm");              // le coloca a la distancia los centimetros "cm"
    digitalWrite(13, 0);               // en bajo el pin 13
  }
  
   if (distancia <= 10 && distancia >= 1){
    digitalWrite(13, 1);                     // en alto el pin 13 si la distancia es menor a 10cm
    Serial.println("Sensor 1 Activado");         // envia la palabra Alarma por el puerto serial
  }
  delay(400);                                // espera 400ms para que se logre ver la distancia en la consola
}

Pero al momento de detectarse la distancia el Relay se activa instantáneamente, y pues lo que necesito es que se active solo si la distancia se mantiene por cierto tiempo.

Bueno ese seria mi problema, agradecería mucho si me pudieran ayudar, Saludos!! :slight_smile: :slight_smile:

De hecho este código nunca implementa un relé (Dale gracias al profe garcía jajaja)

Bien lo que tu quieres hacer podría hacerse así:

#define Pecho 6   //Echo al pin 6
#define Ptrig 7    //Trigger al pin 7
long duracion, distancia;   
int rele = 8;
   
 
void setup() {                
  Serial.begin (9600);       // inicializa el puerto seria a 9600 baudios
  pinMode(Pecho, INPUT);     // define el pin 6 como entrada (echo)
  pinMode(Ptrig, OUTPUT);    // define el pin 7 como salida  (triger)
  pinMode(13, 1);            // Define el pin 13 como salida
  pinMode(rele, OUTPUT);  //Pin 8 declarado como salida (Aqui pones el rele)
  }

  
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
  
  if (distancia >= 500 || distancia <= 0){  // si la distancia es mayor a 500cm o menor a 0cm 
    Serial.println("---");                  // no mide nada
  }
  else {
    Serial.print(distancia);           // envia el valor de la distancia por el puerto serial
    Serial.println("cm");              // le coloca a la distancia los centimetros "cm"
    digitalWrite(13, 0);               // en bajo el pin 13
  }
  
   if (distancia <= 10){
    digitalWrite(13, 1);                     // en alto el pin 13 si la distancia es menor a 10cm
    digitalWrite(rele, HIGH);
    Serial.println("Sensor 1 Activado");         // envia la palabra Alarma por el puerto serial
    delay(30000);  //Aqui esperas los 30 segundos
  }
  delay(400);                                // espera 400ms para que se logre ver la distancia en la consola

   if (distancia > 10){

    digitalWrite (13,0);
    digitalWrite (rele, LOW);
    Serial.println("Sensor desactivado");

}
}

Según yo es lo que querias, no sé si entendí bien tu explicación me resulto algo confusa .-.

mike_117:
De hecho este código nunca implementa un relé (Dale gracias al profe garcía jajaja)

Bien lo que tu quieres hacer podría hacerse así:

#define Pecho 6   //Echo al pin 6

#define Ptrig 7    //Trigger al pin 7
long duracion, distancia;  
int rele = 8;

void setup() {                
 Serial.begin (9600);       // inicializa el puerto seria a 9600 baudios
 pinMode(Pecho, INPUT);     // define el pin 6 como entrada (echo)
 pinMode(Ptrig, OUTPUT);    // define el pin 7 como salida  (triger)
 pinMode(13, 1);            // Define el pin 13 como salida
 pinMode(rele, OUTPUT);  //Pin 8 declarado como salida (Aqui pones el rele)
 }

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
 
 if (distancia >= 500 || distancia <= 0){  // si la distancia es mayor a 500cm o menor a 0cm
   Serial.println("—");                  // no mide nada
 }
 else {
   Serial.print(distancia);           // envia el valor de la distancia por el puerto serial
   Serial.println(“cm”);              // le coloca a la distancia los centimetros “cm”
   digitalWrite(13, 0);               // en bajo el pin 13
 }
 
  if (distancia <= 10){
   digitalWrite(13, 1);                     // en alto el pin 13 si la distancia es menor a 10cm
   digitalWrite(rele, HIGH);
   Serial.println(“Sensor 1 Activado”);         // envia la palabra Alarma por el puerto serial
   delay(30000);  //Aqui esperas los 30 segundos
 }
 delay(400);                                // espera 400ms para que se logre ver la distancia en la consola

if (distancia > 10){

digitalWrite (13,0);
   digitalWrite (rele, LOW);
   Serial.println(“Sensor desactivado”);

}
}





Según yo es lo que querias, no sé si entendí bien tu explicación me resulto algo confusa .-.

Hola, Gracias por contestar, probe el codigo asi como pusiste, pero no me funciono (no hace la funcion que requiero), bueno tratare de explicarme mejor.

Lo que necesito es que cuando la distancia sea >= 10 cm por 30 segundos o mas, activar el rele y si la distancia baja de los 10 cm desactivar el rele, bueno creo que con eso me explique un poco mejor, de antemano muchas gracias por la ayuda brindada

mike_117:
De hecho este código nunca implementa un relé (Dale gracias al profe garcía jajaja)

jajaja si de hecho con el pin 13 que el profe garcia ocupaba para encender un led lo conecte el rele jajaja

AYUDA

tengo un sensor ultrasónico que necesito que haga la siguiente tarea:

cuando este a 20cm de cualquier objeto, encienda de manera permanente un relé y que no se apague hasta
que se detecte a 40cm otro objeto

nota_ si el sensor detectó los 20cm que no vuelva a detecarlo hasta detectar los 40cm.

Lee las normas del foro.
Crea tu propio hilo y no revivas nada que tenga un carte ROJO que te dice Advertencia este hilo tiene mas de 120 dias sin movimiento. Lo dice en inglés pero lo puedes traducir usando Google Translate o tal vez lo haga automáticamente.
De todas formas. Hilo cerrado.
Lee las normas del foro.