Alarma Inteligente
Ángel Villafuertes, Daniel Foronda y Ignasi Henales.
Introducción
El proyecto que hemos elegido es una alarma implementada en Arduino, la cual contiene una pantalla LCD para que nos dé retroalimentación sobre cómo estamos operando con el proyecto, un teclado para manejar la interfaz, una serie de sensores los cuales detectan a cualquier intruso una vez la alarma se haya activado, cuenta también con un código para su activación y desactivación, con opción de modificación.
Hemos elegido este proyecto debido a que nos gustó la idea, y pensamos que era un proyecto muy útil y usable en la vida de cualquier persona o empresa ya que en los tiempos que corren la seguridad es muy importante.
Implementación
Para la implementación del proyecto lo primero que hicimos fue informarnos de cómo funcionaba un sistema de alarma estándar, una vez hecho esto, decidimos que periféricos introducir en el proyecto (sensor de movimiento, cámara, etc.).
Una vez estaba todo ello decidido comenzamos a implementar el hardware del proyecto en el cual se añadieron los dos elementos obligatorios necesarios (placa Arduino UNO, para cargar el código software y la protoboard), un sensor de ultrasonidos, una pantalla LCD donde se reflejarán los modos de la alarma y las contraseñas introducidas, un módulo I2C que se utiliza para simplificar el uso de la pantalla y tener el hardware mucho más modularizado y por último un teclado.
Hemos querido añadir más elementos al hardware, pero debido al limitado número de conexiones de la placa y a componentes que ocupan muchas de estas conexiones como puede ser el teclado no nos ha sido posible añadir más sensores.
En cuanto al software para la implementación, hemos empezado añadiendo las librerías de los distintos elementos, acto seguido declaramos las constantes que contendrán la información sobre donde están conectados los distintos componentes en la placa, lo siguiente fue realizar un “setup”, con esto inicializamos todos los componentes (teclado, pantalla, sensores…) y tras esto empezamos en el loop con el código que se explicará más adelante.
Costes de los Materiales
Los materiales para dicha práctica no han sido muy costosos, ya que la mayoría de ellos los teníamos debido a que se nos administraron en clase, y los que no los teníamos en casa, aunque también hemos tenido que comprar alguno debido a los problemas surgidos durante la realización (fallos, sobrecalentamientos, etc.), los materiales utilizados han sido:
Tipo Material | Coste |
Placa Arduino UNO | 20€ |
Cables | 3€ |
Sensor Ultrasonidos | 7,40€ |
Modulo I2C | 8€ |
Pantalla LCD | 10,99€ |
Teclado | 8,18€ |
Huella Dactilar | 15€ |
Zumbador | 6€ |
Sensor PIR | 1€ |
Problemas y Soluciones encontradas
Los principales problemas que enfrentamos fueron principalmente al inicio de la práctica, en esta etapa teníamos claro lo que queríamos hacer, sin embargo no sabíamos cómo implementarlo tanto en la parte del software como la del hardware, para la parte del hardware pudimos aprender rápido como resolver el problema gracias en gran parte a un canal de YouTube llamado “BitWise Ar”, para la parte del software os estuvimos documentando en varias páginas hasta encontrar la forma correcta de hacerlo y las librerías que utilizar.
Sensor Ultrasonido
Con este componente el principal problema que tuvimos fue que no llegábamos a entender el funcionamiento y por ello nos costó implementarla bien, una vez nos documentamos y entendimos el funcionamiento nos resultó fácil implementarla.
Pantalla LCD
Con dicha pantalla tuvimos problemas al inicializarla ya que se encendía, pero no salía nada en la pantalla, para solucionarlo cambiamos la inicialización del código software de la pantalla.
Esta ocupaba muchos pines de la placa y ya habíamos usado muchos con el teclado por lo que prácticamente nos quedamos sin espacio para los sensores, para resolver esto compramos un módulo I2C que conectaba la mayoría de los pines de la pantalla y sacaba únicamente 3 cables que iban a la parte analógica de la placa, por lo que el problema ya estaba arreglado.
Teclado
Con el teclado tuvimos varios problemas, el primero de ellos fue que una vez conectado y programado no conseguíamos que detectara los botones tocados y por tanto no funcionaba, una vez solucionado dicho problema mediante la modificación del código software, nos dimos cuenta de que estaban al revés ya que al tocar un botón ponía otro distinto, también conseguimos solucionarlo ya que el fallo era que en el código teníamos puestas las columnas en las filas y viceversa.
Con la huella no tuvimos ningún problema, lo único que nos pasaba es que al principio no sabíamos cómo implementar el software de dicho elemento y al final nos dimos cuenta de que teniendo que imprimir por pantalla los parámetros de la huella.
Sensor PIR
Con dicho elemento tuvimos varios problemas ya que al principio el sensor no funcionaba, y pensábamos que se había roto por lo que decidimos comprar otro, pero luego nos dimos cuenta de que lo único que pasaba es que estaba mal calibrado el sensor.
Código
#include <LCD.h>
#include <LCD.h>
#include <Adafruit_Fingerprint.h>
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h> // libreria para LCD por I2C
#include <Keypad.h>
const byte ROWS = 4;
const byte COLS = 4;
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7); // DIR, E, RW, RS, D4, D5, D6, D7
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {13, 12, 11, 10};
byte colPins[COLS] = {9, 8, 7, 6};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
String entrada;
String modo = "inicio";
String pass = "1234";
bool detectado = false;
int TRIG = 4; // trigger en pin 10
int ECO = 3; // echo en pin 9
int DURACION;
int DISTANCIA;
int PIR = A0;
int buzzer_pin = 5;
int ESTADO = 0;
int i = 0;
//HUELLA DACTILAR
SoftwareSerial mySerial(A1, A2); // Crear Serial para Sensor Rx, TX del Arduino
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial); // Crea el objeto Finger comunicacion pin 2 , 3
void setup()
{
lcd.setBacklightPin(3, POSITIVE); // puerto P3 de PCF8574 como positivo
lcd.setBacklight(HIGH); // habilita iluminacion posterior de LCD
lcd.begin(16, 2); // 16 columnas por 2 lineas para LCD 1602A
lcd.clear(); // limpia pantalla
pinMode(TRIG, OUTPUT); // trigger como salida
pinMode(ECO, INPUT); // echo como entrada
pinMode(buzzer_pin, OUTPUT); // Pin buzzer
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A0, INPUT);
Serial.begin(9600);
while (!Serial); // Yun/Leo/Micro/Zero/...
delay(100);
Serial.println("Sistema de apertura con huella dactilar");
// set the data rate for the sensor serial port
finger.begin(57600); // inicializa comunicacion con sensor a 57600 Baudios
delay(5);
Serial.println(F("Reading sensor parameters"));
finger.getParameters();
Serial.print(F("Status: 0x")); Serial.println(finger.status_reg, HEX);
Serial.print(F("Sys ID: 0x")); Serial.println(finger.system_id, HEX);
Serial.print(F("Capacity: ")); Serial.println(finger.capacity);
Serial.print(F("Security level: ")); Serial.println(finger.security_level);
Serial.print(F("Device address: ")); Serial.println(finger.device_addr, HEX);
Serial.print(F("Packet len: ")); Serial.println(finger.packet_len);
Serial.print(F("Baud rate: ")); Serial.println(finger.baud_rate);
finger.getTemplateCount();
if (finger.templateCount == 0) {
Serial.print("Sensor doesn't contain any fingerprint data. Please run the 'enroll' example.");
}
else {
Serial.println("Waiting for valid finger...");
Serial.print("Sensor contains "); Serial.print(finger.templateCount); Serial.println(" templates");
}
}
void loop()
{
char key = keypad.getKey();
//::::::::::::::::INICIO::::::::::::::::::::
if (modo == "inicio") {
i=0;
lcd.setCursor(0, 0); // ubica cursor en columna 0 y linea 0
lcd.print("Modo Inicio");
if (key) {
if (key == 'A') {
modo = "armar";
lcd.setCursor(0, 0); // ubica cursor en columna 0 y linea 0
lcd.print("Activar Alarma");
delay(1000);
lcd.clear();
key = '\0';
}
if (key == 'C') {
modo = "cambiarpass";
lcd.setCursor(0, 0); // ubica cursor en columna 0 y linea 0
lcd.print("Cambiar passwd");
delay(1000);
key = '\0';
}
}
}
//::::::::::::::::CAMBIAR PASSWORD::::::::::::::::::::
if (modo == "cambiarpass") {
lcd.clear();
lcd.setCursor(0, 0); // ubica cursor en columna 0 y linea 0
lcd.print("INTRODUZCA");
lcd.setCursor(3, 1); // ubica cursor en columna 0 y linea 0
lcd.print("HUELLA");
if (getFingerprintID() == 1) {
lcd.clear();
lcd.print("Correcta");
delay(1000);
lcd.clear();
modo = "repetirPass";
key = '\0';
entrada = "";
}
if(key=='D'){
modo = "inicio";
key = '\0';
entrada = "";
lcd.clear();
}
}
//::::::::::::::::REPETIR PASSWORD::::::::::::::::::::
if (modo == "repetirPass") {
lcd.setCursor(0, 0); // ubica cursor en columna 0 y linea 0
lcd.print("new pass:");
if (key) {
entrada += key;
lcd.setCursor(0, 1); // ubica cursor en columna 0 y linea 0
lcd.print(entrada);
if (key == 'B') {
entrada = "";
lcd.clear();
}
if(key=='D'){
modo = "inicio";
key = '\0';
entrada = "";
lcd.clear();
}
if (key == 'A') {
entrada = entrada.substring(0, entrada.length() - 1);
pass = entrada;
tone(5, 300, 500);
delay(100);
tone(5, 500, 500);
delay(2000);
key = '\0';
entrada = "";
lcd.clear();
modo = "inicio";
}
}
}
//:::::::::::::::ARMAR ALARMA::::::::::::::::::::
if (modo == "armar") {
lcd.setCursor(0, 0); // ubica cursor en columna 0 y linea 0
lcd.print("Contraseña:");
if (key) {
entrada += key;
lcd.setCursor(0, 1); // ubica cursor en columna 0 y linea 0
lcd.print(entrada);
if(key=='D'){
modo = "inicio";
key = '\0';
entrada = "";
lcd.clear();
}
if (key == 'B') {
entrada = "";
lcd.clear();
}
if (key == 'A') {
lcd.clear();
entrada = entrada.substring(0, entrada.length() - 1);
if (entrada == pass ) {
lcd.clear();
lcd.print("ACTIVANDO");
lcd.setCursor(3, 1);
lcd.print("ALARMA");
tone(5, 300, 700);
delay(1000);
tone(5, 300, 700);
delay(1000);
tone(5, 300, 1100);
delay(5000);
lcd.clear();
lcd.setCursor(0, 0); // ubica cursor en columna 0 y linea 0
lcd.print("Alarma Activada");
modo = "activa";
key = '\0';
entrada = "";
} else {
entrada = "";
tone(5, 100, 1000);
delay(1000);
}
}
}
}
//::::::::::::::::ACTIVA::::::::::::::::::::
if (modo == "activa") {
if (key == 'A') {
modo = "desarmar";
key = '\0';
}
digitalWrite(TRIG, HIGH); // generacion del pulso a enviar
delay(1); // al pin conectado al trigger
digitalWrite(TRIG, LOW); // del sensor
DURACION = pulseIn(ECO, HIGH); // con funcion pulseIn se espera un pulso
// alto en Echo
DISTANCIA = DURACION / 58.2; // distancia medida en centimetros
Serial.println(DISTANCIA); // envio de valor de distancia por monitor serial
if (DISTANCIA < 75 ) {
detectado = true;
}
ESTADO = digitalRead(PIR);
if (ESTADO == HIGH) {
detectado = true;
}
if (detectado) {
Serial.println("suena");
tone(5, 500, 1000);
}
}
//::::::::::::::::DESARMAR::::::::::::::::::::
if (modo == "desarmar") {
tone(5, 500, 500);
lcd.setCursor(0, 0);
lcd.print("Modo desarmar");
if (getFingerprintID() == 1){
detectado = false;
lcd.setCursor(0, 0); // ubica cursor en columna 0 y linea 0
lcd.print("Desactivada");
digitalWrite(4, LOW);
modo = "inicio";
key = '\0';
entrada = "";
tone(5, 100, 500);
delay(650);
tone(5, 100, 500);
lcd.clear();
}else{
if (key) {
entrada += key;
lcd.setCursor(0, 1); // ubica cursor en columna 0 y linea 0
lcd.print(entrada);
if (key == 'A') {
entrada = entrada.substring(0, entrada.length() - 1);
Serial.println(entrada);
if (entrada == pass ) {
detectado = false;
lcd.setCursor(0, 0); // ubica cursor en columna 0 y linea 0
lcd.print("Desactivada");
digitalWrite(4, LOW);
modo = "inicio";
key = '\0';
entrada = "";
tone(5, 100, 500);
delay(650);
tone(5, 100, 500);
lcd.clear();
} else {
i++;
modo = "activa";
detectado = true;
entrada = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Modo activo");
}
if(i>3){
modo= "bloqueada";
}
}
}
}
}
if (modo == "bloqueada") {
Serial.println("suena");
tone(5, 500, 1000);
lcd.setCursor(4, 0);
lcd.clear();
lcd.print("ALARMA");
lcd.setCursor(3, 1);
lcd.print("BLOQUEADA");
if(getFingerprintID() == 1){
detectado = false;
lcd.setCursor(0, 0); // ubica cursor en columna 0 y linea 0
lcd.print("Desactivada");
digitalWrite(4, LOW);
modo = "inicio";
key = '\0';
entrada = "";
tone(5, 100, 500);
delay(650);
tone(5, 100, 500);
lcd.clear();
lcd.clear();
}
}
}
uint8_t getFingerprintID() {
uint8_t p = finger.getImage();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image taken");
break;
case FINGERPRINT_NOFINGER:
Serial.println("No finger detected");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
return p;
case FINGERPRINT_IMAGEFAIL:
Serial.println("Imaging error");
return p;
default:
Serial.println("Unknown error");
return p;
}
// OK success!
p = finger.image2Tz();
switch (p) {
case FINGERPRINT_OK:
Serial.println("Image converted");
break;
case FINGERPRINT_IMAGEMESS:
Serial.println("Image too messy");
return p;
case FINGERPRINT_PACKETRECIEVEERR:
Serial.println("Communication error");
return p;
case FINGERPRINT_FEATUREFAIL:
Serial.println("Could not find fingerprint features");
return p;
case FINGERPRINT_INVALIDIMAGE:
Serial.println("Could not find fingerprint features");
return p;
default:
Serial.println("Unknown error");
return p;
}
// OK converted!
p = finger.fingerSearch();
if (p == FINGERPRINT_OK) {
Serial.println("Found a print match!");
} else if (p == FINGERPRINT_PACKETRECIEVEERR) {
Serial.println("Communication error");
return p;
} else if (p == FINGERPRINT_NOTFOUND) {
Serial.println("Did not find a match");
return p;
} else {
Serial.println("Unknown error");
return p;
}
// found a match!
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
return finger.fingerID;
}
// returns -1 if failed, otherwise returns ID #
int getFingerprintIDez() {
uint8_t p = finger.getImage();
if (p != FINGERPRINT_OK) return -1;
p = finger.image2Tz();
if (p != FINGERPRINT_OK) return -1;
p = finger.fingerFastSearch();
if (p != FINGERPRINT_OK) return -1;
// found a match!
Serial.print("Found ID #"); Serial.print(finger.fingerID);
Serial.print(" with confidence of "); Serial.println(finger.confidence);
return finger.fingerID;
}
void activacion() {
tone(5, 500, 1000);
lcd.setCursor(0, 0); // ubica cursor en columna 0 y linea 0
lcd.print("Alarma Activada");
delay(1000);
}
Conclusión
Dicho proyecto como he mencionado al principio es muy útil en la vida cotidiana de cualquier persona ya que, hoy en día en el mundo en el que vivimos con las tasas tan altas de delincuencia que hay está expuesta a un robo en un comercio, en una casa o incluso la ocupación de esta, y la solución para ello sería un sistema a gran escala como el de nuestro proyecto el cual detecta cualquier intruso y seguidamente se activa una alarma la cual alerta a los vecinos colindantes y la policía (nosotros no tenemos implementada esa función).
Una vez visto todo lo anterior podemos decir que esta práctica ha sido muy útil y constructiva para entender cómo funcionaba un sistema de alarma en una versión más reducida y aprender a usar Arduino el cual, a nuestro parecer, puede ser muy útil para la vida laboral, puesto que pensamos que es la base para la programación de cualquier maquina utilizada por el ser humano.
En nuestro caso preferimos este tipo de prácticas más complejas ya que se aprende bastante más que aprendiéndonos un powerpoint.
Además, este tipo de trabajos nos ayuda bastante a la hora de organizarnos en grupo.
También, al ser un trabajo que si queríamos más material adicional teníamos que costeárnoslo nosotros hemos aprendido a suministrar mejor los materiales que teníamos y a reciclar cosas que teníamos por casa.
Y para terminar, en nuestro caso es un trabajo el cual siempre queríamos mejorar ya que una vez tienes metidas unas funcionalidades cada vez lo quieres mejorar más y es una cosa que no nos ha pasado en otros trabajos.
Video Explicativo de todo el proyecto
Adjuntamos el video que explica todo el proyecto, tanto la parte hardware, como software, el funcionamiento y dos ejemplos breves de uso.