Trampa para Ratones Inteligente
Autores
Diego Galán Hernández, Rodrigo Martín Alonso y Álvaro Valverde García
Descripción del proyecto
Nuestro proyecto consiste en una trampa automatizada para animales, diseñada para cerrarse automáticamente cuando un animal entra en ella. Esto nos permite capturar al animal evitando crearle cualquier tipo de daño.

Memoria
Componentes clave:
- Sensor de proximidad HC-SR04.
- Servomotor SG90 para cerrar la puerta.
- Buzzer acústico.
- LEDs indicadores (rojo/verde).
- Control vía Bluetooth (HC-05).
Presupuesto:
Componente | Costo |
---|---|
Caja de zapatos | 0 € |
Servomotor | 0 € |
Bluetooth HC-05 | 12 € |
Materiales varios | 0 € |
Funcionamiento
- Estado inicial:
- LED rojo encendido (trampa desactivada).
- Puerta cerrada.
- Activación:
- Comando Bluetooth («A») enciende LED verde y abre la puerta.
- Detección:
- Sensor ultrasónico detecta objeto a <20 cm.
- Servomotor cierra la puerta, buzzer suena 1 segundo.
Módulos principales:
- HC-SR04: Detecta presencia del animal.
- Servomotor SG90: Cierra/abre la puerta.
- App Bluetooth: Control remoto desde Android (MIT App Inventor).

Código
// Pines HC-SR04
const int trigPin = 9;
const int echoPin = 10;
// LEDs
const int ledRojo = 2;
const int ledVerde = 3;
// Buzzer
const int buzzerPin = 8;
// Servo
Servo miServo;
const int pinServo = 6;
// Bluetooth – SoftwareSerial (HC-05)
SoftwareSerial bluetooth(12, 13); // RX, TX
// Sensor
long duracion;
int distancia;
const int distanciaUmbral = 20;
// Buzzer temporizador
bool buzzerActivo = false;
unsigned long tiempoInicioBuzzer = 0;
const unsigned long duracionBuzzer = 1000;
// Estados
enum Estado {
DESACTIVADO,
ACTIVADO,
CERRADO,
ABIERTO
};
Estado estadoActual = DESACTIVADO;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(ledRojo, OUTPUT);
pinMode(ledVerde, OUTPUT);
pinMode(buzzerPin, OUTPUT);
miServo.attach(pinServo);
cerrarPuerta(); // Cerrado al iniciar
Serial.begin(9600);
bluetooth.begin(9600);
cambiarEstado(DESACTIVADO);
Serial.println(«Sistema iniciado en modo DESACTIVADO.»);
}
void loop() {
if (bluetooth.available()) {
char comando = bluetooth.read();
Serial.print(«Comando recibido: «);
Serial.println(comando);
switch (comando) {
case 'A': case 'a':
if (estadoActual == DESACTIVADO || estadoActual == ABIERTO) {
cambiarEstado(ACTIVADO);
}
break;
case 'O': case 'o':
if (estadoActual == CERRADO) {
cambiarEstado(ABIERTO);
}
break;
case 'D': case 'd':
cambiarEstado(DESACTIVADO);
break;
}
}
// Lógica solo cuando está ACTIVADO
if (estadoActual == ACTIVADO) {
medirDistancia();
if (distancia > 0 && distancia < distanciaUmbral) {
cambiarEstado(CERRADO);
}
}
// Control del temporizador del buzzer
if (buzzerActivo && millis() – tiempoInicioBuzzer >= duracionBuzzer) {
digitalWrite(buzzerPin, LOW);
buzzerActivo = false;
Serial.println(«Buzzer desactivado tras 5 segundos.»);
}
delay(100);
}
// ================= FUNCIONES DE ESTADO =================
void cambiarEstado(Estado nuevoEstado) {
estadoActual = nuevoEstado;
switch (estadoActual) {
case DESACTIVADO:
cerrarPuerta();
digitalWrite(ledRojo, HIGH);
digitalWrite(ledVerde, LOW);
digitalWrite(buzzerPin, LOW);
Serial.println(«Modo DESACTIVADO.»);
bluetooth.println(«Trampa desactivada.»);
break;
case ACTIVADO:
abrirPuerta();
digitalWrite(ledRojo, LOW);
digitalWrite(ledVerde, HIGH);
Serial.println("Modo ACTIVADO. Esperando detección...");
bluetooth.println("Trampa activada. Esperando objeto...");
break;
case CERRADO:
cerrarPuerta();
digitalWrite(ledRojo, HIGH);
digitalWrite(ledVerde, LOW);
activarBuzzer();
Serial.println("¡Trampa CERRADA! Objeto detectado.");
bluetooth.println("¡Objeto atrapado! Trampa cerrada.");
break;
case ABIERTO:
abrirPuerta();
digitalWrite(ledRojo, HIGH);
digitalWrite(ledVerde, LOW);
digitalWrite(buzzerPin, LOW);
Serial.println("Modo ABIERTO manual.");
bluetooth.println("Trampa abierta manualmente.");
break;
}
}
// ================ FUNCIONES AUXILIARES =================
void medirDistancia() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duracion = pulseIn(echoPin, HIGH);
distancia = duracion * 0.034 / 2;
Serial.print(«Distancia medida: «);
Serial.print(distancia);
Serial.println(» cm»);
}
void abrirPuerta() {
miServo.write(200);
Serial.println(«Puerta abierta.»);
}
void cerrarPuerta() {
miServo.write(100);
Serial.println(«Puerta cerrada.»);
}
void activarBuzzer() {
digitalWrite(buzzerPin, HIGH);
buzzerActivo = true;
tiempoInicioBuzzer = millis();
Serial.println(«Buzzer activado.»);
}
Vídeo