Arduino Forum

International => Español => Topic started by: nskleon on Apr 09, 2019, 05:26 pm

Title: control de acceso 5.000 usuarios con tarjetas (tag RFID)
Post by: nskleon on Apr 09, 2019, 05:26 pm
Estimados  


quería pedirles su ayuda para realizar un proyecto de control de acceso para 5.000 usuarios con tarjetas RFID  donde solo se leera el uid de la tarjeta pero no se como almacenar tantos usuarios en la base de arduino sin agotar la memoria  solo me permite  700 usuarios  


adjunto el codigo  


al realizar un variable int usuario[5000][5]={ {36,238,94,1,149},{12,228,91,5,249},{16,118,26,2,672}, etc};

Se me agota la memoria  hay otra forma de realizar  esto con un archivo fuera del arduino  o algo  



Code: [Select]
#include <SPI.h>
#include <RFID.h>

#define SS_PIN 10
#define RST_PIN 9

RFID rfid(SS_PIN, RST_PIN);

char orden;
int led_verde = 8;
int led_rojo = 7;
int sensor_puerta = 6;
int contador = 0;//<==========================esta variable sirve para evitar bucles de impresión de " usuario correcto " o " usuario incorrecto"
int estado_puerta = 0;
int puerta_abierta = 0;
int contador_estado_puerta = 0;
int i = 0 ;
int numero_serie[5]; // aqui guardaremos el número que nuestro sensor RFID detectará
                    
                    //* usuario_1         usuario_2         usuario_3 */  ETC
int usuario[5000][5]={ {36,238,94,1,149},{12,228,91,5,249},{16,118,26,2,672}};




 //-----------------------------------------------variables, includes,funciones, etc-------------------------------------------------

void setup()
{
Serial.begin(9600);
pinMode(led_verde, OUTPUT);
pinMode(led_rojo, OUTPUT);
pinMode(sensor_puerta,INPUT);
SPI.begin();
rfid.init();
}

void loop()
{
   comprobar_puerta();


 if(estado_puerta == 1)
 {
             for(int i = 0 ; i < 60; i++)  // este bucle hace que cada segundo envie " Alerta, la puerta está abierta"
               {
          leer_usuario();
                  delay(1);
               }

               Serial.println("Alerta, la puerta esta abierta");

 }else
     {
       leer_usuario();
         }
}


void abrir_puerta()
{

  comprobar_puerta();

  if(estado_puerta == 0)
  {
 digitalWrite(led_verde,HIGH);
 Serial.println("puerta abierta");
        puerta_abierta = 1;
 contador = 1;
  }else{
        Serial.println("Error, La puerta esta abierta");
        contador = 1;
       }
}

void cerrar_puerta()
{
  comprobar_puerta();

  if(estado_puerta == 0)
  {
        digitalWrite(led_verde,LOW);
 Serial.println("Puerta cerrada");
 contador = 1;
  }else{
        Serial.println("Error, La puerta esta abierta");
        contador = 1;
       }
}

void comprobar_puerta()
{
  estado_puerta = digitalRead(sensor_puerta);

  if((estado_puerta == 0) && (puerta_abierta == 1) && (contador_estado_puerta == 0) )  // puerta cerrada pero le hemos dado la señal de abrir
  {
     delay(100);

         if((estado_puerta == 0 ) && (puerta_abierta == 1))
          {
            contador_estado_puerta = 2;
          }
   }


if(estado_puerta == 1) // puerta abierta y le hemos dado la señal de abrir
  {
    delay(100);

   if ((estado_puerta == 1 ) && (puerta_abierta == 1) && (contador_estado_puerta == 2 ) )
          {
            contador_estado_puerta = 1;
          }
  }


  if((estado_puerta == 0) && (puerta_abierta == 1) && (contador_estado_puerta == 1) ) // si la puerta está cerrada y ha pasado por los anteriores
  {
     delay(100);

         if((estado_puerta == 0 ) && (puerta_abierta == 1) && (contador_estado_puerta == 1))
          {
            contador_estado_puerta = 3;
            puerta_abierta = 0;
            delay(2000);
            cerrar_puerta();
          }
   }
}


void comprobar_usuario()  // con este bucle miramos si alguno de nuestros usuarios coincide con el array rfid.serNUM ( el numero que está para comprobar)
{
  i=0;
for(int j=0; j<=5; ) // numero de digitos de nuestro tag
 {
   if( (usuario[i][j]) == (numero_serie[j]))
     {
      j++;
      }else{
             i++;
             j=0;
           }

   if(i >= 5) // ese numero es el numero máximo de usuarios que pondremos
     {
      j=5;
     }


switch(i)
{
  case 0:
  Serial.println("usuario_1");
  usuario_correcto();
  break;
  
  case 1:
  Serial.println("usuario_2");
  usuario_correcto();
  break;  
  
  case 2:
  Serial.println("usuario_3");
  usuario_correcto();
  break;
  
  default:
  usuario_incorrecto();
  break;

}
 }
}

void leer_usuario()
{
contador = 0;
    if (rfid.isCard())
    {
           if (rfid.readCardSerial())
            {
                Serial.print("Numero usuario: "); // guardamos el numero del usuario
                for(int i=0; i<=4 ; i++)
                {
                numero_serie[i] = rfid.serNum[i];
                }

                for(int i=0; i<=4 ; i++) // y lo imprimimos
                {
                Serial.print(numero_serie[i]);
                }

                Serial.println(" "); // esto es para que quede más bonito y el " usuario correcto " o " usuario incorrecto " aparezcan debajo y no pegados
                delay(500); // para que no se imprima constantemente el mismo numero
                contador = 1;
               comprobar_usuario();
             }
    }
    rfid.halt();
}

void usuario_correcto()
{
 if(contador == 1)
  {
   Serial.println("Usuario correcto");
   abrir_puerta();
   contador = 0;
  }
}


void usuario_incorrecto()
{
 if(contador == 1)
  {
   Serial.println("Usuario incorrecto");
   error();
   contador = 0;
  }
}



void error()
{
     digitalWrite(led_verde,LOW);
    
  for(int j = 0; j < 4 ; j++)
  {
   digitalWrite(led_rojo,HIGH);
   delay(500);
   digitalWrite(led_rojo,LOW);
   delay(500);
  }

}
Title: Re: control de acceso 5.000 usuarios con tarjetas (tag RFID)
Post by: PaulS on Apr 09, 2019, 05:45 pm
The data from the RFID card is an array of bytes. There is no reason to use an int array to hold the user data.

You could get an Arduino with more memory or you could use an SD card.
Title: Re: control de acceso 5.000 usuarios con tarjetas (tag RFID)
Post by: nskleon on Apr 09, 2019, 07:38 pm
al usar una tarjeta SD como seria el código, soy nuevo en esto pero como debería quedar   ayuda por favor ????