Caja fuerte con alerta antirrobo
Introducción
Es una caja fuerte con una alerta antirrobo. Consiste en una caja que se abre y se cierra usando un motor como cierre. Se controla a través de un teclado, con el cual podemos cambiar la contraseña y tiene límite de intentos. Además, tiene una alarma de sonido y luz en caso de robo.
Nuestro objetivo principal con el proyecto era que fuera barato. Por eso, una vez comprados el teclado y el servomotor, que eran esenciales, decidimos no comprar nada más y tirar de ingenio para poder hacer el resto de cosas.
Reparto de tareas
- Compra de materiales: Daniel.
- Grabación y edición de vídeo: Enrique.
- Hardware: Ambos, con mayor participación de Enrique.
- Código: Ambos, con mayor participación de Daniel.
Pasos dados
- Compra de materiales.
- Conectar el teclado y reconocer las teclas.
- Conectar el motor y hacer que se mueva.
- Código para reconocimiento y cambio de contraseña, y apertura puerta.
- Añadir leds para dar feedback.
- Alarma antirrobo.
- Testear.
- Colocar todo el circuito dentro de la caja.
- Testear de nuevo.
Componentes y costes
Solo se incluye el precio de los componentes comprados.
- 1 Placa Arduino Uno
- 1 Teclado 4×4 – 5,77€
- 1 Servomotor – 7,10€
- 2 Leds
- 4 Resistencias
- 1 Fotorresistencia
- 1 Piezoeléctrico
- 1 Breadboard
- 1 Mini breadboard
Total: 12,87€
Casos de uso
En el vídeo se pueden ver en funcionamiento.
- Abrir la caja escribiendo la contraseña correcta.
- Borrar la contraseña en caso de equivocarse al escribir.
- Introducir la contraseña incorrecta 3 veces -> Bloqueo de la caja
- Cambiar la contraseña (cuando está abierta).
- Cerrar la caja.
- Forzar la caja (robo) -> Salta la alarma
- Si se pulsa una tecla en un momento que no se ha indicado, por ejemplo, pulsar la ‘A’ con la caja abierta y sin cambiar la contraseña, no hace nada.
Circuito
Código
#include <Keypad.h>
#include <Servo.h>
Servo servo;
int redLed = 12;
int greenLed = 11;
int piezoelectrico = 13;
int LDR = 0; // Pin analógico 0
int val = 0;
const byte row = 4;
const byte column= 4;
char keys[row][column] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'},
};
byte rowPin[row] = {9,8,7,6};
byte columnPin[column] = {5,4,3,2};
Keypad keypad = Keypad(makeKeymap(keys),rowPin, columnPin, row, column);
char key; //Tecla pulsada
char password[7]; //Contraseña introducida
char masterPassword[7] = "333333"; //Contraseña buena
int i = 0;
int closed = 1; //Empieza cerrada
int attempts = 0; //Máximo de 3 intentos fallidos
int start = 1; //Para controlar que al runear el código esté en la posición correcta
void setup(){
servo.attach(10);
pinMode(greenLed,OUTPUT);
pinMode(redLed,OUTPUT);
pinMode(piezoelectrico,OUTPUT);
Serial.begin(9600);
}
void loop(){
//val = analogRead(LDR); // Se lee el sensor (entre 0 y 1023)
if(start){//Poner el servo en posición correcta
start = 0;
servo.write(0);//Cierra la caja físicamente
}
val = analogRead(LDR);
if(val >=50 && closed){
Serial.println(val);
Serial.println("Umbral de luz superado con la caja cerrada");
alert(); //Empieza a sonar
}
if(attempts >=3){
Serial.println("Ha fallado 3 veces seguidas, caja bloqueada durante 30 segundos");
delay(30000); //Cambiar a menos tiempo para las comprobaciones
attempts = 0; //Reseteamos los intentos
}
//Lectura del teclado
key = keypad.getKey();
if(key){
if((key >='0' && key <='9') || (key>='A' && key<='D')){
if(closed){ //Si pulsa 0-9, A-D con la caja abierta, no hace nada.
password[i] = key; //Guardamos la contraseña que se está introduciendo
i++; //pasamos a la siguiente posición del string
Serial.print(key);
}
}
else if(key == '#'){
if(!closed){ //Si la caja está abierta, la cierra
lock();
}
else{ //Si la caja está cerrada, borra la contraseña
i = 0;
Serial.println("Introduce de nuevo la contraseña");
}
}
else if(key =='*' && !closed){ //Sólo se puede cambiar con la caja abierta
changePassword();
}
}
if(i == 6 && closed){ //Cuando se haya introducido la longitud de la contraseña, se comprueba si es correcta o no
//Si la caja está abierta, evitamos que el bucle entre a esta parte
if(!strcmp(password,masterPassword)){
Serial.println(" Clave correcta");
digitalWrite(greenLed,HIGH);
servo.write(90);//Abrimos la caja físicamente
closed = 0;
attempts =0; //Reseteamos los intentos
Serial.println("Recuerda cerrar la caja fuerte :)");
}else{ //Contraseña incorrecta, se enciende la luz roja, se muestra mensaje de error y se vuelve a poder introducir la contraseña
Serial.println(" Incorrecta");
digitalWrite(redLed,HIGH);
delay(1000);
i = 0;
attempts++; //Sumamos un intento fallido
if(attempts == 2)
Serial.println("Cuidado, solo le queda un intento");
}
digitalWrite(redLed,LOW);
}
}
void lock(){
digitalWrite(greenLed,LOW);
servo.write(0); //Cierra la caja físicamente
closed = 1; //Cierra la caja en la variable
i = 0; //Para poder introducir una contraseña nueva
Serial.println("Caja cerrada");
}
void changePassword(){
Serial.println("Introduzca la nueva contraseña (sin '#' o '*').");
int j = 0;
while(j<6){
key = keypad.getKey();
if(key){
if(key == '*' || key == '#'){ //Si introduce * o # se tendrán en cuenta como 0, para evitar errores.
Serial.println("Carácter no válido");
}else{
masterPassword[j] = key;
Serial.print("-");
j++;
}
}
}
Serial.println();
Serial.print("La nueva contraseña es: ");
Serial.println(masterPassword);
Serial.println("Recuerda cerrar la caja fuerte :)");
}
void alert(){ //Alerta de seguridad con sonido y luz roja que parpadea
int k;
for(k=0;k<=6;k++){
Serial.println("Alerta");
digitalWrite(redLed,HIGH);
tone(piezoelectrico,30);
delay(500);
noTone(piezoelectrico);
digitalWrite(redLed,LOW);
delay(100);
}
noTone(piezoelectrico);
//Como alarma debería de seguir más tiempo pero
//lo paramos porque el sonido es muy enervante(Señal de que funciona como alarma jajaja)
}
Problemas y soluciones
Un problema fue la disposición de todo el cableado. Al principio, nos centramos principalmente en que cada pieza hiciera lo que tenía que hacer, pero al intentar encajar todo dentro de la caja, nos dimos cuenta de que había que organizar mejor todo para que el motor y el teclado llegaran a estar bien posicionados dentro de la caja. Porque no habíamos tenido en cuenta que tanto el motor como el teclado se movían(al abrir la caja). La solución fue, reorganizar los cables para que todo pudiera estar en su sitio.
Después de solucionar eso también vimos que no podíamos ver los leds desde fuera de la caja. Porque después de montar el circuito, nos dimos cuenta de que al no tener cables macho-hembra, si queríamos que los leds se vieran por fuera de la caja, íbamos a tener que quitarlos de la placa de pruebas, porque no llegaban al borde de la caja.
Para eso, usamos el mini breadboard, donde únicamente están los leds, y eso nos permite colocarlo en la posición que necesitamos para que estén junto al borde de la caja y se vean los leds.
Posibles mejoras
Una posible mejora sería usar sensores de movimiento para detectar que la caja está abierta cuando no debería(para detectar robos). Como dijimos al principio, hemos preferido comprar el mínimo de piezas y tener que ingeniárnoslas para detectar que la caja está abierta de otra forma(detectando la luz que entra).
Otra mejora sería usar cables macho-hembra para colocar los leds en posición, en lugar de hacerlo con el mini breadboard.