PROYECTO: CÓDIGO SE SEGURIDAD



PROYECTO: CÓDIGO DE SEGURIDAD 

Este proyecto es algo inusual debido a que usamos ARDUINO para algo importante como la seguridad en este caso; aunque en esta entrada solo se enseñara como montar el circuito, tal vez, próximamente usaremos este circuito para una "CAJA DE SEGURIDAD"...

CIRCUITO:

El circuito consta de  los siguientes materiales:


  • ARDUINO UNO 
  • CABLES DE CONEXIÓN
  • LEDS (SE RECOMIENDA QUE SEAN DE COLORES DIFERENTES) 
  • 6 RESISTENCIAS DE 1K OHM 
  • UN DIP SWITCH DE 8 BOTONES 
  • UN BOTÓN (APARTE DEL DIP SWITCH )
  • 5 RESISTENCIAS DE 220 OHMS
         DIAGRAMA:

básicamente constara de  una serie de interruptores que serán para "escribir la contraseña" y el arduino leerá el resultado y lo comparara con el valor real de la contraseña, y si esta bien escrita se encenderá el led de color verde que esta en el pin13; pero si es correcta pasa lo sig:

tiene el usuario 3 oportunidades, si falla las 3 se encenderá el led rojo que esta en el pin12

la idea del proyecto es crear un código que pueda ser usado para proteger algo: ya sea un objeto pequeño o en caso de invertir algo de dinero una caja de seguridad, este es solo el código fuente.

PROGRAMACIÓN:

primero se debe tomar en cuenta la contraseña:

como el código no va a ser muy complejo, la contraseña tampoco lo debe de ser; así que es este caso usaremos una contraseña numérica, pero  la contraseña  debe ser un numero que sea desde el 0 hasta el 63 (como vemos no es muy compleja, pero no debemos subestimarla), así que para poder plasmar esa contraseña usando interruptores usaremos el CÓDIGO BINARIO. con el código binario se puede usar los interruptores y la lógica positiva (HIGH (1) Y LOW(0)) para representar el numero que equivale la contraseña y a la vez (si no saben que es el código binario) hacer mas difícil que personas desconocidas acierten la contraseña.

debemos recordar el código binario:

básicamente se basa de:


por lo tanto entre mas interruptores tengamos, mas grande puede ser la contraseña.

pasemos ahora si al código:

creamos las variables que vamos a usar:

int cont = 0;
int E1 = 0;        const int boton1 = 6;       const int led1 = 2;
int E2 = 0;        const int boton2 = 7;       const int led2 = 3;
int E3 = 0;        const int boton3 = 8;       const int led3 = 4;
int E4 = 0;        const int boton4 = 9;       const int aprovado = 13;
int E5 = 0;        const int boton5 = 10;      const int denegado = 12;
int E6 = 0;        const int boton6 = 11;
int D1 = 0;        const int definitivo = 5;

int P0 = 0;
int P1 = 0;
int P2 = 0;
int P3 = 0;
int P4 = 0;
int P5 = 0;
int T = 0;
int codigo = 22;

son muchas variables pero cada una cumple una función primordial en el código:


  • cont = se usara para contar las oportunidades que tiene el usuario para acertar el código


  • E1 - E6 = se usaran para almacenar el estado de los interruptores


  • boton1 - boton6 = se nombra así a lo pines donde estarán los interruptores


  • P0 - P5 = se usara como el numero que corresponde al código binario (ya verán porque)


  • definitivo = es el nombre del boton que se usara para enviar el  valor de la contraseña al arduino para compararla
  • led1 - led3 = son los leds que representan las oportunidades que tiene el usuario
  • aprobado = representa al led que se enciende  cuando se "escribe correcta la contraseña" 
  •  denegado = representa al led que se enciende cuando el usuario falla X cantidad de intentos 
  • T = se usara para almacenar el resultado de la sig. suma: P0 + P1 + P2 + P3 + P4 + P5
  • código = es el numero que corresponde a la contraseña correcta que se compara con los resultados 

ahora pasamos al VOID SETUP:



void setup() {
  
Serial.begin(9600);
pinMode(boton1, INPUT);
pinMode(boton2, INPUT);
pinMode(boton3, INPUT);
pinMode(boton4, INPUT);
pinMode(boton5, INPUT);
pinMode(boton6, INPUT);
pinMode(definitivo, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(aprovado, OUTPUT);
pinMode(denegado, OUTPUT);
pinMode(definitivo, INPUT);
}

en resumen declaramos los pines para su funcionamiento;

pasemos al void loop:

primero debemos recordar que la contraseña se "escribirá"  con los interruptores y se presionara el botón para enviar esa respuesta al arduino, pero si no esta pulsado el botón, arduino no leerá el estado de los interruptores, por lo tanto pasa lo siguiente:

void loop(){

D1 = digitalRead(definitivo);

if(D1 == HIGH){

}
}

con esto claro podemos continuar: una vez que se presione el botón el arduino leerá los pines que corresponden a los interruptores 

void loop(){

D1 = digitalRead(definitivo);

if(D1 == HIGH){
  E1 = digitalRead(boton1);
  E2 = digitalRead(boton2);
  E3 = digitalRead(boton3);
  E4 = digitalRead(boton4);
  E5 = digitalRead(boton5);
  E6 = digitalRead(boton6);
 }
}

continuemos:  recordemos que queremos representar el sistema binario asi que debemos acomodar los interruptores para que queden igual como seria el codigo binario:

como vemos cada interruptor correspondería a una potencia del codigo binario, por lo tanto cada uno representa un valor diferente, esto se muestra a continuación:


interruptor E1 (activado)  = 1
interruptor E2 (activado)  = 2
interruptor E3 (activado)  = 4
interruptor E4 (activado)  = 8
interruptor E5 (activado)  = 16
interruptor E6 (activado)  = 32






por lo tanto se requiere de una variable que almacene el valor del código binario los cuales serán:
  • P0  1 / 0
  • P1  2 / 0
  • P2  4 / 0
  • P3  8 / 0
  • P4  16 / 0
  • P5  32 / 0
como son 2 posibles resultados con cada interruptor se requiere se un IF y ELSE para estos 2 resultados, quedando de la siguiente forma:

if(E1 == HIGH){
    P0 = 1;
  }
  else{
    P0 = 0;
  }

esto seria para la potencia 0 pero faltan las otras 5 potencias así que seria de la siguiente forma:

 if(E1 == HIGH){
    P0 = 1;
  }
  else{
    P0 = 0;
  }
  if(E2 == HIGH){
    P1 = 2;
  }
  else{
    P1 = 0;
  }
  if(E3 == HIGH){
    P2 = 4;
  }
  else{
    P2 = 0;
  }
  if(E4 == HIGH){
    P3 = 8;
  }
  else{
    P3 = 0;
  }
  if(E5 == HIGH){
    P4 = 16;
  }
  else{
    P4 = 0;
  }
  if(E6 == HIGH){
    P5 = 32;
  }
  else{
    P5 = 0;
  }

ahora, ya que tenemos la lectura del codigo binario debemos hacer una suma de estos para decodificar la contraseña y asi poder compararla :

T = P0 + P1 + P2 + P3 + P4 + P5;

así arduino decodifica la contraseña  ahora solo falta compararla 

if(T == codigo){
  digitalWrite(aprovado, HIGH);
  digitalWrite(denegado, LOW);
 }

ya casi esta listo, pero hay un problema ¿que pasa si el numero que decodifica el arduino no es igual a la contraseña? 

bueno, se requiere de un ELSE:

  if(T == codigo){
  digitalWrite(aprovado, HIGH);
  digitalWrite(denegado, LOW);
  Serial.println("aprovado");
 }
 else{
  cont = cont + 1;
  digitalWrite(aprovado, LOW);
  digitalWrite(denegado, LOW);
  if(cont > 3){
    cont = 0;
    digitalWrite(4, LOW);
    digitalWrite(denegado, HIGH);
    digitalWrite(aprovado, LOW);
  }
 }

aqui es donde entra en juego la variable cont, entonces para resumir:

cuando la contraseña no es correcta se le suma 1 a  cont  y apaga los leds aprovado y denegado 
tambien se le agrega un IF para ver si el numero de errores es mayor a 3 y si esto ocurre se enciende el led denegado. hasta el código completo es el siguiente:


void loop() {
 
 D1 = digitalRead(definitivo);
 if(D1 == HIGH) {
  E1 = digitalRead(boton1);
  E2 = digitalRead(boton2);
  E3 = digitalRead(boton3);
  E4 = digitalRead(boton4);
  E5 = digitalRead(boton5);
  E6 = digitalRead(boton6);
  if(E1 == HIGH){
    P0 = 1;
  }
  else{
    P0 = 0;
  }
  if(E2 == HIGH){
    P1 = 2;
  }
  else{
    P1 = 0;
  }
  if(E3 == HIGH){
    P2 = 4;
  }
  else{
    P2 = 0;
  }
  if(E4 == HIGH){
    P3 = 8;
  }
  else{
    P3 = 0;
  }
  if(E5 == HIGH){
    P4 = 16;
  }
  else{
    P4 = 0;
  }
  if(E6 == HIGH){
    P5 = 32;
  }
  else{
    P5 = 0;
  }
  T = P0 + P1 + P2 + P3 + P4 + P5;
  delay(100);
  Serial.println(T);
  if(T == codigo){
  digitalWrite(aprovado, HIGH);
  digitalWrite(denegado, LOW);
  Serial.println("aprovado");
 }
 else{
  cont = cont + 1;
  digitalWrite(aprovado, LOW);
  digitalWrite(denegado, LOW);
  if(cont > 3){
    cont = 0;
    digitalWrite(4, LOW);
    digitalWrite(denegado, HIGH);
    digitalWrite(aprovado, LOW);
    Serial.println("denegado");
  }
 }
 }
 
obviamente casi todo el codigo esta dentro del IF inicial, porque si esta fuera del IF el arduino ejecutara muchos errores y el resultado es el menos deseado.
  
pero ¿para que se usa la variable cont? 
falcil pero para ello se requiere de una función que no hemos usado llamada  SWITCH, para ser breves se usa para usar el valor de una variable y en base a ese numero elegir entre varias opciones. pero hablaremos de ella en otra entrada.

switch(cont){
  case 1:
  digitalWrite(led1, HIGH);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  break;
  case 2:
  digitalWrite(led1, LOW);
  digitalWrite(led2, HIGH);
  digitalWrite(led3, LOW);
  break;
  case 3:
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, HIGH);
  break;
  case 4:
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  break;
 }

entonces la funcion SWITCH checa el valor de cont y si el valor es 1, entonces se ejecuta lo que esta en el CASE 1 y asi funciona dependiendo del valor de cont. esto se usa para desplegar a los leds en un orden.

**codigo completo**

int cont = 0;
int E1 = 0;        const int boton1 = 6;       const int led1 = 2;
int E2 = 0;        const int boton2 = 7;       const int led2 = 3;
int E3 = 0;        const int boton3 = 8;       const int led3 = 4;
int E4 = 0;        const int boton4 = 9;       const int aprovado = 13;
int E5 = 0;        const int boton5 = 10;      const int denegado = 12;
int E6 = 0;        const int boton6 = 11; 
int D1 = 0;        const int definitivo = 5;

int P0 = 0;
int P1 = 0;
int P2 = 0;
int P3 = 0;
int P4 = 0;
int P5 = 0;
int T = 0;
int codigo = 22;

 
void setup() {
  
Serial.begin(9600);
pinMode(boton1, INPUT);
pinMode(boton2, INPUT);
pinMode(boton3, INPUT);
pinMode(boton4, INPUT);
pinMode(boton5, INPUT);
pinMode(boton6, INPUT);
pinMode(definitivo, INPUT);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(aprovado, OUTPUT);
pinMode(denegado, OUTPUT);
pinMode(definitivo, INPUT);
}

void loop() {
 
 D1 = digitalRead(definitivo);
 if(D1 == HIGH){
  E1 = digitalRead(boton1);
  E2 = digitalRead(boton2);
  E3 = digitalRead(boton3);
  E4 = digitalRead(boton4);
  E5 = digitalRead(boton5);
  E6 = digitalRead(boton6);
  if(E1 == HIGH){
    P0 = 1;
  }
  else{
    P0 = 0;
  }
  if(E2 == HIGH){
    P1 = 2;
  }
  else{
    P1 = 0;
  }
  if(E3 == HIGH){
    P2 = 4;
  }
  else{
    P2 = 0;
  }
  if(E4 == HIGH){
    P3 = 8;
  }
  else{
    P3 = 0;
  }
  if(E5 == HIGH){
    P4 = 16;
  }
  else{
    P4 = 0;
  }
  if(E6 == HIGH){
    P5 = 32;
  }
  else{
    P5 = 0;
  }
  T = P0 + P1 + P2 + P3 + P4 + P5;
  delay(100);
  Serial.println(T);
  if(T == codigo){
  digitalWrite(aprovado, HIGH);
  digitalWrite(denegado, LOW);
  Serial.println("aprovado");
 }
 else{
  cont = cont + 1;
  digitalWrite(aprovado, LOW);
  digitalWrite(denegado, LOW);
  if(cont > 3){
    cont = 0;
    digitalWrite(4, LOW);
    digitalWrite(denegado, HIGH);
    digitalWrite(aprovado, LOW);
    Serial.println("denegado");
  }
 }
 }
 
 switch(cont){
  case 1:
  digitalWrite(led1, HIGH);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  break;
  case 2:
  digitalWrite(led1, LOW);
  digitalWrite(led2, HIGH);
  digitalWrite(led3, LOW);
  break;
  case 3:
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, HIGH);
  break;
  case 4:
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  break;
 }
 delay(200);
}

el delay se usa para tener una mayor precisión con el botón, pero depende de cuanto tiempo presiones el boton 

Comentarios