Multiple Timers for each RFID input

I have a UHF RFID Reader and I wanted to add a timer for each UID Code (for entering, overstaying and exit in the vicinity). I am currently using Firebase as the Database. My code just occupies all the MAX_TIMERS, how do I solve this? Thanks.

#define MAX_TIMERS 10

FirebaseData fbdo;
FirebaseAuth auth;
FirebaseConfig config;
FirebaseJson json;

bool signupOK = false;
unsigned long sendDataPrevMillis = 0;

struct Timer{
  unsigned long startTime = 0;
  bool timerStarted = false;
  String storedCode = "";
};

Timer timers[MAX_TIMERS];

SoftwareSerial Serial2(RXD2, TXD2);
unsigned char data;
String code = "";
String storedCode = "";

String uidPath = "/";
String device_id = "Entrance Gate 1";

int status;

void checkAccess(String code) {

  for (int i = 0; i < MAX_TIMERS; i++){
  if(!timers[i].timerStarted){
    timers[i].storedCode = code;
    if (Firebase.RTDB.getInt(&fbdo, uidPath + "/entryUsers/" + code)) {

      if (fbdo.intData() == 0) { 

        json.add("time", String(timeClient.getFormattedTime()));
        json.add("id", device_id);
        json.add("uid", code);
        json.add("status", 1);

        Firebase.RTDB.setInt(&fbdo, "/entryUsers/" + code, 1);
      
        if(Firebase.RTDB.pushJSON(&fbdo, uidPath + "entryActivity" , &json)){
          Serial.println(fbdo.dataPath() + fbdo.pushName());
          timers[i].startTime = millis();
          timers[i].timerStarted = true;
        } else {
          Serial.println(fbdo.errorReason());
        } 

      }

      else if (fbdo.intData() == 1) {

        Firebase.RTDB.setInt(&fbdo, uidPath + "entryUsers/" + code, 0);

        json.add("time", String(timeClient.getFormattedTime()));
        json.add("id", device_id);
        json.add("uid", code);
        json.add("status", 0);
    
        if (Firebase.RTDB.pushJSON(&fbdo, "/entryActivity", &json)) {
          Serial.println(fbdo.dataPath() + fbdo.pushName()); 
          timers[i].timerStarted = false;
        } else {
          Serial.println(fbdo.errorReason());
        }

      }

      else if (fbdo.intData() == 3){

        Firebase.RTDB.setInt(&fbdo, uidPath + "entryUsers/" + code, 0);

        json.add("time", String(timeClient.getFormattedTime()));
        json.add("id", device_id);
        json.add("uid", code);
        json.add("status", 0);
    
        if (Firebase.RTDB.pushJSON(&fbdo, "/entryActivity", &json)) {
          Serial.println(fbdo.dataPath() + fbdo.pushName()); 
        } else {
          Serial.println(fbdo.errorReason());
        }

      }

      else {

        Serial.println("FAILED");
        Serial.println("REASON: " + fbdo.errorReason());

      }

    }
  }
  }

}

void timerHandler(String storedCode){
  
  for (int i = 0; i < MAX_TIMERS; i++){

    if(timers[i].timerStarted && millis() - timers[i].startTime >= 10000)
    {
      Serial.println("Overstayed: " + timers[i].storedCode);
      Firebase.RTDB.setInt(&fbdo, uidPath + "entryUsers/" + timers[i].storedCode, 3);
      timers[i].timerStarted = false;
      timers[i].startTime = 0;
    }

  }
    
}

void storeCode(){
  storedCode = code;
}


void loop() {

  while(Serial2.available() > 0) {                // Will Continue to read RFID
    data = Serial2.read();
    code = code + String(data, HEX);
  }

  if (code.length() > 1) {                        // Since UHF stores single codes ex. (8f), so print in length
    Serial.println(code);
    checkAccess(code);
    storeCode();
  }

  timerHandler(storedCode);

  code = "";
  delay(1000);

}

What happened when you increased this number?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.