// ============================================================
// Tópicos Selectos en Computación
// Práctica 12: Sensor ultrasónico HC-SR04 y LCD
// Autor: Huerta Diaz Fabian Alejandro
// ============================================================
// El sensor emite ultrasonido a 40 000 Hz. El eco rebota en
// el objeto y regresa al sensor. Con el tiempo de vuelo y la
// velocidad del sonido se calcula la distancia: d = v·t.
// Resultado visible en LCD 16x2 y en el Serial Monitor.
#include <LiquidCrystal.h>
// --- LCD: RS=12, E=11, D4=5, D5=4, D6=3, D7=2 ---
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
// --- HC-SR04 ---
const int trig = 9; // Disparo (OUTPUT)
const int echo = 8; // Eco (INPUT)
float d; // Distancia calculada (cm)
void setup() {
pinMode(trig, OUTPUT);
pinMode(echo, INPUT);
Serial.begin(9600);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Dist:");
lcd.setCursor(0, 1);
lcd.print("Coloque objeto");
}
void loop() {
// 1. Enviar pulso de disparo al sensor
digitalWrite(trig, HIGH);
delayMicroseconds(1000); // Pulso de activación
digitalWrite(trig, LOW);
// 2. Medir duración del eco y calcular distancia
// d = pulseIn(µs) / 2 / 29.1 → resultado en cm
d = pulseIn(echo, HIGH);
d = (d / 2) / 29.1;
delay(100);
// Nota: en Wokwi el slider del HC-SR04 llega hasta ~401 cm,
// por lo que se usa 380 cm como límite para poder demostrar
// el mensaje FUERA DE RANGO en el simulador.
// En hardware real este valor puede cambiarse a 500 cm.
if (d < 380) { // Dentro del rango demostrable en simulador
if (d < 100) { // Menos de 1 m → mostrar en cm
Serial.print("Distancia: ");
Serial.println(d);
lcd.setCursor(0, 0);
lcd.print("Dist: "); // Borra caracteres residuales
lcd.setCursor(6, 0);
lcd.print(d);
lcd.print(" cm");
} else { // 1 m o más → mostrar en metros
Serial.print("Distancia: ");
Serial.println(d);
lcd.setCursor(0, 0);
lcd.print("Dist: ");
lcd.setCursor(6, 0);
lcd.print(d / 100);
lcd.print(" m");
}
} else { // Objeto fuera de rango (> 380 cm en simulador)
Serial.println("FUERA DE RANGO");
lcd.setCursor(0, 0);
lcd.print(" FUERA DE RANGO ");
}
}