Este proyecto consiste en una simulación de un sistema de seguridad de una caja fuerte. El proyecto se basa en la introducción de 3 entradas para el código de seguridad, simulando con un potenciometro las ruletas de la caja fuerte.
Las 2 primeras entradas son números y la tercera una letra. Si el código es correcto se accede a la caja fuerte. Para salir de ella y dejarla cerrada, hemos de girar los potenciometros (las ruletas) de forma que ningún dígito coincida (para que nadie se encuentre la caja con el código ya puesto).
Si por el contrario el código se introduce de forma errónea, el zumbador suelta un pitido y el lcd muestra que el código es erróneo. En caso de que se introduzca 3 veces mal el código se activa el sistema de seguridad, basado en un bucle "infinito" del que no se sale hasta que un supuesto técnico introduce una clave por medio del teclado del pc o mediante un mando a distancia, devolviendo el sistema a su estado original.

Aquí podemos ver el esquema hecho con fritzing. Para este proyecto hemos empleado:
- 1 placa ARDUINO UNO.
- 1 placa protoboard.
- 3 potenciometros de 100k que simulan la ruleta de la caja fuerte.
- 1 potenciometro de 10k para regular la intensidad del brillo del LCD.
- 2 pulsadores, 1 de entrada y otro de salida de la caja fuerte.
- 2 diodos led, que indican el estado de la caja.
- 1 LCD 16:2
- 2 resistencias de 10k (pulsadores)
- 2 resistencias de 220 ohmios (diodos)
- 1 zumbador
- 1 receptor infrarrojo, para captar la señal del mando
A continuación se muestran imágenes reales del proyecto:


Y aquí un vídeo demostración del proyecto:
Código:
//--------Libreria LCD---------
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2); //En el parentesis ponemos los pines en los que está conectado el LCD
//--------Variables----------
int zumbador = 9; //Zumbador entrada 9
int pulsador_Conf = 7; //Pulsador de confirmación entrada 7
int pulsador_Al = 6; //Pulsador de alarma entrada 6
int led_verde = 13; //Led verde pin 13
int led_rojo = 8; //Led rojo pin 8
int valor1 = 0;
int valor2 = 0;
int valor3 = 0;
String letra;
int valor1_correcto = 2;
int valor2_correcto = 1;
char letra_correcta = 'J';
boolean acceso;
int sistema_seguridad =0;
//--------------------------------------Variables Subprograma--------------------------------------------------------------------------------
char cadena[10]; //Creamos un array que almacenará los caracteres que escribiremos en el teclado del PC. Le asignamos un tope de caracteres, en este caso 10
byte posicion=0; //Variable para cambiar la posición de los caracteres del array
int valor; //Variable del valor entero
//--------------MANDO IR-----------------
#include <Arduino.h> //NECESARIA DECLARACION*
#include <NECIRrcv.h> //Llamamos a librería del protocolo NEC
#define IRPIN 17 // Pin del sensor ir
NECIRrcv ir(IRPIN) ; //Creamos un objeto de la libreria NEC llamado ir para poder usarla
void setup(){
Serial.begin(9600); //Establecer la comunicación serie
pinMode(7,INPUT); //Pulsador
pinMode(6,INPUT); //Pulsador
pinMode(13,OUTPUT); //Led verde salida 13
pinMode(8,OUTPUT); //Led rojo salida 8
lcd.begin(16,2);
ir.begin(); //Iniciamos la recepcion ir
}
void loop(){
//--------Asignación caracteres al potenciomentro----------
int valor1 = analogRead(A0);
valor1 = map(valor1, 0, 1023, 9, 0);
int valor2 = analogRead(A1);
valor2 = map(valor2, 0, 1023, 9, 0);
int valor3 = analogRead(A2);
valor3 = map(valor3, 0, 1023, 25, 0);
//------------CODIGO IMPORTANTE: ASIGNAR LETRA AL VALOR3----------------------------------
char letras[26] = {'T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L' , 'C', 'K', 'E','O','U','I'};
char letra = letras[valor3];
digitalWrite(led_rojo,HIGH) ; //Led rojo encendido (Caja cerrada) //NOTA: Futura actualización de contraseña
lcd.setCursor(0,0);
lcd.print("Codigo: "); //Pedimos la inserción del código
lcd.setCursor(0,1);
lcd.print(valor1); //Mostramos el valor que tiene valor1
lcd.setCursor(2,1);
lcd.print(valor2); //Mostramos el valor que tiene valor2
lcd.setCursor(4,1);
lcd.print(letra); //Mostramos el valor que tiene letra
if(digitalRead(pulsador_Conf)==HIGH ){ //Si se pulsa el botón de confirmación:
if(valor1==valor1_correcto && valor2 == valor2_correcto && letra == letra_correcta){ //Comprueba que los valores son correctos
acceso=true; //En caso afirmativo permitimos el acceso
while(acceso== true ){ //Mientras el acceso esté permitido
lcd.setCursor(0,0);
lcd.print(" CLAVE CORRECTA "); //Mostramos al usuario que la clave es correcta
lcd.setCursor(0,1);
lcd.print("CAJA ABIERTA!"); //Mostramos al usuario que la caja está abierta
digitalWrite(led_verde,HIGH);
//---------------------Volvemos a asigar los valores analogicos a las variables Valor1, Valor2 y letra, que les habian perdido al entrar en el while-----------------------------
int valor1 = analogRead(A0);
valor1 = map(valor1, 0, 1023, 9, 0);
int valor2 = analogRead(A1);
valor2 = map(valor2, 0, 1023, 9, 0);
int valor3 = analogRead(A2);
valor3 = map(valor3, 0, 1023, 25, 0);
//------------CODIGO IMPORTANTE: ASIGNAR LETRA AL VALOR3----------------------------------
char letras[26] = {'T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L' , 'C', 'K', 'E','O','U','I'};
char letra = letras[valor3];
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//-----PARA SALIR EL USUARIO DEBE CAMBIAR TODOS LOS VALORES DE LA CONTRASEÑA Y PULSAR EL BOTÓN DE SALIR------------------------------------------------
if (valor1!=valor1_correcto && valor2 != valor2_correcto && letra != letra_correcta && digitalRead(pulsador_Al)==HIGH) { //En caso afirmativo:
acceso= false; //El acceso pasa a ser denegado
lcd.clear(); //Limpiamos la pantalla
delay(1000); //espera un segundo
lcd.setCursor(0,0);
lcd.print("CERRANDO..."); //Se muestra al usuario que su caja fuerte se está cerrando
delay(2000); //Esperamos 2 segundos
lcd.clear(); //Se limpia la pantalla
//----------------CAJA FUERTE CERRADA------------------------------------------------
}
}
}
else{ //Si la clave introducida es incorrecta, se activa el sistema de alarma
lcd.clear();
lcd.print("CODIGO ERRONEO"); //Escribe en la consola "codigo erroneo"
analogWrite(zumbador,25); //emite sonido 25 tipo de sonido
delay(500); //espera medio segundo
digitalWrite(zumbador, LOW); //deja de emitir
delay(500);//espera medio segundo
lcd.clear();
sistema_seguridad++; //Variable que contiene el sistema de seguridad
//----------------SI SE INGREA LA CLAVE MAL 3 VECES SE ACTIVA EL SISTEMA DE SEGURIDAD-------------------
while (sistema_seguridad == 3) { //MIETRAS EL SISTEMA DE SEGURIDAD ESTÉ ACTIVADO:
lcd.clear(); //Se elimina todo lo que hay en la pantalla.
analogWrite(zumbador,25); //emite sonido
delay(500); //espera medio segundo
digitalWrite(zumbador, LOW); //deja de emitir
delay(500);//espera medio segundo
lcd.clear();
//--------------INICIO SUBPROGRAMA SEGURIDAD (SIMULACIÓN TECNICO)---------------------------//
//-------------MANDO IR------------------------
unsigned long ircode ; //Almacenaremos la orden del mando en una variable llamada ircode
while (ir.available()) { //mientras la conexion de ir esta disponible
ircode = ir.read() ; //leemos el codigo y le guardamos en ircode
if ((ircode == 0xBA45FF00) ){ // si es ese codigo encendemos led
Serial.println("Codigo correcto");
sistema_seguridad = 0;
//VAriable para volver al principio del programa de la caja fuerte
}
else{
Serial.println("Codigo erroneo");
}
}
//-----------------------------------------------------FIN CODIGO MANDO--------------------------------------------------------------------------
//-------------TECLADO PC----------------
if(Serial.available()) //Nos dice si hay datos dentro del buffer
{
memset(cadena, 0,sizeof(cadena));//memset borra el contenido del array "cadena" desde la posición 0 hasta el final sizeof
while(Serial.available()>0) //Mientras haya datos en el buffer ejecuta la función
{
delay(5); //Poner un pequeño delay para mejorar la recepción de datos
cadena[posicion]=Serial.read();//Lee un carácter del string
posicion++; //Mueve la posicion del guardado en 1
}
valor=atoi(cadena);//Convertimos la cadena de caracteres en enteros
Serial.println(valor);//Imprimimos el valor
posicion = 0;//Ponemos la posicion a 0 para que vuelva a leer desde la posicion 0
if(valor == 1234){
Serial.println("Codigo correcto");
sistema_seguridad = 0;
//VAriable para volver al principio del programa de la caja fuerte
}
else{
Serial.println("Codigo erroneo");
}
}
//-------------------------------------------------------------FIN CODIGO TECLADO-------------------------------------------------------------------------------------
}
}
}
}
Este proyecto ha sido realizado por Eduardo Sevilla y Rafael Muñoz. Esperamos subir pronto una ampliación completa del sistema, con un menú autónomo, y otro proyecto más avanzado para Hackear los códigos desde otro ARDUINO.
Cualquier duda sobre el código o cualquier sugerencia siempre es bienvenida! No dudéis en comentar!
ResponderEliminarBuenas ardes me sale error en el codigo
EliminarEstá muy bien! Pero os aconsejo que cuando insertéis código en una página utilicéis algo como Gist, ya que es mucho más fácil de leer.
ResponderEliminarHola,mucho gusto, somos del Instituto Leonardo Murialdo y quisiéramos saber mas sobre el funcionamiento y armado del proyecto,como es el tema del reseteo cuando se ingresa mal la clave 3 veces, que tipo de infrarrojo uso y el código,es genérico o es para un control en especial...
ResponderEliminarSi hubiera alguna manera de poder contactarnos,desde ya se lo agradeceríamos ya que es para Electrónica Digital de la modalidad de Electrónica,le mando saludos cordialmente,los alumnos del ILM.
El código me da error ayúdame por favor :(
ResponderEliminarel codigo me da error me arroja esto:
ResponderEliminarsketch_nov06a.ino:26:62: fatal error: NECIRrcv.h: No such file or directory
compilation terminated.
Error de compilación
ayuda porfavor
Por favor incluir los links de descarga de las libreias utilizadas como:
ResponderEliminarNECIRrcv.h
LiquidCrystal.h
______________________________________________________________________
al compilar el código aparece este error, parece que estas librerías no existen
error:
Arduino:1.6.8 (Windows 10), Tarjeta:"Arduino/Genuino Uno"
C:\Users\Asus-Pc\Documents\Arduino\Prueba-proyecto\Prueba-proyecto.ino:25:63: fatal error: NECIRrcv.h: No such file or directory
#include //Llamamos a librerÃa del protocolo NEC
^
compilation terminated.
Se encontraron múltiples librerías para "LiquidCrystal.h"
Usado: C:\Users\Asus-Pc\Documents\Arduino\libraries\LiquidCrystal
No usado: C:\Users\Asus-Pc\Downloads\Arduino\libraries\LiquidCrystal
exit status 1
Error compilación en tarjeta Arduino/Genuino Uno.
Este reporte podría tener más información con
"Mostrar salida detallada durante la compilación"
opción habilitada en Archivo -> Preferencias.
muy interesante!!!
ResponderEliminarGracias por la info...
podrias subir fotos del diagrama de conexion por favor
ResponderEliminar