Sensor ultrasónico

Hola es la primera vez entro eh el foro. Por favor si alguien me puede enseñar como conseguir que el sensor ultrasonico me refleje si un objeto se acerca o se aleja
Creo que puede ser con arrays.
O PUEDE ser de otra forma entiendo que se guarda la última medida y en la siguiente se comprueba si es mayor o menor . Soy principiante.
Gracias

Hola Franarjo

Si buscas por el foro, hace mucho tiempo yo puse algún post sobre el sensor de ultrasonidos.
Ten en cuenta que tiene problemas a la hora de leer las distancias, sobre todo si usas un HCRS04, o 05

La mayoría de las veces, no desprecia el eco, y toma esos retornos de sonidos que proceden de rebotes como sonido bueno y da un error en la lectura.
Creo recordar que subí un filtto modal para solucionar ese problema donde hacía una media de todas las tomas de sonido recibidas.
Las ordenaba de mayor a menor, y al revés. Luego cogía la toma intermedia como la válida.

También este sensor tiene mucha diferencia en el resultado de la medida, en función de la temperatura que tengas en ese momento.
Depende de la temperatura de la habitación que estés midiendo, te dará un resultado y otro distinto si por ejemplo hace más calor.

Para indicar si se aleja o se acerca, puedes hacerlo con dos o tres variables.
DATO 1
DATO 2
DATO 3

tomas la medida y le asignas el valor DATO 1
Vuelves a tomar la y le asignas el valor DATO 2
Por último la tomas de nuevo y le asignas el valor DATO 3

Luego pones un condicional y en función si DATO 1> DATO 2>DATO 3, se aleja o se separa.

Para empezar, date por contento.
Luego ya depurarás el código con Arrays

muchas gracias lo he conseguido con este codigo

const int pecho = 2;
const int ptrig = 3;
int duracion, distancia,distancia2,distancia3;
void setup() {
Serial.begin(9600);
 pinMode(pecho, INPUT);
 pinMode(ptrig, OUTPUT);
}
void loop() {
 digitalWrite(ptrig, LOW);
 delay(10);
 digitalWrite(ptrig, HIGH);
 delay(0.01);
 digitalWrite(ptrig, LOW);
 duracion = pulseIn(pecho, HIGH);
 delay(100);
   distancia = (duracion/2)*0.034;
  Serial.print(distancia);
 
 
  Serial.println(" cm distancia");
  delay(830);
 
   digitalWrite(ptrig, LOW);
 delay(10);
 digitalWrite(ptrig, HIGH);
 delay(0.01);
 digitalWrite(ptrig, LOW);
 duracion = pulseIn(pecho, HIGH);
 delay(100);
   distancia2 = (duracion/2)*0.034;
 
  Serial.print(distancia2);
  Serial.println(" cm distancia 2");
  delay(830);
 
 
 
   digitalWrite(ptrig, LOW);
 delay(10);
 digitalWrite(ptrig, HIGH);
 delay(0.01);
 digitalWrite(ptrig, LOW);
 duracion = pulseIn(pecho, HIGH);
 delay(100);
   distancia3 = (duracion/2)*0.034;
 

   
  Serial.print(distancia3);
  Serial.println(" cm distancia3");
 
  delay(830);
 
  if (distancia3 > distancia){Serial.println(" alejando");}
   if (distancia3 < distancia){Serial.println(" acercando");}

 
    }

Te recomiendo que veas en normas del foro cómo meter el código en el post, así será más sencillo poder prestarte ayuda.

Ánimo que es muy sencillo.

Mi consejo es que si estas aprendiendo a programar ELIMINA de tus opciones el uso de delay() salvo para aquellos casos menores en los que requieres de un poco de retarno y no afecta el flujo normal del mismo.
En todos los demás casos, si lo hace. Ejemplo: delay(830) son mas de 800 mseg o sea casi 1 segundo que el Arduino no hace nada.

Si ves esta librería newping presente en tu Gestor de librerías, simplificas todo tu código de manera simple y prolija.

Ahora antes de considerar que los valores son valores son malos haz una prueba con alguno de los ejemplos de NewPing.h y luego nos comentas.

Este es un ejemplo de NewPing, mira qué simple es

#include <NewPing.h>

#define TRIGGER_PIN  12  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     11  // 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.

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

void setup() {
  Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
}

void loop() {
  delay(50);                      // Espera 50ms entre consultas (casi 20 consultas/sec). 29ms es el tiempo mas corto que se puede usar
  unsigned int uS = sonar.ping(); // Envía eco, y lo recibe y expresa en uSeg  Serial.print("Ping: ");
  Serial.print(uS / US_ROUNDTRIP_CM); // convierte ping en distancia en CM
  Serial.println("cm");
}

Ahora para saber si algo se aleja o se acerca necesitas tomar dos lecturas separadas un tiempo determinado, digamos 1 Segundo. Siguiendo el criterio de Katynga vamos a promediar 5 valores de forma rápida luego esperamos 1 segundo y otros 5 lecturas y tomamos una resolución.

Llamo Promedio1 a los primeros 5 valores y Promedio2 a los segundos 5 valores.

Si P2 > P1 el objeto se aleja
Si P1 < P2 el objeto se acerca.