Alarma Anti-Intrusos

El objetivo principal de nuestro proyecto era conseguir una alarma que detecte intrusos en un hogar. En el caso de detectar movimiento se activa un pitido indicando que la alarma se va a activar que dura 30 segundos y se muestra por pantalla el tiempo transcurrido . Una vez ha pasado este tiempo, aparte de ya no poder desactivarse solo con el botón, comienza un sonido más continuo y se enciende un led rojo indicando que se ha activado la alarma; en este caso solo se podrá desactivar desde una centralita (se simula como nuestro ordenador) introduciendo un código específico. Además hemos añadido la funcionalidad de una cámara que se activa de forma automática cuando detecta movimiento para informar de la situación en la casa.

El circuito consta de los siguientes componentes: Arduino UNO, Sensor de ultrasonidos HC-SR04, Servomotor SG90, Pantalla LCD 16×2, LED, Zumbador activo, Botón pulsador

Las conexiones se realizan de la siguiente manera: 

El pin VCC (+5V) del sensor de ultrasonidos se conecta al pin 5V de Arduino. El pin GND del sensor de ultrasonidos se conecta al pin GND de Arduino. El pin TRIG del sensor de ultrasonidos se conecta al pin digital 2 de Arduino. El pin ECHO del sensor de ultrasonidos se conecta al pin digital 3 de Arduino. El pin VCC (+5V) del servomotor se conecta al pin 5V de Arduino. El pin GND del servomotor se conecta al pin GND de Arduino. El pin de señal del servomotor se conecta al pin digital 9 de Arduino. El pin VSS de la pantalla LCD se conecta a GND de Arduino. El pin VDD de la pantalla LCD se conecta a 5V de Arduino. El pin VO de la pantalla LCD se conecta a un potenciómetro de ajuste, cuyo otro extremo se conecta a GND de Arduino. El pin RS de la pantalla LCD se conecta al pin digital 7 de Arduino. El pin RW de la pantalla LCD se conecta a GND de Arduino. El pin E de la pantalla LCD se conecta al pin digital 8 de Arduino. Los pines D4, D5, D6 y D7 de la pantalla LCD se conectan a los pines digitales 12, 11, 10 y 9 de Arduino, respectivamente. El ánodo (+) del LED se conecta al pin digital 6 de Arduino. El cátodo (-) del LED se conecta a GND de Arduino. El pin positivo del zumbador activo se conecta al pin digital 4 de Arduino. El pin negativo del zumbador activo se conecta a GND de Arduino. Una pata del botón pulsador se conecta al pin analógico A2 de Arduino. La otra pata del botón pulsador se conecta a GND de Arduino. 

ZUMBADOR. Está conectado al pin digital 4, se configura como una salida y se establece un valor alto (HIGH) para encender el zumbador y un valor bajo (LOW) para apagarlo. La conexión a tierra es necesaria para cerrar el circuito y permitir que fluya la corriente necesaria para que el zumbador emita el sonido.

SENSOR ULTRASONICO. Conectado al pin digital 2 (TRIG) y al pin digital 3 (ECHO) de Arduino para medir la distancia entre el sensor y un objeto cercano. El pin digital 2 se utiliza para enviar una señal de ultrasonido al objeto que se desea medir, mientras que el pin digital 3 se utiliza para recibir el eco de la señal que rebotó en el objeto. El pin VCC del sensor se conecta a una fuente de 5V, mientras que el pin GND se conecta a la referencia de tierra del circuito.

LED. Está conectado al pin digital 6 de Arduino y a tierra para poder controlar su encendido y apagado utilizando ese pin desde el código de Arduino. También está conectado a  tierra mediante una resistencia para limitar la cantidad de corriente que llegue al LED y evitar daños.

BOTÓN. Conectado al pin analógico A2 de Arduino para permitir la desactivación de la alarma. Al presionar el botón, se establece una conexión entre el pin del botón y tierra, lo que hace que el pin se lea como LOW (0V) en lugar de HIGH (5V), dependiendo de si se está presionando el botón o no. 

SERVO MOTOR. El cable de señal se conecta al pin digital 5 del Arduino que se encarga de enviar la señal PWM (modulación por ancho de pulso) para controlar la posición del servo motor. El cable de alimentación se conecta a los 5V del Arduino, que es la tensión de alimentación que proporciona el microcontrolador a los dispositivos que se conectan a él. El cable de tierra se conecta a la tierra del Arduino, que es la referencia eléctrica común para todos los dispositivos que se conectan al microcontrolador.

PANTALLA LCD. Conectada a los pines digitales 8, 9, 10, 11, 12 y 13 de Arduino para mostrar información al usuario. La pantalla LCD tiene un total de 16 pines, que se dividen en dos filas de 8 pines cada una. La primera fila de pines está etiquetada como «VSS», «VDD», «V0», «RS», «RW», «E», «D0» y «D1», mientras que la segunda fila de pines está etiquetada como «D2», «D3», «D4», «D5», «D6», «D7», «A» y «K». VSS y VDD: estos son los pines de alimentación de la pantalla LCD. VSS se conecta a tierra, mientras que VDD se conecta a 5V. RS: este es el pin de selección de registro. Si se configura como 0, el controlador de la pantalla LCD tratará los datos en los pines D0-D7 como comandos de control, y si se configura como 1, tratará los datos en los pines D0-D7 como datos que se mostrarán en la pantalla. RW: este es el pin de escritura/lectura. Si se configura como 0, se escribe en la pantalla LCD, y si se configura como 1, se lee desde la pantalla LCD. Nosotros lo hemos configurado como 0 para escribir en la pantalla LCD. E: este es el pin de habilitación de la pantalla LCD. Cuando este pin se activa (con un pulso de alto a bajo), el controlador de la pantalla LCD ejecuta la operación correspondiente. D0-D7: estos son los pines de datos de la pantalla LCD. Se usan para enviar datos y comandos a la pantalla LCD.A: este es el pin de retroiluminación positiva. Se conecta a un pin de salida de 5V para proporcionar retroiluminación a la pantalla. K: este es el pin de retroiluminación negativa. Se conecta a tierra.

PROBLEMAS Y SOLUCIONES

Nos ha supuesto un problema la limitación de entradas digitales de la placa Arduino ya que simplemente con la placa LCD1602 se consumen 6, lo que nos deja muy pocas disponibles para el resto.

Queríamos utilizar el mando por control remoto, ya que queríamos que la desactivación de la alarma una vez pasados los 30 segundos se hiciera con este, pero pese a habernos informado en diferentes ámbitos y haber investigado no hemos sido capaces de conseguirlo por lo que decidimos que se gestionara desde una central lo que, además, se asocia mucho más a la realidad.

Lo mismo nos paso con el joystick, ya que queríamos introducirlo en el proyecto para que la cámara se moviera controlada por este pero debido a que hacía interferencia con la pantalla LCD y nos salían letras raras en la pantalla, decidimos eliminar esa funcionalidad. Lo cual es mas cercano a la realidad ya que las alarmas suelen activar las cámaras sin necesidad de una persona controlando un joystick.

CODIGO

#include <LiquidCrystal.h> //control de pantalla LCD
#include <Servo.h> // Añadir la librería del servo motor

#define LDR_PIN A0
#define ULTRASONIC_TRIG 2
#define ULTRASONIC_ECHO 3
#define BUZZER_PIN 4
#define BUTTON_PIN A2
#define LED_PIN 6
#define SERVO_PIN 5 // Pin digital del servo motor

LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
Servo myServo; // Crear un objeto de la clase Servo

int buttonState = 0;
int previousButtonState = 0;
unsigned long alarmStartMillis;
unsigned long alarmDuration = 30000;
bool alarmActive = false;
bool buttonPressedDuringAlarm = false;
int LDR_THRESHOLD = 700;
int DISTANCE_THRESHOLD = 20; 

const int correctPassword = 1234; 

void setup() {
  pinMode(LDR_PIN, INPUT);
  pinMode(ULTRASONIC_TRIG, OUTPUT);
  pinMode(ULTRASONIC_ECHO, INPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  pinMode(LED_PIN, OUTPUT);
  myServo.attach(SERVO_PIN); 

  lcd.begin(16, 2);
  Serial.begin(9600);
}

void playActivationTone() {
  tone(BUZZER_PIN, 440, 200);
  delay(250);
  tone(BUZZER_PIN, 550, 200);
  delay(250);
  tone(BUZZER_PIN, 660, 200);
  delay(250);
}

void loop() {
  if (Serial.available()) {
    int input = readInput();
    if (input == correctPassword) {
      alarmActive = false;
      digitalWrite(LED_PIN, LOW);
      noTone(BUZZER_PIN);
      myServo.write(90); // Mover el servo a su posición central
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Alarma desactivada");
      delay(2000); // Muestra el mensaje por 2 segundos
    }
  }

  buttonState = digitalRead(BUTTON_PIN);
  if (buttonState != previousButtonState && buttonState == LOW)
{
if (alarmActive && millis() - alarmStartMillis < alarmDuration) {
alarmActive = false; 
digitalWrite(LED_PIN, LOW); 
noTone(BUZZER_PIN);
playActivationTone(); 
myServo.write(90); // Mover el servo a su posición central
}
delay(200); // Debounce delay
}
previousButtonState = buttonState;

int lightLevel = analogRead(LDR_PIN);
Serial.print("LDR value: ");
Serial.println(lightLevel);

int distance = readDistance();
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");

alarmFunction(distance);
delay(1000); 
} //acaba loop

void alarmFunction(int distance) {
bool alarmTriggered = (distance <= DISTANCE_THRESHOLD && distance != 0);

if (alarmTriggered && !alarmActive) {
alarmActive = true;
alarmStartMillis = millis();
buttonPressedDuringAlarm = false;
}

if (alarmActive) {
if (millis() - alarmStartMillis <= alarmDuration) {
if (!buttonPressedDuringAlarm) {
if ((millis() - alarmStartMillis) % 3000 < 1500) {
tone(BUZZER_PIN, 1000);
} else {
noTone(BUZZER_PIN);
}
myServo.write(20); // Mover el servo a la posición izquierda
delay(500);
myServo.write(160); // Mover el servo a la posición derecha
delay(500);
} else {
noTone(BUZZER_PIN);
myServo.write(90); // Mover el servo a su posición central
}
} else {
if (!buttonPressedDuringAlarm) {
digitalWrite(LED_PIN, HIGH);
tone(BUZZER_PIN, 1000);
myServo.write(20); // Mover el servo a la posición izquierda
delay(500);
myServo.write(160); // Mover el servo a la posición derecha
delay(500);
} else {
digitalWrite(LED_PIN, LOW); 
noTone(BUZZER_PIN); 
myServo.write(90); // Mover el servo a su posición central
}
}
lcd.clear();
lcd.setCursor(0, 0);
if (millis() - alarmStartMillis <= alarmDuration) {
  lcd.print("Tiempo transcurrido:");
  lcd.setCursor(0, 1);
  lcd.print((millis() - alarmStartMillis) / 1000);
  lcd.print(" sec");
} else {
  lcd.print("Aviso a central");
}
}
}

int readDistance() {
digitalWrite(ULTRASONIC_TRIG, LOW);
delayMicroseconds(2);
digitalWrite(ULTRASONIC_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(ULTRASONIC_TRIG, LOW);

long duration = pulseIn(ULTRASONIC_ECHO, HIGH);
int distance = duration * 0.034 / 2;

return distance;
}

int readInput() {
int num;

while (Serial.available() == 0
) { 
}
num = Serial.parseInt();
return num;
}

Proyecto finalizado

Conexiones de la placa

Proyecto realizado por Ignacio Diaz Nieto, Nerea Fernandez Saavedra y Patricia Muñiz Cano

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 *