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:

ComponenteCosto
Caja de zapatos0 €
Servomotor0 €
Bluetooth HC-0512 €
Materiales varios0 €

Funcionamiento

  1. Estado inicial:
    • LED rojo encendido (trampa desactivada).
    • Puerta cerrada.
  2. Activación:
    • Comando Bluetooth («A») enciende LED verde y abre la puerta.
  3. 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

También te podría gustar...

Deja una respuesta

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