Medidor de Distancia Ultrasónico con Arduino y LCD I2C

Este proyecto es una excelente introducción al mundo de la microelectrónica y la programación, combinando la versatilidad de la placa Arduino Uno con la precisión de un sensor ultrasónico HC-SR04 y la conveniencia de una pantalla LCD 16×2 con interfaz I2C. El objetivo principal es medir la distancia entre el sensor y un objeto y mostrar el resultado en centímetros directamente en la pantalla de cristal líquido.



🔩Funcionamiento

El Poder de I2C en la LCD

Tradicionalmente, las pantallas LCD 16×2 requerían hasta 12 cables para funcionar en modo de 4 bits, consumiendo la mayoría de los pines digitales del Arduino. La interfaz I2C (Inter-Integrated Circuit) resuelve esto a través de un pequeño adaptador que contiene un chip (a menudo un PCF8574).

  • Principio: I2C es un protocolo de comunicación serial de dos hilos (SDA y SCL) que permite que múltiples dispositivos (‘esclavos’) se comuniquen con un ‘maestro’ (el Arduino) utilizando solo esos dos pines.
  • Ventaja: En este proyecto, el uso de I2C libera los pines Digitales 2 al 7 para otros usos (como controlar un relé para abrir una cerradura real), permitiendo una escalabilidad del proyecto.

PINES del I2C

Pin del I2CProtocoloNotas Importantes
VCCAlimentaciónUso de 5V.
GNDTierraConexión de referencia.
SDAI2CLínea de Datos Serial.
SCLI2CLínea de Reloj Serial.

El Sensor Ultrasónico HC-SR04

El HC-SR04 es el corazón de la medición. Utiliza el principio de la ecolocalización, similar a como lo hacen los murciélagos.

  1. Emisión: Un pulso corto (de al menos 10µs) enviado al pin TRIG del sensor hace que este emita un tren de 8 pulsos ultrasónicos de 40kHz.
  2. Viaje: Las ondas de sonido viajan hasta chocar con un objeto.
  3. Recepción: El eco de las ondas rebota y es detectado por el pin ECHO del sensor.
  4. Medición: El tiempo que tarda el sonido en ir y volver es capturado por el Arduino.

La distancia se calcula usando la fórmula física de la cinemática:

Distancia = Velocidad del sonido x tiempo de viaje / 2

Dado que la velocidad del sonido en el aire es aproximadamente 343 m/s (0.0343cm / µs), y dividimos por 2 porque el tiempo medido es de ida y vuelta, la fórmula práctica para el Arduino es:

Distancia (cm) ≈ Duración del Pulso Echo (μs)​ / 58

PINES del HC-04

Pin del HC-04ProtocoloNotas Importantes
VCCAlimentaciónUso de 5V.
GNDTierraConexión de referencia.
TRIGPWMEmisor del pulso ultrasónico
ECHOPWMReceptor del pulso de eco (mide el tiempo)

🔨Componentes

ComponenteCantidadEspecificaciónFunción
Placa Arduino1Arduino Uno, Nano, etc.Control de componentes(cerebro)
LCD11602a 16×2Mostrar información
Interfaz1I2CReducir pines del LCD
Sensor ultrasónico1HC-04Medir distancias
Cables de conexiónnUnir los componentes


🔌Conexiones

Conexión LCD 16×2 con I2C

LCD (I2C)PinArduino Pin
GNDGND
VCC5V
SDAA4
SCLA5

Conexión del HC-04 ultrasónico:

HC-04 PinArduino Pin
VCC5V
GNDGND
TRIGD9
ECHOD10

0️⃣Código

Ejecuta el siguiente código, no olvidar instalar la librería “LiquidCrystal_I2C” por marcoschwartz o similar.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// 1. INCLUSIÓN DE LIBRERÍAS
// Necesaria para manejar la pantalla LCD 16x2 con interfaz I2C.
#include <LiquidCrystal_I2C.h>

// 2. DEFINICIÓN DE CONSTANTES Y PINES
// Definición de los pines para el sensor ultrasónico HC-SR04
const int pinTrig = 9;   // Pin digital 9 conectado a TRIG del HC-SR04
const int pinEcho = 10;  // Pin digital 10 conectado a ECHO del HC-SR04

// Constante para la velocidad del sonido en cm/microsegundo
// 1 / 58 = 0.01724 (que es 1 / (2 * 0.0343 cm/µs))
const float divDistancia = 58.0;

// 3. INICIALIZACIÓN DE OBJETOS
// Inicialización del objeto LCD:
// La dirección I2C común es 0x27 o 0x3F. (Asegúrate de verificar la tuya si no funciona).
// 16, 2 indican que es una pantalla de 16 columnas y 2 filas.
LiquidCrystal_I2C lcd(0x27, 16, 2);

// 4. FUNCIÓN SETUP() - Configuración Inicial
void setup() {
  // Inicialización de la comunicación serial (opcional, para depuración en el monitor)
  Serial.begin(9600);
  Serial.println("Iniciando Medidor Ultrasónico...");

  // Configuración de los pines del sensor
  pinMode(pinTrig, OUTPUT); // TRIG como salida para enviar el pulso
  pinMode(pinEcho, INPUT);  // ECHO como entrada para recibir el tiempo

  // Inicialización de la pantalla LCD
  lcd.init();      // Inicializa el LCD
  lcd.backlight(); // Enciende la retroiluminación

  // Mensaje de bienvenida inicial en el LCD
  lcd.setCursor(0, 0); // Coloca el cursor en la columna 0, fila 0
  lcd.print(" Medidor de Distancia ");
  lcd.setCursor(0, 1); // Coloca el cursor en la columna 0, fila 1
  lcd.print("    Iniciando...    ");

  // Pequeña pausa para que se vea el mensaje de inicio
  delay(2000); 
  lcd.clear(); // Limpia la pantalla
}

// 5. FUNCIÓN LOOP() - Bucle Principal
void loop() {
  // 5.1. MEDICIÓN DE DISTANCIA
  // ----------------------------------------------------
  
  // Garantizar que el pin TRIG esté en LOW antes de enviar el pulso
  digitalWrite(pinTrig, LOW);
  delayMicroseconds(2); 

  // Enviar el pulso de 10 µs para activar la emisión de ultrasonido
  digitalWrite(pinTrig, HIGH);
  delayMicroseconds(10);
  digitalWrite(pinTrig, LOW);

  // La función pulseIn() mide la duración del pulso en el pin ECHO.
  // Mide el tiempo que tarda el pin ECHO en pasar de LOW a HIGH (el eco).
  long duracion = pulseIn(pinEcho, HIGH); 

  // 5.2. CÁLCULO DE DISTANCIA
  // ----------------------------------------------------
  
  // Cálculo de la distancia en centímetros:
  // Distancia = Duración del Pulso (µs) / 58 (factor de conversión)
  float distancia_cm = duracion / divDistancia; 

  // 5.3. IMPRESIÓN DE RESULTADOS
  // ----------------------------------------------------

  // Imprimir en el Monitor Serial (para depuración)
  Serial.print("Tiempo (us): ");
  Serial.print(duracion);
  Serial.print(" | Distancia (cm): ");
  Serial.println(distancia_cm);

  // Imprimir en la Pantalla LCD
  lcd.setCursor(0, 0); 
  lcd.print("Distancia Actual:");

  // Mover el cursor a la segunda fila para el valor
  lcd.setCursor(0, 1);
  
  // Imprimir el valor flotante con 2 decimales
  lcd.print(distancia_cm, 2); 
  lcd.print(" cm    "); // Espacios en blanco para borrar restos de valores anteriores

  // Pausa antes de la siguiente medición para evitar lecturas erráticas
  delay(500); // 500 milisegundos (media segundo)
}


🖌️Diseños


🎬Videos


📑Conclusión

Este proyecto de medidor de distancia ultrasónico, que integra un Arduino Uno, un sensor HC-SR04 y una LCD 16×2 I2C, ha demostrado ser una implementación práctica y altamente eficiente de los principios de la acústica y la microelectrónica.

Hemos logrado con éxito la adquisición de datos en tiempo real mediante el método de ecolocalización. El Arduino, actuando como el cerebro del sistema, mide con precisión el tiempo de vuelo (Time-of-Flight) de la onda ultrasónica y traduce este valor a centímetros, utilizando una fórmula física simple, pero potente (Distancia (cm) ≈ Duración del Pulso Echo(μs)​ / 58)

La elección de la pantalla LCD con interfaz I2C ha sido crucial, ya que simplifica el cableado a solo cuatro conexiones (VCC, GND, SDA, SCL), liberando valiosos pines digitales del Arduino para futuras expansiones.

En resumen, este proyecto no solo proporciona una herramienta funcional para medir distancias con un margen de error mínimo, sino que también sirve como una sólida base educativa que entrelaza la programación (C++ en el entorno Arduino), la electrónica digital y conceptos físicos fundamentales, siendo un excelente punto de partida para aplicaciones más complejas como la robótica de evasión de obstáculos o sistemas de monitoreo de niveles.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Carrito de compra