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.