Que vamos a conseguir?
Un sistema de alarma que detecta cuando algo se acerca a menos de 20cm. El sensor envia ondas de sonido y mide cuanto tardan en volver.
Lo que aprenderas:
- Como funciona un sensor ultrasonico (HC-SR04)
-
Medir tiempo de pulsos con
pulseIn() -
Usar condicionales
if/elsepara tomar decisiones - Crear funciones que devuelven valores
Hardware necesario
El HC-SR04 es un sensor barato pero muy util. Mide distancias de 2cm a 400cm usando ultrasonido.
Como funciona el sensor ultrasonico
Diagrama de conexion
TRIG y ECHO - Los dos pines del sensor
TRIG (Trigger/Disparo): Cuando enviamos un pulso de 10 microsegundos,
el sensor emite 8 pulsos ultrasonicos a 40kHz.
ECHO: Este pin se pone en HIGH mientras el sonido viaja.
Midiendo cuanto tiempo esta en HIGH, calculamos la distancia.
La formula de la distancia
El sonido viaja a 343 m/s (a 20C).
Si el eco tarda 1000 microsegundos en volver, el sonido recorrio:
1000us x 0.0343 cm/us = 34.3 cm (ida y vuelta).
La distancia real es la mitad: 17.15 cm.
Simplificado: distancia_cm = tiempo_us / 58
Ideas para construir con LEGO
El nino construye la fortaleza mientras tu preparas la alarma:
Con torres y puente levadizo
Base militar secreta
Con caja fuerte protegida
Protege las joyas!
El codigo explicado
Este programa introduce funciones que devuelven valores y condicionales para tomar decisiones.
// P3: Alarma de Fortaleza - EigenRobotics
const int TRIG = 7;
const int ECHO = 6;
const int BUZZER = 8;
const int LED = 9;
const int DISTANCIA_ALARMA = 20; // cm
void setup() {
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
pinMode(BUZZER, OUTPUT);
pinMode(LED, OUTPUT);
Serial.begin(9600);
Serial.println("Alarma de Fortaleza activada!");
}
void loop() {
int distancia = medirDistancia();
Serial.print("Distancia: ");
Serial.print(distancia);
Serial.println(" cm");
if (distancia > 0 && distancia < DISTANCIA_ALARMA) {
activarAlarma();
} else {
desactivarAlarma();
}
delay(100);
}
int medirDistancia() {
// Enviar pulso de 10 microsegundos
digitalWrite(TRIG, LOW);
delayMicroseconds(2);
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
// Medir tiempo del eco
long duracion = pulseIn(ECHO, HIGH, 30000);
// Calcular distancia
int distancia = duracion / 58;
return distancia;
}
void activarAlarma() {
digitalWrite(LED, HIGH);
digitalWrite(BUZZER, HIGH);
}
void desactivarAlarma() {
digitalWrite(LED, LOW);
digitalWrite(BUZZER, LOW);
}
Explicacion linea por linea:
pinMode(ECHO, INPUT);
Primera vez que usamos un pin como INPUT (entrada). El pin ECHO recibe informacion del sensor, no la envia. TRIG es OUTPUT porque nosotros enviamos el pulso de disparo.
int distancia = medirDistancia();
Llamamos a nuestra funcion medirDistancia() y guardamos
el resultado en la variable distancia. La funcion hace todo
el trabajo de medir y calcular, y nos devuelve un numero.
if (distancia > 0 && distancia < DISTANCIA_ALARMA)
Condicional: Si la distancia es mayor que 0 (lectura valida)
Y (&&) menor que 20cm, hay un intruso. El && significa
que ambas condiciones deben cumplirse.
delayMicroseconds(10);
Pausa de 10 microsegundos (no milisegundos). 1 microsegundo = 0.001 milisegundos. Es una pausa muy corta, necesaria para que el sensor genere los pulsos ultrasonicos.
long duracion = pulseIn(ECHO, HIGH, 30000);
pulseIn() mide cuanto tiempo esta un pin en HIGH (o LOW).
Devuelve la duracion en microsegundos. El 30000 es un timeout:
si no hay eco en 30ms, devuelve 0. Usamos long porque puede ser un numero grande.
int medirDistancia() vs void activarAlarma()
int significa que la funcion devuelve un numero.
void significa que no devuelve nada, solo hace algo.
Por eso medirDistancia() tiene return distancia; al final.
Conceptos clave:
pulseIn(pin, estado, timeout)
Mide la duracion de un pulso en microsegundos. Espera a que el pin cambie al estado indicado, mide, y espera a que vuelva.
Condicionales if/else
if (condicion) { A } else { B }
Si la condicion es verdadera, ejecuta A. Si no, ejecuta B.
Operador && (AND)
A && B es verdadero solo si A y B son verdaderos.
Tambien existe || (OR): verdadero si A o B lo son.
Funciones con return
int miFuncion() { return 42; }
Puedes usar el resultado: int x = miFuncion();
Simulador interactivo
Prueba el sensor ultrasonico en Wokwi. Puedes mover objetos para simular intrusos.
Wokwi Simulator
Abrir en WokwiConfigurar el simulador
1. Copia el codigo del proyecto.
2. Anade un HC-SR04 desde el menu de componentes.
3. Conecta: VCC-5V, TRIG-Pin7, ECHO-Pin6, GND-GND.
4. Anade un buzzer (pin 8) y LED (pin 9 con resistencia).
5. En el simulador, puedes arrastrar un "objeto" virtual para cambiar la distancia.
6. Abre el Monitor Serial para ver las lecturas.
Paso a paso
Monta tu sistema de alarma en 8 pasos.
Identifica los pines del HC-SR04
El sensor tiene 4 pines (de izquierda a derecha): VCC, TRIG, ECHO, GND. VCC va a 5V, GND va a tierra.
Conecta el HC-SR04
VCC a 5V de Arduino. GND a GND. TRIG al pin 7. ECHO al pin 6. El sensor ya esta listo para medir.
Conecta el buzzer
El buzzer tiene dos patas. La mas larga (o marcada con +) va al pin 8. La corta va a GND. Es un buzzer activo: solo necesita encenderse.
Conecta el LED
Pin 9 - resistencia 220ohm - LED (pata larga) - GND (pata corta). Sera el indicador visual de alarma.
Sube el codigo
Conecta Arduino, abre Arduino IDE, pega el codigo y subelo.
Abre el Monitor Serial
Ctrl+Shift+M para ver las lecturas de distancia en tiempo real. Acerca la mano al sensor y observa como cambian los numeros.
Ajusta la distancia de alarma
Cambia DISTANCIA_ALARMA segun el tamano de tu fortaleza.
20cm es un buen valor inicial. Para fortalezas grandes, prueba 50cm.
Juego: No actives la alarma!
El nino intenta acercar la mano a la fortaleza sin que suene la alarma. Muevete lento... muy lento... oops!
Experimentos
Mejora tu sistema de alarma con estas modificaciones.
Cambia la sensibilidad
Modifica DISTANCIA_ALARMA a 10cm (muy sensible)
o 50cm (detecta de lejos).
LED parpadeante
En lugar de LED fijo, hazlo parpadear durante la alarma
con delay(100) entre HIGH y LOW.
Cuenta atras
Antes de activar la alarma, da 3 segundos de advertencia con el LED parpadeando rapido.
Diferentes tonos
Usa un buzzer pasivo y tone(BUZZER, 1000)
para crear diferentes frecuencias de alarma.
Zonas de alerta
Menos de 10cm: alarma fuerte. 10-30cm: advertencia suave.
Mas de 30cm: todo tranquilo. Usa multiples if/else if.
Medidor de distancia
Anade un segundo LED. Usa map() para que el brillo
del LED indique la distancia (mas cerca = mas brillante).