Proyecto 25 Medidor de Distancia Ultrasónico

1. Descripción

Este medidor de distancia ultrasónico mide la distancia de obstáculos emitiendo ondas sonoras y luego recibiendo el eco. Es decir, la distancia no es un valor inmediato, sino uno observado mediante un cálculo teórico de la diferencia de tiempo entre el emisor y el receptor.

El ultrasónico es capaz de detectar la forma de objetos, configurar puertas automáticas y estimar la velocidad de flujo y presión.

Además, soporta trabajos cooperativos con computadoras. Como resultado, el valor medido puede ser transmitido a computadoras a través de la placa Arduino.

En la vida diaria, se utiliza ampliamente para motores, servos y LEDs, así como en sistemas (navegación automática, control y sistemas de monitoreo de seguridad).

2. Principio de Funcionamiento

Como todos sabemos, el ultrasónico es un tipo de señal de onda sonora inaudible con alta frecuencia. Similar a un murciélago, este módulo mide la distancia de obstáculos calculando la diferencia de tiempo entre la emisión de la onda y la recepción del eco.

Distancia máxima: 3M

Distancia mínima: 5cm

Ángulo de detección: ≤15°

3. Diagrama de Conexiones

4. Código de Prueba

/*
  keyestudio ESP32 Inventor Learning Kit  
  Project 25.1:Ultrasonic Rangefinder
  http://www.keyestudio.com
*/
int distance = 0; //Define una variable para recibir el valor de distancia 
int EchoPin = 14; //Conecta el pin Echo a io14
int TrigPin = 13; //Conecta el pin Trig a io13

float checkdistance() { //Adquiere la distancia 
  // conserva un nivel bajo corto para asegurar un pulso alto claro:
  digitalWrite(TrigPin, LOW);
  delayMicroseconds(2);    //Retraso de 2us
  //Dispara el sensor con un pulso alto de 10us o más 
  digitalWrite(TrigPin, HIGH);
  delayMicroseconds(10);		//Retraso de 10us
  digitalWrite(TrigPin, LOW);
  //Lee la señal del sensor: un pulso de nivel alto
  //La duración se detecta desde el momento de enviar el comando "ping" hasta recibir la señal de eco (unidad: us).
  float distance = pulseIn(EchoPin, HIGH) / 58.00;  //Convierte a distancia
  delay(10);
  return distance; //Devuelve el valor de distancia
}

void setup() 
{
  Serial.begin(9600);//Configura la velocidad en baudios a 9600
  pinMode(TrigPin, OUTPUT);//Configura el pin Trig como salida
  pinMode(EchoPin, INPUT);  //Configura el pin Echo como entrada 
}

void loop() 
{
  distance = checkdistance();   //Asigna el valor leído a "distance" 
  if (distance < 4 || distance >= 400) //Muestra "-1" si excede el rango de detección 
  {  
    distance = -1;
  }
  Serial.print("ditance: ");
  Serial.print(distance);
  Serial.println(" CM");
  delay(200);
}

5. Resultado de la Prueba

Después de conectar el cableado y subir el código, abre el monitor serial y configura la velocidad en baudios a 9600, el puerto serial imprimirá el valor de la distancia.

6. Ampliación de Conocimientos

Vamos a hacer un medidor de distancia.

Mostramos caracteres en un LCD 1602. Programa para mostrar “Keyestudio” en (3,0) y “distance:” en (0,1) seguido del valor de distancia en (9,1).

Cuando el valor es menor que 100 (o 10), aún queda un residuo del tercer (o segundo) dígito. Por lo tanto, es necesario un juicio “if” para determinar una condición específica.

Diagrama de Conexiones:

Código:

/*
  keyestudio ESP32 Inventor Learning Kit  
  Project 25.2:Ultrasonic Rangefinder
  http://www.keyestudio.com
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); //configura la dirección del LCD a 0x27 para una pantalla de 16 caracteres y 2 líneas

int distance = 0; //Define una variable para recibir el valor de distancia 
int EchoPin = 14; //Conecta el pin Echo a io14
int TrigPin = 13; //Conecta el pin Trig a io13
float checkdistance() { //Adquiere la distancia 
  // conserva un nivel bajo corto para asegurar un pulso alto claro:
  digitalWrite(TrigPin, LOW);
  delayMicroseconds(2);
  //Dispara el sensor con un pulso alto de 10us o más 
  digitalWrite(TrigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(TrigPin, LOW);
  // Lee la señal del sensor: un pulso de nivel alto
  //La duración se detecta desde el momento de enviar el comando "ping" hasta recibir la señal de eco (unidad: us).
  float distance = pulseIn(EchoPin, HIGH) / 58.00;  //Convierte a distancia
  delay(10);
  return distance;
}

void setup() 
{
  	Serial.begin(9600);//Configura la velocidad en baudios a 9600
  	pinMode(TrigPin, OUTPUT);//Configura el pin Trig como salida
  	pinMode(EchoPin, INPUT);  //Configura el pin Echo como entrada 
    lcd.init(); // inicializa el lcd
    // Imprime un mensaje en el LCD.
    lcd.backlight();
    lcd.setCursor(3,0);
    lcd.print("Keyestudio");
}

void loop() 
{
  distance = checkdistance();
 
  if (distance < 2 || distance >= 400) //Muestra "-1" si excede el rango de detección 
  {  
    distance = -1;
  }
  if(distance < 100 && distance > 10){             //Elimina la sombra del tercer dígito cuando el valor baja a dos dígitos
    lcd.setCursor(11,1);
    lcd.print(" ");
  }
  if(distance < 10)//Elimina las sombras de dos dígitos cuando el valor baja a un dígito
  {              
    lcd.setCursor(10,1);
    lcd.print(" ");
  }
  lcd.setCursor(0,1);
  lcd.print("distance:");
  lcd.setCursor(9,1);
  lcd.print(distance);
  delay(200);
}