#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Define el pinout del sensor ultrasónico
const int trigPin = 9;
const int echoPin = 10;
// Define el pin del LED
const int ledPin = 13;
// Inicializa la pantalla LCD con la dirección I2C 0x27 y tamaño de 16x2
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Variables para calcular la distancia
long duration;
int distance;
// Número de muestras
const int numLecturas = 30; //Cant. de lecturas antes de mostrar medición
float lecturas[numLecturas]; // Array para almacenar lecturas
int lecturaActual = 0; // Lectura por la que vamos
float total = 0; // Total de las que llevamos
float media = 0; // Media de las medidas
bool primeraMedia = false; // Para saber que ya hemos calculado por lo menos una
void setup() {
// Configura los pines del sensor ultrasónico
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Configura el pin del LED
pinMode(ledPin, OUTPUT);
// Inicializa la comunicación serie
Serial.begin(9600);
// Inicializa la pantalla LCD
lcd.begin(16, 2); // Pasa el número de columnas y filas como argumentos
lcd.backlight();
// Inicializamos el array
for (int i = 0; i < numLecturas; i++)
{
lecturas[i] = 0;
}
delay(50);
// Muestra la distancia en la pantalla LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Distancia: ");
}
void loop() {
// Eliminamos la última medida
total = total - lecturas[lecturaActual];
// Genera un pulso en el pin trig
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Lee el pulso en el pin echo
duration = pulseIn(echoPin, HIGH);
// Calcula la distancia en centímetros
distance = duration * 0.034 / 2;
// Enciende el LED si la distancia es menor al umbral y mantenlo encendido por 5 segundos
if (distance < 30) {
digitalWrite(ledPin, HIGH);
delay(500); // Mantiene el LED encendido por 5 segundos
digitalWrite(ledPin, LOW);
} else {
digitalWrite(ledPin, LOW);
}
if ( (primeraMedia) && (distance != media ) && ( ((((distance/media)-1)*100)>1) || (((((distance/media)-1)*100)*-1)>1)) )
{
Serial.println("ingreso a limpiar array y datos");
Serial.println("Distance:" + String(distance) );
Serial.println("media:" + String(media));
for (int i = 0; i < numLecturas; i++)
{
lecturas[i] = 0;
lecturaActual = 0; // Lectura por la que vamos
}
primeraMedia = false; //Indicamos que no se muestran mas datos hasta calcular nueva media
total =0; // Borras total
media =0; // Borramos media si el cambio fue > 4 o < 4
}
if ((!primeraMedia))
{
// Almacenamos la distancia en el array
lecturas[lecturaActual] = distance;
// Añadimos la lectura al total
total = total + lecturas[lecturaActual];
// Avanzamos a la siguiente posición del array
lecturaActual = lecturaActual + 1;
Serial.println("Total : " + String(total));
Serial.println("Lectura Actual :" + String(lecturaActual));
// Calculamos la media
media = total / numLecturas;
Serial.println("Media : " + String(media));
// Comprobamos si hemos llegado al final del array
if (lecturaActual >= numLecturas)
{
primeraMedia = true;
lecturaActual = 0;
//Muestro la media calculada o recalculada en el LCD
lcd.setCursor(0, 1);
lcd.print(media);
lcd.print(" cm");
//Espera con Delay
delay (300000); // espera de 300000 seg = 5 min si la media fue calculada
}
}
// Agrega un DELAY en el caso de que la lectura no cambie.... para que no se ejecute nuevamente el loop
if (primeraMedia)
{ Serial.println("Calculo :" + String((((distance/media)-1)*100)));
if ((((distance/media)-1)*100)<1 || ((((distance/media)-1)*100)>-1))
{
//Si la variacion de la distancia este entre Distancia/Media es < 1% o > -1% no hace nada, solo delay en el loop
Serial.print("distancia: " + String(distance));
Serial.println (" - media: " + String(media));
delay(300000); //demora 300000 = 5 min si la lectura vario menos de 1%
}
}
// Espera 500 ms antes de medir nuevamente
delay(300);
}