martes, 24 de junio de 2014

NUESTRO PRIMER PROYECTO! SISTEMA DE SEGURIDAD.


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.
caja-fuerte.jpg

















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:
img-20140624-211548-1-.jpgimg-20140624-211627-1-.jpg


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. 

9 comentarios:

  1. Cualquier duda sobre el código o cualquier sugerencia siempre es bienvenida! No dudéis en comentar!

    ResponderEliminar
  2. Está 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.

    ResponderEliminar
  3. Hola,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...
    Si 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.

    ResponderEliminar
  4. el codigo me da error me arroja esto:
    sketch_nov06a.ino:26:62: fatal error: NECIRrcv.h: No such file or directory
    compilation terminated.
    Error de compilación
    ayuda porfavor

    ResponderEliminar
  5. Por favor incluir los links de descarga de las libreias utilizadas como:
    NECIRrcv.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.

    ResponderEliminar
  6. muy interesante!!!

    Gracias por la info...

    ResponderEliminar
  7. podrias subir fotos del diagrama de conexion por favor

    ResponderEliminar