Reducir distancia de medicion con sensor HC-SR04

Hola, primero que todo felicitar por esta pagina que es de gran ayuda¡¡

Sucede que quiero reducir la distancia de medición de mi sensor ultrasonico HC-SR04, hasta solo unos 50 o 60 cms.
Estoy utilizando una placa ARDUINO ONE
También me gustaría si me pudiesen decir como podría ser el código con un contador, que solo me mande una señal de salida a una pantalla cuando sense por mas de 10 segundos un objeto.

Por favor ayuda¡¡¡

Muchas gracias

Mi correo FABSHENCO_GB7@HOTMAIL.COM

Hola fabian,
mas o menos así:

medir distancia cada p.e. 100ms (recomendable libreria <NewPing.h>)
si esta mas cerca de 50 cm y flag no puesto, guardar los millis y poner flag que el tiempo corre
se esta mas lejos de 50 borrar flag
si han pasado 10s y flag puesto, → alarma

esto has de traducir en codigo, asi aprendes algo.

Si tu codigo no va, postealo aqui.

Muchas gracias, pero la verdad no entiendo lo que es FLAG, ademas soy nuevo en esto de la programación por arduino, podrían ponerme por fa como seria la programación....

Muchas gracias y disculpen mi ignorancia

un flag es una bandera y que es una bandera jajaja

Bueno es una variable que solo es binaria, admite si o no, verdadero o falso.
Entonces si haces algo esta en 1 por ejemplo o verdadero y si no, esta en cero.
Eso es un flag.

Supongamos para no ir contra los deseos de ElEspañol que
Este es un código que busque al azar

 int motPin = 9; // choose the pin for the MOTOR
 int inLdr = 0;     // choose input pin for Ldr
 int LDR = 0;     // variable for reading the pin status
 int ledPin = 10;                 // select pin for led
 int Direction = 1;              //pulse direction
 int brightness = 0;             // led brightness
 boolean sleep = true;                  //behaviour state


//DECALRE INPUTS AND OUTPUTS
void setup() {
 beginSerial(9600);
 pinMode(motPin, OUTPUT);  // declare motor as output
 pinMode(inLdr, INPUT);    // declare Ldr as input
 pinMode(ledPin, OUTPUT);      //
}

     

void loop(){
     
    LDR = analogRead(inLdr);  // read input value Ldr
       
   printString("A"); // Example identifier for the sensor
   printInteger(LDR); // print sensor reading
   serialWrite(10);
   serialWrite(13);
   
     printString("B"); // Example identifier for the sensor
   printInteger(sleep); // print sensor reading
   serialWrite(10);
   serialWrite(13);
   delay(20);

  //BEHAVIOURs
 
if (LDR > 300) {
   sleep = false;        //FLAG
   }
   if (LDR <300) {
   sleep = true;         //FLAG 
   }
    if (brightness >= 254) {
   Direction = 0;
   }
   if (brightness == 0) {
   Direction = 1;
   }
   
  //sleeping()

   if (!sleep) {   //consulta el FLAG   !flag es como preguntar NO FLAG o FLAG == 0
       if (Direction == 1) {
       brightness = brightness+ 1 ;
       }else{
       brightness = brightness- 0.8 ;
       }
       analogWrite(ledPin, brightness);
      delay (8);
      }
   
   if (sleep) {  //consulta el FLAG
       if (Direction == 1) {
       brightness = brightness+ 1 ;
       }else{
       brightness = brightness- 0.8 ;
           }
       analogWrite(ledPin, brightness);
      delay (8);
      }

}

Dime mirando este código que otra variable se comporta tambien como FLAG?

El direction = 0
direction = 1

Esas variables se comportan como flag

Entiendo lo que es un si o un no en electronica o un 1 o 0 como true o false, solo que no logro reducir la distancia de sensado de un sensor, este es mi codigo:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int trigger=10;
const int echo=13;

float distance;

void setup(){
Serial.begin(9600);
pinMode(trigger,OUTPUT);
pinMode(echo,INPUT);
lcd.begin(16,2);
}

void loop(){
//Inicializamos el sensor
digitalWrite(trigger,LOW);
delayMicroseconds(5);
// Comenzamos las mediciones
// Enviamos una señal activando la salida trigger durante 10 microsegundos
digitalWrite(trigger,HIGH);
delayMicroseconds(10);
digitalWrite(trigger,LOW);
// Adquirimos los datos y convertimos la medida a metros
distance=pulseIn(echo,HIGH); // Medimos el ancho del pulso
// (Cuando la lectura del pin sea HIGH medira
// el tiempo que transcurre hasta que sea LOW
distance=distance*0.0001657;
// Enviamos los datos medidos a traves del puerto serie y al display LCD
Serial.println("Distancia ");
Serial.println(distance);
lcd.setCursor(0,0);
lcd.print(distance);
Serial.println(“cm”);
delay(800);
}

Tu programa solo muestra la medida leida que esta disponible en tu variable distance

Lo que te sugiere ElEspañol es

medir distancia cada p.e. 100ms (recomendable libreria <NewPing.h>)
si esta mas cerca de 50 cm y flag no puesto, guardar los millis y poner flag que el tiempo corre
se esta mas lejos de 50 borrar flag
si han pasado 10s y flag puesto, → alarma

Primero te sugiere que uses la librería NewPing.h trabajo que no te has tomado.

// ---------------------------------------------------------------------------
// Example NewPing library sketch that does a ping about 20 times per second.
// ---------------------------------------------------------------------------

#include <NewPing.h>

#define TRIGGER_PIN  10  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN      13  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
#define ALARMA 12
#define TIEMPOTEST 10000

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
unsigned int distance; 

void setup() {
  Serial.begin(9600); // abre el monitor serial a 9600
}

void loop() {
  delay(50);                      // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
  unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).
  Serial.print("Ping: ");
  distance = uS / US_ROUNDTRIP_CM;
  Serial.print(distance); // Convert ping time to distance in cm and print result (0 = outside set distance range)
  Serial.println("cm");
  
  if (distance < 50) {
     if (!flag) {             // si viene de flag == false entonces 
        flag = true;        // cambio estado del flag e inicializo time
        time = millis();   
     } 
  }
  else 
     flag = false;

  if (flag && (millis() - tiempo > TIMETEST)) {
      digitalWrite(ALARMA, HIGH);  // Si supero 10 segundos activo pin ALARMA
  }
  else {
      digitalWrite(ALARMA, LOW);
  }
}

a ver si funciona!!

Vamos a ver, muchas gracias por tu ayuda, una pregunta.....que pongo en "unsigned int distance; "

Me respondes y respondo si funciono, gracias

Como que pones?
hablas de inicializarlo? pues si quieres 0, pero no hace falta ya que

distance = uS / US_ROUNDTRIP_CM;
  Serial.print(distance);

la variable no se usa hasta que calcula el valor que antes enviabas por Serial.print te acuerdas? en tu codigo dice Serial.print(uS / US_ROUNDTRIP_CM);
yo lo calculo eso, lo asigno a distance y luego puedo comprobar si cumple o no mis consignas.

variables por defecto tienen el valor 0, FALSE, LOW o "", depende del tipo.
No hace falta asignar un valor a la hora de definir una variable.

Totalmente de acuerdo pero si te hace feliz inicializarlo pues que lo haga.
Además, distance no tiene ningun comportamiento porque es una variable que toma datos del sensor ultrasónico, de modo que ponerla a 0 o a 65535 da igual.

He logrado reducir la distancia de medida de mi sensor a 51 cm. gracias a una librería que encontré, esto es de gran ayuda, pero....ahora quiciera molestarlos con otro tema, como podría enviar la señal de eco solo si es menor a 48 cms por ejemplo??
Se me ocurre ocupar un "if" este es mi nuevo programa....muchas gracias y disculpen

He logrado reducir la distancia de medida de mi sensor a 51 cm. gracias a una librería que encontré, esto es de gran ayuda, pero…ahora quiciera molestarlos con otro tema, como podría enviar la señal de eco solo si es menor a 48 cms por ejemplo??
Se me ocurre ocupar un “if” este es mi nuevo programa…muchas gracias y disculpen

#include <LiquidCrystal.h> //Incorporamos libreria LCD
#include <Ultrasonic.h> // Incorporamos la libreria Ultrasonic
LiquidCrystal lcd(12, 11, 5, 4, 3,2); //Inicializamos la librería e indicamos cada pin donde está conectado
Ultrasonic ultraso (6, 7); //Declaramos los pines del ultrasonico (6 =>Trigger, 7 => Echo

int distancia; //Declaramos una constante
int pausa; //Declaramos una constante
void setup(){
lcd.begin(16,2); //Indicamos cuantas columnas y cuantas filas tiene la LCD

}

void loop(){
lcd.setCursor(0,0); //Posicionamos el cursor en la columna 0, linia 1
distancia = ultraso.Ranging(CM); //Medimos la distancia del sonar
lcd.print(" Distancia: “); //Comandos para ver en pantalla la distancia del obstaculo
lcd.setCursor(0,1);
lcd.print(distancia);
lcd.println(” cm");
}

como podría enviar la señal de eco solo si es menor a 48 cms por ejemplo??

para que quieres enviar la señal de ECO solo si es menor a 48?
Ahora entiende esto para medir hay que enviar una señal, esperar que golpee un objeto y recibir su eco.
Como vamos a evitar el ECO sin lo necesitamos para medir la distancia?

Lo que pasa es que no quiere evitar el eco, solo decirle al arduino que la tome si es que la distancia calculada es menor a 48cm, es para que me envié una señal a un interfaz solo si detecta algo bajo esos centimetros.

De nuevo como evitas el eco si no envias la señal.
El sensor ultrasónico envía una señal que rebota en el objeto y ahi recibe el eco.
La distancia se determina midiendo el tiempo que demora entre ir y volver /2. Conocida la velocidad del sonido en el aire a la temperatura X puedes estimar la distancia al objeto.
Ahora el eco es el resultado del pulso inicial.
No hay manera de evitar ese eco a menos que no envies el burst TX.
Si no envias el Burst no tienes distancia.
Si no tienes distancia no sabes si estas por encima o por debajo de 48 cmts.

Me entiendes o yo no entiendo algo?Lo que pasa es que no quiere evitar el eco, solo decirle al arduino que la tome si es que la distancia calculada es menor a 48cm, es para que me envié una señal a un interfaz solo si detecta algo bajo esos centimetros.

Si miras el gráfico debes entender que el proceso de enviar el burst o pulsos TX inician toda la secuencia que termina cuando el eco llega al receptor ultrasónico. Como sabe la distancia si no midio la distancia. Eso es lo que no entiendo en tu explicación?

que te parece esto:

if (distancia<48)
{
haz algo…
}

asi el código sólo se ejecuta si la distancia es menor de 48 cm.

es esto lo que buscas?

Lo mismo esta respondido 3 o 4 msgs atrás.
Me parece que fabian esta un poco perdido.
Es asi fabian?
No entiendo que quieres hacer, debates entre esto y programas con Labview.
Donde esta la unión de las cosas?

Hola Compañeros colegas es que nesecito una orientaciony ayuda por que nesecito hacer un tipo de proyecto con estas indicaciones: determine la velocidad de un objeto con los sensores ultrasónicos en una distancia de aproximadamente dos metros, los dos sensores entaras a una distancia de 20 cm entre si (enfrete uno de otro) para ver a que velocida va el objeto. Mi pregunta es como sabre acortar el tiempo entra sensor y sensor para ver a que velocidad va ek objeto

Has respondido en un hilo que ya tiene más de 120 días.
Por favor, abre otro hilos con tu misma consulta.