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