control de acceso 5.000 usuarios con tarjetas (tag RFID)

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

#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);
  }

}

control_acceso_rfid_geekchickens_para_Mykel.ino (5.37 KB)

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.

al usar una tarjeta SD como seria el código, soy nuevo en esto pero como debería quedar ayuda por favor ????