Control de Acceso con RFID-RC522 y KEYPAD MATRIX 4X3

Hola.
Hecho así al vuelo (probablemente tenga algún fallo, pero lo importante es que entiendas el código):

char *clave="1234";
char *introducida="xxxx"; // Para guardar espacio en memoria para la clave que introducimos
int indiceTeclado=0;
void loop() {
      tecla=teclado.getKey();
      if (tecla != NO_KEY)//si se presionó una tecla
      {
            if (tecla == '#')//si tecleamos el caracter "#" del KeyPad comprobaremos si abrir la puerta, y reiniciaremos clave introducida
            {
                  if (indiceTeclado==4) // Si no hemos introducido cuatro caracteres, ni comprobamos
                  {
                        bool coincide=true;
                        for (int i=0;i<4;i++){
                              if (clave[i]!=introducida[i])
                              {
                                    coincide=false;
                                    break; //si uno de los caracteres no coincide, salimos del bucle
                              }     
                        }
                        if (coincide)
                        {
                              //Activa el Relé durante X segundos
                              digitalWrite(7, LOW);
                              delay(500);
                              digitalWrite(7, HIGH);
                        }
                  }
                  Serial.println();
                  indiceTeclado=0; // Siempre que se pulse # "borramos" la clave
            }
            else      // Si la tecla no es #
            {
                  if (indiceTeclado < 4) // Cuando existan ya cuatro caracteres "pasamos de recibir más"
                  {
                        introducida[indiceTeclado]=tecla; 
                        indiceTeclado++;
                        Serial.print(tecla);
                  }
            }
      }
}

Muchísimas gracias Noter,

Voy a trabajar el código que me has dado a ver si lo consigo.

Un saludo!!!!

Es muy buena idea el teclado rdif. Usas tarjeta y luego el teclado???, o el teclado seria para acceso sin tarjeta?

Me podrias explicar como has conectado el arduino al motor de la cerradura ???

Gracias compañero.

Hola Johnie.

El teclado seria para poder acceser sin tarjeta, sólo tecleando un código determinado (ahora estoy trabajando esa parte).

La conexión a la cerradura es a través de un relé. Ahora mismo, mientras preparo el código, lo tengo conectado a una bombilla para ir comprobando el funcionamiento. Esta tarde sacó unos minutos y hago una foto para que lo veas.

¡Un saludo!

Este es el montaje:

Cuando todo esté 100% operativo, el relé activará la cerradura eléctrica en lugar de la bombilla.

Un saludo!

Bueno pues gracias a la ayuda de Noter ya está el código 100% operativo!!!

Aquí lo dejo por si a alguien le resulta de utilidad:

// ARDUINO UNO + RFID-RC522 + KEYPAD MATRIX 4X3
//Sketch que, por medio de un relé, activa la apertura de una cerradura eléctrica
//Funciona indistintamente por RFID mediante una tarjeta (o llave tipo moneda) 
//Y tambien introduciendo una secuencia de caracteres determinada en el teclado
// en este ejemplo la clave será "1234" y el caracter # al final.
//La ultima parte del código referente a la apertura con el KeyPad corresponde
//al usuario "Noter" del Foro Arduino.cc. ¡¡Gracias!!


//INICIO CONFIGURACION TECLADO
#include <Keypad.h>
const byte filas=4;
const byte columnas=3;
byte pinsfilas[filas]={8,6,5,4}; //en orden F1,F2,F3,F4
byte pinscolumnas[columnas]={3,2,14};//en orden C1,C2,C3
char teclas[filas][columnas]=
  {
    {'1','2','3'},
    {'4','5','6'},
    {'7','8','9'},
    {'*','0','#'},
  };
Keypad teclado = Keypad(makeKeymap(teclas),pinsfilas,pinscolumnas,filas,columnas);
//FIN CONFIGURACION TECLADO


#include <SPI.h>
#include <RFID.h>
RFID rfid(10,9); // Pines de conexión del RFID
char tecla; // Variable para almacenar la tecla pulsada en el KeyPad
//____________________________________
char *clave="1234"; // *****1234 ES LA CLAVE DE 4 DÍGITOS PARA QUE ABRA CON EL TECLADO. MODIFICAR*********
char *introducida="xxxx"; // Para guardar espacio en memoria para la clave que introducimos
int indiceTeclado=0;
//____________________________________

void setup()
{ 
  Serial.begin(9600);
  SPI.begin(); 
  rfid.init();
  pinMode(7,OUTPUT);//Pin que activa el relé de apertura de la puerta
  digitalWrite(7,HIGH);
  
}

void loop()
{
    //INICIO CODIGO APERTURA POR RFID
    int codigo = 0;
    int x=1000; // tiempo de apertura de puerta
    if (rfid.isCard()) {
      
          Serial.println("IS CARD");
          
          // El siguiente IF muestra en la Pantalla Serial el nº de serie de la tarjeta "escaneada"
          if (rfid.readCardSerial()) {
            
                        Serial.println(" ");
                        Serial.println("El numero de serie de la tarjeta es  : ");
			Serial.print(rfid.serNum[0],DEC);
                        Serial.print(" , ");
			Serial.print(rfid.serNum[1],DEC);
                        Serial.print(" , ");
			Serial.print(rfid.serNum[2],DEC);
                        Serial.print(" , ");
			Serial.print(rfid.serNum[3],DEC);
                        Serial.print(" , ");
			Serial.print(rfid.serNum[4],DEC);
                        Serial.println(" ");
                        codigo = rfid.serNum[4],DEC;// guardamos en la variable "codigo" el valor del cuarto bloque de caracteres de la tarjeta
                        //si queremos aumentar la seguridad podemos almacenar en otra/s variables más bloques
          }
          
    }
     rfid.halt();
     //El siguiente IF abre la puerta a aquella tarjeta cuyo CUARTO BLOQUE de caracteres es igual a 90
     //si queremos aumentar la seguridad podemos comparar más bloques en lugar de solo el cuarto
     if (codigo == 90)
     {
       Serial.println(" ");
       Serial.println("Usuario Autorizado. Bienvenido");
       Serial.println(" ");
       //Activa el Relé durante X segundos
       digitalWrite(7, LOW);
       delay(x);
       digitalWrite(7, HIGH);
     }
     //FIN CODIGO APERTURA POR RFID
     
     
     //INICIO CODIGO APERTURA CON TECLADO
      tecla=teclado.getKey();
      if (tecla != NO_KEY)//si se presionó una tecla
      {
            if (tecla == '#')//si tecleamos el caracter "#" del KeyPad comprobaremos si abrir la puerta, y reiniciaremos clave introducida
            {
                  if (indiceTeclado==4) // Si no hemos introducido cuatro caracteres, ni comprobamos
                  {
                        bool coincide=true;
                        for (int i=0;i<4;i++){
                              if (clave[i]!=introducida[i])
                              {
                                    coincide=false;
                                    Serial.println(" ");
                                    Serial.println("Clave INCORRECTA");
                                    Serial.println(" ");
                                    break; //si uno de los caracteres no coincide, salimos del bucle
                              }     
                        }
                        if (coincide)
                        {
                              Serial.println(" ");
                              Serial.println("Usuario Autorizado. Bienvenido");
                              Serial.println(" ");                          
                              //Activa el Relé durante X segundos
                              digitalWrite(7, LOW);
                              delay(x);
                              digitalWrite(7, HIGH);
                        }
                  }
                  Serial.println();
                  indiceTeclado=0; // Siempre que se pulse # "borramos" la clave
            }
            else      // Si la tecla no es #
            {
                  if (indiceTeclado < 4) // Cuando existan ya cuatro caracteres "pasamos de recibir más"
                  {
                        introducida[indiceTeclado]=tecla; 
                        indiceTeclado++;
                        Serial.print(tecla);
                  }
            }
      }
      //FIN CODIGO APERTURA CON TECLADO
}

Se puede mejorar la seguridad comparando todos los bloques de datos de cada tarjeta RFID así como añadiendo más caracteres a la clave cuando se utiliza el teclado. Eso a gusto de cada uno :wink:

Un saludo y muchas gracias de nuevo compañero Noter!!!!

De nada, Jukar. Un placer haberte ayudado.
Saludos.

Mi control de acceso le tengo puesto un display para que mueste por el LCD la información, me llama mucho la atención lo del rele y la cerradura, pero no se como montarlo ese será mi siguiente paso.

Aproposito el codigo del teclado es auto-generado ???

Hola Jonhie, no se muy bien a que te refieres con lo de auto generado... :blush:

Cuando lo monte con la cerradura procurare hacer foto de todas las conexiones por sí te sirve. Ahora estoy esperando que me llegue la caja donde montar el módulo RFID.

Mi intención es montar otro control de acceso similar a este pero con una pantalla LCD igual que tu. He estado viendo esta pero no se sí será muy complejo ( es el primer LCD que montó) ni si dispondré de suficientes pones para el proyecto con un Arduino UNO...

¿Qué te parece?

Me refiero que si la clave de acceso se auto-genera, es decir cada dia es una nueva... o tienes que compilar el arduino para la nueva pass..... lo ideal seria, esto:

En mi proyecto de control de acceso consegui conectarlo con una web php, si no tienes la tarjeta el usuario puede acceder a una intranet, esta intranet le generara un id que la mostrara en el LCD. con esa id la pone en la intranet y le abreria la puerta. en mi caso daria el acceso.

Yo tambien estoy esperando que me llegue mi caja para montar el modulo rfid, mi LCD es de 8pines pero solo uso 4 del arduino. Cuando tenga el potenciometro que me falta para el LCD y la caja te pongo unas fotos.

Hola Jonhie, la clave no es autogenerada, hay que modificarla en el sketch y cargarlo de nuevo en el arduino.

El método que planteas en tu proyecto es realmente muy interesante, nunca se me hubiera ocurrido...

Espero esas fotos :wink:

Un saludo!!!

Jukar:
Hola Jonhie, la clave no es autogenerada, hay que modificarla en el sketch y cargarlo de nuevo en el arduino.

El método que planteas en tu proyecto es realmente muy interesante, nunca se me hubiera ocurrido...

Espero esas fotos :wink:

Un saludo!!!

Te cuento un poco más.
El usuario si por alguna razón no tuviera las tarjeta rfid, aparte de poder conectarse con el movil como te comente a una intranet que este accesible desde internet, y que al pulsar un icono de la intranet le muestra en el LCD el Random/Semilla para que la ponga en la intranet y le de acceso.
Con esto compruebas de que el usuario esta fisicamente delante del lector y no esta en el bareto de la esquina.
En cuanto lo deje terminado lo avanzaré más metiendole el NFC para el movil por proximidad que tambien es muy muy interesante. Y discriminación horaria que hasta el momento no lo estoy haciendo.

Hola Jukar me parece interesante tu proyecto yo soy nuevo en esto de arduino y me gustaria mucho hacer tu proyecto pero no veo como empesar me encantaria si podrias subir el esquematico de como va conectado todo por la foto que subiste tengo una idea pero seria mucho mejor si me ayudaras con el esquema te lo agradeceria mucho y gracias por tu proyecto te felicito esta muy interesante

Por fin me llegaron los componentes que necesitaba.

Te dejo un parde fotos.
Como ves cuando paso el token nfc me dice si tiene acceso o no,
Tambien le meti un sensor de temp y humedad, que solo muestra los datos de la sala si el usuario tiene acceso.
Si te fijas no tengo potencimetro para el LCD le meti una resistencia de 2,2Kons a mi me va bien con esa, si le ponia una inferior el LCD se quedaba iluminado totalmente y si le ponia una superior ni se veia.

si quieres los esquemas te los pueden pasar.

Gracias Johnnie!!!

No conocía el sistema NFC pero me parece muy interesante.

Yo todavía estoy esperando mi pantalla lcd y la caja para montarlo todo... En mi caso la pantalla es I2C que, si no me equivoco, utiliza solo 2 pines para comunicarse con arduino....Cuando lo tenga subo fotos también.

Si tienes los esquemas a mano súbelos. Yo estoy intentando hacer los míos con Fritzing pero no encuentro el componente "relé" así que estoy investigando a ver como puedo importarlo. En cuanto lo tenga lo subo.

Un saludo!!!!!

Mi LCD ocupa 5 pines de comunicacion con arduino

Lo he visto en la foto. Yo, entre el relé, el teclado y el lector RFID tengo ocupados ya del 3 al 13 digitales y 1 analógico... así que espero no equivocarme con lo del LCD jejeje :sweat_smile:

Si te fijas mi lector NFC no consume ningún pin ni digital ni analogico. pues va conectado al xbeen. ya me diras como se conecta el rele y el codigo a usar compañero.

johnnie:
Si te fijas mi lector NFC no consume ningún pin ni digital ni analogico. pues va conectado al xbeen. ya me diras como se conecta el rele y el codigo a usar compañero.

En cuanto me llegue el LCD !!! :wink:

Puedes poner el esquema del rele ?