How do I add up to 50 more users?

The code appears to use 210 bytes of EEPROM for each user, presumably to store up to 30 entries of date/time per user. For 60 users, it would need over 12K bytes of EEPROM, so some significiant changes would be needed, or at least an external EEPROM.

That is not particularly well written code, and as written could wear out the EEPROM quickly.

Does it mean that having over 12k of EEPROM is not good? If so, how can I reduce it that it would not need over such number while catering 60 users without having an external eeprom?

Is it possible for me to reduce the bytes being used for each user?

Okay here is it

#include <Adafruit_Fingerprint.h>
#include <EEPROM.h>         //command for storing data
#include <LiquidCrystal.h>  //lcd header file
int Contrast = 100;

LiquidCrystal lcd(9, 8, 5, 4, 3, 2);  // 8,9,10,11,12,13 ORIGINAL ARRANGEMENT
#include <SoftwareSerial.h>
SoftwareSerial fingerPrint(12, 13);  //for tx/rx communication between arduino & r305 fingerprint sensor

#include <Wire.h>
#include "RTClib.h"  //library file for DS3231 RTC Module
RTC_DS3231 rtc;

uint8_t id;
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&fingerPrint);

#define register_back 14
#define delete_ok 15
#define forward 16
#define reverse 17
#define match 5
#define indFinger 7
#define buzzer 5

#define records 10  // 10 for 10 user

int user1, user2, user3, user4, user5, user6, user7, user8, user9, user10;  // review
// user11,user12,user13,user14,user15,user16,user17,user18,user19,user20
// user21,user22,user23,user24,user25,user26,user27,user28,user29,user30
// user31,user32,user33,user34,user35,user36,user37,user38,user39,user40
// user41,user42,user44,user44,user45,user46,user47,user48,user49,user50

DateTime now;

void setup() {

  delay(700);  //1000
  // lcd.begin(16,2);
  analogWrite(6, Contrast);
  lcd.begin(16, 2);
  Serial.begin(9600);
  pinMode(register_back, INPUT_PULLUP);
  pinMode(forward, INPUT_PULLUP);
  pinMode(reverse, INPUT_PULLUP);
  pinMode(delete_ok, INPUT_PULLUP);
  pinMode(match, INPUT_PULLUP);
  pinMode(buzzer, OUTPUT);
  pinMode(indFinger, OUTPUT);
  digitalWrite(buzzer, LOW);
  if (digitalRead(register_back) == 0) {
    // digitalWrite(buzzer, HIGH);
    delay(300);  //500
    digitalWrite(buzzer, LOW);
    lcd.clear();
    lcd.print("Please wait !");
    lcd.setCursor(0, 1);
    lcd.print("Downloding Data");

    Serial.println("Please wait");
    Serial.println("Downloding Data..");
    Serial.println();

    Serial.print("S.No. ");
    for (int i = 0; i < records; i++) {
      // digitalWrite(buzzer, HIGH);
      delay(300);  //500
      digitalWrite(buzzer, LOW);
      Serial.print(" User ID");
      Serial.print(i + 1);
      Serial.print(" ");
    }
    Serial.println();
    int eepIndex = 0;
    for (int i = 0; i < 30; i++) {
      if (i + 1 < 10)
        Serial.print('0');
      Serial.print(i + 1);
      Serial.print(" ");
      eepIndex = (i * 7);
      download(eepIndex);
      eepIndex = (i * 7) + 210;
      download(eepIndex);
      eepIndex = (i * 7) + 420;
      download(eepIndex);
      eepIndex = (i * 7) + 630;
      download(eepIndex);
      eepIndex = (i * 7) + 840;
      download(eepIndex);
      eepIndex = (i * 7) + 1050;
      download(eepIndex);
      eepIndex = (i * 7) + 1260;
      download(eepIndex);
      eepIndex = (i * 7) + 1470;
      download(eepIndex);
      eepIndex = (i * 7) + 1680;
      download(eepIndex);
      Serial.println();
    }
  }
  if (digitalRead(delete_ok) == 0) {
    lcd.clear();
    lcd.print("Please Wait");
    lcd.setCursor(0, 1);
    lcd.print("Reseting.....");
    for (int i = 1000; i < 1005; i++)
      EEPROM.write(i, 0);
    for (int i = 0; i < 841; i++)
      EEPROM.write(i, 0xff);
    lcd.clear();
    lcd.print("System Reset");
    delay(700);  //1000
  }

  lcd.clear();
  lcd.print(" Fingerprint ");
  lcd.setCursor(0, 1);
  lcd.print("Attendance System");
  delay(1000);  //2000
  lcd.clear();

  // digitalWrite(buzzer, HIGH);
  delay(300);  //500
  digitalWrite(buzzer, LOW);
  for (int i = 1000; i < 1000 + records; i++) {
    if (EEPROM.read(i) == 0xff)
      EEPROM.write(i, 0);
  }

  finger.begin(57600);
  Serial.begin(9600);
  lcd.clear();
  lcd.print("Finding Module..");
  lcd.setCursor(0, 1);
  delay(1000);  //2000
  if (finger.verifyPassword()) {
    Serial.println("Found fingerprint sensor!");
    lcd.clear();
    lcd.print(" Module Found");
    delay(1000);  //2000
  } else {
    Serial.println("Did not find fingerprint sensor :(");
    lcd.clear();
    lcd.print("Module Not Found");
    lcd.setCursor(0, 1);
    lcd.print("Check Connections ");
    while (1)
      ;
  }

  if (!rtc.begin())
    Serial.println("Couldn't find RTC");

  // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

  if (rtc.lostPower()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(2024, 2, 25, 11, 10, 30));
    // This line sets the RTC with an explicit date & time, for example to set
    // June 7, 2018 at 11am you would call:
    // rtc.adjust(DateTime(2018, 6, 7, 11, 0, 0));
  }
  lcd.setCursor(0, 0);
  lcd.print(" Press Match to ");
  lcd.setCursor(0, 1);
  lcd.print(" Start System");
  delay(1300);  //3000

  user1 = EEPROM.read(1000);
  user2 = EEPROM.read(1001);
  user3 = EEPROM.read(1002);
  user4 = EEPROM.read(1003);
  user5 = EEPROM.read(1004);
  lcd.clear();
  digitalWrite(indFinger, HIGH);
}

void loop() {
  now = rtc.now();
  lcd.setCursor(0, 0);
  lcd.print("Time: ");
  lcd.print(now.hour(), DEC);
  lcd.print(':');
  lcd.print(now.minute(), DEC);
  lcd.print(':');
  lcd.print(now.second(), DEC);
  lcd.print(" ");
  lcd.setCursor(0, 1);
  lcd.print("Date: ");
  lcd.print(now.day(), DEC);
  lcd.print('/');
  lcd.print(now.month(), DEC);
  lcd.print('/');
  lcd.print(now.year(), DEC);
  lcd.print(" ");
  delay(300);  //500
  int result = getFingerprintIDez();
  if (result > 0) {
    digitalWrite(indFinger, LOW);
    // digitalWrite(buzzer, HIGH);
    delay(100);
    digitalWrite(buzzer, LOW);
    lcd.clear();
    lcd.print("ID:");
    lcd.print(result);
    lcd.setCursor(0, 1);
    lcd.print("Please Wait....");
    delay(800);  //1000
    attendance(result);
    lcd.clear();
    lcd.print("Attendance ");
    lcd.setCursor(0, 1);
    lcd.print("Registered");
    delay(800);  //1000
    digitalWrite(indFinger, HIGH);
    return;
  }
  checkKeys();
  delay(200);  //300
}

// dmyyhms - 7 bytes
void attendance(int id) {
  int user = 0, eepLoc = 0;
  if (id == 1) {
    eepLoc = 0;
    user = user1++;
  } else if (id == 2) {
    eepLoc = 210;
    user = user2++;
  } else if (id == 3) {
    eepLoc = 420;
    user = user3++;
  } else if (id == 4) {
    eepLoc = 630;
    user = user4++;
  } else if (id == 5) {
    eepLoc = 0;
    user = user5++;
  } else if (id == 6) {
    eepLoc = 840;
    user = user6++;
  } else if (id == 7) {
    eepLoc = 1050;
    user = user7++;
  } else if (id == 8) {
    eepLoc = 1260;
    user = user8++;
  } else if (id == 9) {
    eepLoc = 1470;
    user = user9++;
  } else if (id == 10) {
    eepLoc = 1680;
    user = user10++;
  }

  else
    return;

  int eepIndex = (user * 7) + eepLoc;
  EEPROM.write(eepIndex++, now.hour());
  EEPROM.write(eepIndex++, now.minute());
  EEPROM.write(eepIndex++, now.second());
  EEPROM.write(eepIndex++, now.day());
  EEPROM.write(eepIndex++, now.month());
  EEPROM.write(eepIndex++, now.year() >> 8);
  EEPROM.write(eepIndex++, now.year());

  EEPROM.write(1000, user1);
  EEPROM.write(1001, user2);
  EEPROM.write(1002, user3);
  EEPROM.write(1003, user4);
  // EEPROM.write(4,user5); // figth user
}

void checkKeys() {
  if (digitalRead(register_back) == 0) {
    lcd.clear();
    lcd.print("Please Wait");
    delay(800);  //1000
    while (digitalRead(register_back) == 0)
      ;
    Enroll();
  }

  else if (digitalRead(delete_ok) == 0) {
    lcd.clear();
    lcd.print("Please Wait");
    delay(800);  //1000
    delet();
  }
}

void Enroll() {
  int count = 1;
  lcd.clear();
  lcd.print("Enter Finger ID:");

  while (1) {
    lcd.setCursor(0, 1);
    lcd.print(count);
    if (digitalRead(forward) == 0) {
      count++;
      if (count > records)
        count = 1;
      delay(300);  //500
    }

    else if (digitalRead(reverse) == 0) {
      count--;
      if (count < 1)
        count = records;
      delay(300);  //500
    } else if (digitalRead(delete_ok) == 0) {
      id = count;
      getFingerprintEnroll();
      for (int i = 0; i < records; i++) {
        if (EEPROM.read(i) != 0xff) {
          EEPROM.write(i, id);
          break;
        }
      }
      return;
    }

    else if (digitalRead(register_back) == 0) {
      return;
    }
  }
}

void delet() {
  int count = 1;
  lcd.clear();
  lcd.print("Enter Finger ID");

  while (1) {
    lcd.setCursor(0, 1);
    lcd.print(count);
    if (digitalRead(forward) == 0) {
      count++;
      if (count > records)
        count = 1;
      delay(300);  //500
    }

    else if (digitalRead(reverse) == 0) {
      count--;
      if (count < 1)
        count = records;
      delay(300);  //500
    } else if (digitalRead(delete_ok) == 0) {
      id = count;
      deleteFingerprint(id);
      for (int i = 0; i < records; i++) {
        if (EEPROM.read(i) == id) {
          EEPROM.write(i, 0xff);
          break;
        }
      }
      return;
    }

    else if (digitalRead(register_back) == 0) {
      return;
    }
  }
}

uint8_t getFingerprintEnroll() {
  int p = -1;
  lcd.clear();
  lcd.print("finger ID:");
  lcd.print(id);
  lcd.setCursor(0, 1);
  lcd.print("Place Finger");
  delay(1000);  //2000
  while (p != FINGERPRINT_OK) {
    p = finger.getImage();
    switch (p) {
      case FINGERPRINT_OK:
        Serial.println("Image taken");
        lcd.clear();
        lcd.print("Image taken");
        break;
      case FINGERPRINT_NOFINGER:
        Serial.println("No Finger");
        lcd.clear();
        lcd.print("No Finger Found");
        break;
      case FINGERPRINT_PACKETRECIEVEERR:
        Serial.println("Communication error");
        lcd.clear();
        lcd.print("Comm Error");
        break;
      case FINGERPRINT_IMAGEFAIL:
        Serial.println("Imaging error");
        lcd.clear();
        lcd.print("Imaging Error");
        break;
      default:
        Serial.println("Unknown error");
        lcd.clear();
        lcd.print("Unknown Error");
        break;
    }
  }

  // OK success!

  p = finger.image2Tz(1);
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      lcd.clear();
      lcd.print("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      lcd.clear();
      lcd.print("Image too messy");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      lcd.clear();
      lcd.print("Comm Error");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      lcd.clear();
      lcd.print("Feature Not Found");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      lcd.clear();
      lcd.print("Feature Not Found");
      return p;
    default:
      Serial.println("Unknown error");
      lcd.clear();
      lcd.print("Unknown Error");
      return p;
  }

  Serial.println("Remove finger");
  lcd.clear();
  lcd.print("Remove Finger");
  delay(1000);  //2000
  p = 0;
  while (p != FINGERPRINT_NOFINGER) {
    p = finger.getImage();
  }
  Serial.print("ID ");
  Serial.println(id);
  p = -1;
  Serial.println("Place same finger again");
  lcd.clear();
  lcd.print("Place Finger");
  lcd.setCursor(0, 1);
  lcd.print(" Again");
  while (p != FINGERPRINT_OK) {
    p = finger.getImage();
    switch (p) {
      case FINGERPRINT_OK:
        Serial.println("Image taken");
        break;
      case FINGERPRINT_NOFINGER:
        Serial.print(".");
        break;
      case FINGERPRINT_PACKETRECIEVEERR:
        Serial.println("Communication error");
        break;
      case FINGERPRINT_IMAGEFAIL:
        Serial.println("Imaging error");
        break;
      default:
        Serial.println("Unknown error");
        return;
    }
  }

  // OK success!

  p = finger.image2Tz(2);
  switch (p) {
    case FINGERPRINT_OK:
      Serial.println("Image converted");
      break;
    case FINGERPRINT_IMAGEMESS:
      Serial.println("Image too messy");
      return p;
    case FINGERPRINT_PACKETRECIEVEERR:
      Serial.println("Communication error");
      return p;
    case FINGERPRINT_FEATUREFAIL:
      Serial.println("Could not find fingerprint features");
      return p;
    case FINGERPRINT_INVALIDIMAGE:
      Serial.println("Could not find fingerprint features");
      return p;
    default:
      Serial.println("Unknown error");
      return p;
  }

  // OK converted!
  Serial.print("Creating model for #");
  Serial.println(id);

  p = finger.createModel();
  if (p == FINGERPRINT_OK) {
    Serial.println("Prints matched!");
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_ENROLLMISMATCH) {
    Serial.println("Fingerprints did not match");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }

  Serial.print("ID ");
  Serial.println(id);
  p = finger.storeModel(id);
  if (p == FINGERPRINT_OK) {
    Serial.println("Stored!");
    lcd.clear();
    lcd.print(" Finger Stored!");
    delay(1000);  //2000
  } else if (p == FINGERPRINT_PACKETRECIEVEERR) {
    Serial.println("Communication error");
    return p;
  } else if (p == FINGERPRINT_BADLOCATION) {
    Serial.println("Could not store in that location");
    return p;
  } else if (p == FINGERPRINT_FLASHERR) {
    Serial.println("Error writing to flash");
    return p;
  } else {
    Serial.println("Unknown error");
    return p;
  }
}

int getFingerprintIDez() {
  uint8_t p = finger.getImage();

  if (p != FINGERPRINT_OK)
    return -1;

  p = finger.image2Tz();
  if (p != FINGERPRINT_OK)
    return -1;

  p = finger.fingerFastSearch();
  if (p != FINGERPRINT_OK) {
    lcd.clear();
    lcd.print("Finger Not Found");
    lcd.setCursor(0, 1);
    lcd.print("Try Later");
    delay(1000);  //2000
    return -1;
  }
  // found a match!
  Serial.print("Found ID #");
  Serial.print(finger.fingerID);
  return finger.fingerID;
}

uint8_t deleteFingerprint(uint8_t id) {
  uint8_t p = -1;
  lcd.clear();
  lcd.print("Please wait");
  p = finger.deleteModel(id);
  if (p == FINGERPRINT_OK) {
    Serial.println("Deleted!");
    lcd.clear();
    lcd.print("Finger Deleted");
    lcd.setCursor(0, 1);
    lcd.print("Successfully");
    delay(800);  //1000
  }

  else {
    Serial.print("Something Wrong");
    lcd.clear();
    lcd.print("Something Wrong");
    lcd.setCursor(0, 1);
    lcd.print("Try Again Later");
    delay(1000);  //2000
    return p;
  }
}

void download(int eepIndex) {

  if (EEPROM.read(eepIndex) != 0xff) {
    Serial.print("T->");
    if (EEPROM.read(eepIndex) < 10)
      Serial.print('0');
    Serial.print(EEPROM.read(eepIndex++));
    Serial.print(':');
    if (EEPROM.read(eepIndex) < 10)
      Serial.print('0');
    Serial.print(EEPROM.read(eepIndex++));
    Serial.print(':');
    if (EEPROM.read(eepIndex) < 10)
      Serial.print('0');
    Serial.print(EEPROM.read(eepIndex++));
    Serial.print(" D->");
    if (EEPROM.read(eepIndex) < 10)
      Serial.print('0');
    Serial.print(EEPROM.read(eepIndex++));
    Serial.print('/');
    if (EEPROM.read(eepIndex) < 10)
      Serial.print('0');
    Serial.print(EEPROM.read(eepIndex++));
    Serial.print('/');
    Serial.print(EEPROM.read(eepIndex++) << 8 | EEPROM.read(eepIndex++));
  } else {
    Serial.print("---------------------------");
  }

  Serial.print(" ");
}

Now you have had a play with a project that is close to your needs, perhaps it is time to define your own requirements and build your own system based around those requirements and the confines of your chosen hardware.

For example, what data do you need to log per user for each fingerprint recognition? Look back at post #21. Also look at how you can compress the data you want to store. Can you get 2 pieces of information into 1 byte for example?

If the code you are using as a starting position was well written then it would be a relatively easy task to modify it for your needs. Unfortunately, as others have already pointed out, the code you have is a mess and will likely require a lot of work to fit your requirements.

EDIT: Which DS3231 RTC module are you using? Mine has an AT24C32 EEPROM fitted as well. That would give you 4K of external EEPROM for free....

The code stores the data/time of each login in a broken down form of hours/minutes/seconds/month/day/year, which takes seven bytes. That can easily be changed to four bytes by storing in the form of a unix timestamp. You could reduce that to less if you don't need the login time accurate to the second, and even smaller if you can store a starting data/time (such as the start of the month) and then have each login as the offset from that.

The original code also allows for thirty logins per user, and stores the number of logins per user as an int instead of a more appropriate byte.

You could also store the data to an SD card instead of the EEPROM, or upload to another computer over WiFI.

I'll try

DS3231 RTC with ATHYC532, is it with EEPROM as well?

EDIT:

The on-board 24C32 will give you 4x the storage of the 328P on your UNO.

Maybe make a few decisions to cut down on the number of bytes per entry. For example, do you need to store the year? Do you need to know to the second when a user fingerprint is logged or will the nearest minute do?

As @david_2018 already mentioned, you can use a unix timestamp + 1 byte user ID. That's 5 bytes per record.

Only you can determine how often fingerprints will be logged - is it 1 or 2 per hour or more like 30 or 40? How frequently will you be downloading the data? This all factors into the storage requirements.

Maybe you should look into a sd card...

Given from the code that I showed above, can you write an example code for that?

45

every after the day