Distancia máxima medida con sensor de ultrasonido HC-SR04

Buenas tardes. Estoy haciendo un proyecto para medir la altura que salta una persona, para ello utilizo un HC-SR04 en la parte superior y una matriz 8x8 MAX7219. Cuanto más cerca del sensor de ultrasonido llega la persona, más leds se encienden.
Funciona perfectamente, pero necesitaría que se mantengan encendidos los leds de la altura máxima alcanzada (la más cercana al sensor) durante X tiempo. Actualmente se van encendiendo progresivamente de menor a mayor y visceversa con cada lectura del sensor de ultrasonido.
Dejo el código resumido, ya que el original es muy largo ya que contempla la distancia cada 2,5 cm.


# define led 13
 int trigger = 10;           // declaramos la palabra trigger como un tipo entero y al mismo tiempo reemplaza al pin 9
 int echo = 9;           // declaramos la palabra echo como un tipo entero y al mismo tiempo reemplaza al pin 8
 float tiempo_de_espera,distancia; // creamos una variable de fotante; es decir, nos puede dar resultados en decimales.

#include "LedControl.h"     // incluye libreria LedControl

LedControl lc=LedControl(11,5,13,1); // crea objeto

unsigned long delaytime=100;

void setup() {
  Serial.begin (9600);   // establemos la comucicacion serial
  pinMode (trigger, OUTPUT); // declarmos el pin 9 como salida
  pinMode (echo, INPUT);   // declaramos el 8 como entrada
  
{  lc.shutdown(0,false);     // enciende la matriz
  lc.setIntensity(0,4);     // establece brillo
  lc.clearDisplay(0);     // blanquea matriz

}
}

void writeA() {
  /* here is the data for the characters */
  byte a[8]={B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111};

lc.setRow(0,0,a[0]);
  lc.setRow(0,1,a[1]);
  lc.setRow(0,2,a[2]);
  lc.setRow(0,3,a[3]);
  lc.setRow(0,4,a[4]);
  lc.setRow(0,5,a[5]);
  lc.setRow(0,6,a[6]);
  lc.setRow(0,7,a[7]);
  delay(delaytime);
}
void writeB() {
  /* here is the data for the characters */
  byte a[8]={B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111110};

lc.setRow(0,0,a[0]);
  lc.setRow(0,1,a[1]);
  lc.setRow(0,2,a[2]);
  lc.setRow(0,3,a[3]);
  lc.setRow(0,4,a[4]);
  lc.setRow(0,5,a[5]);
  lc.setRow(0,6,a[6]);
  lc.setRow(0,7,a[7]);
  delay(delaytime);
}
void writeC() {
  /* here is the data for the characters */
  byte a[8]={B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111111,B11111100};

lc.setRow(0,0,a[0]);
  lc.setRow(0,1,a[1]);
  lc.setRow(0,2,a[2]);
  lc.setRow(0,3,a[3]);
  lc.setRow(0,4,a[4]);
  lc.setRow(0,5,a[5]);
  lc.setRow(0,6,a[6]);
  lc.setRow(0,7,a[7]);
  delay(delaytime);
}


void loop() {

digitalWrite (trigger,LOW); // ponemos en bajo el pin 8 durante 2 microsegundos
delayMicroseconds(2);
digitalWrite (trigger, HIGH);// ahora ponemos en alto pin 8 durante 10 microsegundos;
delayMicroseconds (10);     // pues este el momento en que emite el sonido durante 10 segungos
digitalWrite (trigger, LOW); // ahora ponemos en bajo pin 8 
tiempo_de_espera = pulseIn (echo,HIGH); // pulseIn, recoge la señal del sonido que emite el trigger
/*La función pulseIn espera la aparición de un pulso en una entrada y mide su duración, dando como resultado la duración medida                   
 El primer parámetro (ECHO) es el pin sobre el que se realizará la medición.
Y el segundo parámetro (HIGH) indica si el pulso a esperar será un 1 (HIGH) o un 0 (LOW).
 */
distancia =(tiempo_de_espera/2)/29.15; // formula para hallar la distancia

Serial.print (distancia);    // imprimimos la distancia en cm
Serial.println ("cm");
delay (200);

if (distancia>=2 && distancia <=10){
  writeA();
}
if (distancia>10 && distancia <=12.5){
  writeB();
}
if (distancia>=12.5 && distancia <=15){
  writeC();
}
}

Seguramente podría estar mejor optimizado el código, pero es mi primer proyecto.

Bienvenido mi amigo
Primero, el cálculo de la distancia debe ser en cm.
A través de esta ecuación hasta que sea correcta

distance=(duration1/2)*0.0324;

Gracias por la sugerencia. He probado con ambas ecuaciones (distancia =(tiempo_de_espera/2)/29.15; Y distance=(duration1/2)*0.0324;) y en ambas me da la misma distancia a medir. Con respecto a "grabar" la mayor distancia alcanzada en un periodo de tiempo ¿se te ocurre como podría hacerlo?

Y sí, son son recíprocos, o sea

1/29.15 = 0.0324

Claramente va a dar lo mismo dividir un valor por 29.15 que multiplicarlo por 0.0324

Respecto a marcar la altura, guarda el valor máximo y luego por medio de millis() lo mantienes encendido el tiempo que sea necesario. Si durante ese tiempo detectaras un nuevo máximo, enciendes el led que corresponda y reinicias el tiempo.

Saludos

Gracias por la respuesta. He leido el post "Entender millis y no morir en el intento" y me ha quedado clara su función, pero no he logrado marcar la altura y guarda el valor máximo para que queden encendidos los led hasta que se detecte una distancia mayor.

Como sabes que un número es mayor que otro? Lo comparas y te quedas con el mas grande.
Entonces cómo puedes obtener tu altura máxima? Pues comienzas con alturas de 0 o minimas y toda aquella que la supera se transformará en un máximo porque es justamente mayor que la anterior.
Ahi tienes tu máximo y con el disparas tu tiempo de permanencia usando millis().

  • alcanzas el máximo.
  • almacenas millis() y ya que alcanzaste el maximo y has iniciado ese tiempo para los leds entonces comparas millis() actual con ese valor alamcenado y mientras sea menor que determinado tiempo mantienes los leds o lo que sea que desees.

¿Podrías ejemplificarlo de forma práctica?
He intentando usando el código que has propuesto en este hilo;

> Cita

pero no he logrado que funcione.

if (valorLeido >= maximo) {
  maximo = valorLeido;
  tiempo = millis();
}

Cambia los nombres de las variables según las que tu usas.

Saludos

Gracias por las respuestas, pero no logro que grabe la distancia máxima hasta que esta sea superada.

Empieza con una distancia = 0 y toda distancia mayor la va a superar y la presentará.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.