//---UID Reader to Serial w/ RTC---
//This is a codebreaker machine for MIFARE Classic or Classic 1k cards
#define SSpin 53
#define SCKpin 52
#define MOSIpin 51
#define MISOpin 50
#define LED_STAT 10
#define LED_RD 11
#include <Arduino.h>
#include <Adafruit_PN532.h>
#include <Wire.h>
#include <SPI.h>
#include <ArduinoJson.h>
#include <ArduinoJson.hpp>
#include "RTClib.h"
Adafruit_PN532 mifare(SCKpin, MISOpin, MOSIpin, SSpin);
RTC_DS1307 clk;
StaticJsonDocument<384> js;
char buf[384];
char dino[7][12] = {"MINGGU" ,"SENIN", "SELASA", "RABU", "KAMIS", "JUMAT", "SABTU"};
uint8_t universal[6] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
uint8_t scs;
uint8_t b;
uint8_t state = 0;
uint8_t uid[] = {0, 0, 0, 0, 0, 0, 0};
String uid_now = "";
uint8_t uidLen;
uint8_t data[16];
String nid = "";
void status_blink(uint8_t PIN, uint8_t STATUS){
for(uint8_t f=0; f<STATUS; f++){
f++;
digitalWrite(PIN, 1);
delay(48);
digitalWrite(PIN, 0);
delay(48);
}
}
void in_people(){
js.clear();
DateTime now= clk.now();
String nid = "";
Serial.print("\nUID: ");
for(b=0; b<uidLen; b++){
Serial.print(uid[b], DEC);
Serial.print(" ");
nid += uid[b];
}
Serial.print(" Masuk: ");
Serial.print(now.hour(), DEC);
Serial.print(":");
if(now.minute()<10){
Serial.print("0");
Serial.print(now.minute(), DEC);
}else{Serial.print(now.minute(), DEC);}
Serial.print(":");
if(now.second()<10){
Serial.print("0");
Serial.print(now.second(), DEC);
}else{Serial.print(now.second(), DEC);}
Serial.print("---");
Serial.print(dino[now.dayOfTheWeek()]);
Serial.print(", ");
Serial.print(now.day(), DEC);
Serial.print("/");
Serial.print(now.month(), DEC);
Serial.print("/");
Serial.print(now.year(), DEC);
Serial.print("\n");
String status = "IN";
js["uid"] = nid;
js["status"] = status;
serializeJson(js, Serial);
delay(1000);
}
void out_people(){
js.clear();
String nid = "";
DateTime now= clk.now();
Serial.print("\nUID: ");
for(b=0; b<uidLen; b++){
Serial.print(uid[b], DEC);
Serial.print(" ");
nid += uid[b];
}
Serial.print(" Keluar: ");
Serial.print(now.hour(), DEC);
Serial.print(":");
if(now.minute()<10){
Serial.print("0");
Serial.print(now.minute(), DEC);
}else{Serial.print(now.minute(), DEC);}
Serial.print(":");
if(now.second()<10){
Serial.print("0");
Serial.print(now.second(), DEC);
}else{Serial.print(now.second(), DEC);}
Serial.print("---");
Serial.print(dino[now.dayOfTheWeek()]);
Serial.print(", ");
Serial.print(now.day(), DEC);
Serial.print("/");
Serial.print(now.month(), DEC);
Serial.print("/");
Serial.print(now.year(), DEC);
Serial.print("\n");
String status = "OUT";
js["uid"] = nid;
js["status"] = status;
serializeJson(js, Serial);
delay(1000);
}
void setup(void) {
Serial.begin(115200);
Serial.print("RFID Absension System v0.1\n");
pinMode(LED_STAT, 0x1);
pinMode(LED_RD, 0x1);
mifare.begin();
uint32_t hwversion = mifare.getFirmwareVersion();
if(!hwversion){
Serial.print("Check wiring, or restart device...");
while(1);
}
Serial.print("Found chip PN5"); Serial.println((hwversion>>24) & 0xFF, HEX);
Serial.print("Firmware ver. "); Serial.print((hwversion>>16) & 0xFF, DEC);
Serial.print('.'); Serial.println((hwversion>>8) & 0xFF, DEC);
mifare.setPassiveActivationRetries(0xFF);
mifare.SAMConfig();
delay(12);
if(!clk.begin()){
Serial.println("RTC Device Not Found.");
Serial.flush();
while(1) delay(12);
}
if(!clk.isrunning()){
Serial.println("Setting datetime..");
clk.adjust(DateTime(F(__DATE__), F(__TIME__)));
delay(24);
}
Serial.println("Setting complete");
}
void loop(void){
scs = mifare.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLen);
if(scs){
for(b=0; b<uidLen; b++){
Serial.print(uid[b], DEC);
Serial.print(" ");
nid += uid[b];
}
nid = uid_now;
if(state%2 == 0 && nid != uid_now){
state++;
in_people();
// Serial.print("UID: ");
// for(b=0; b<uidLen; b++){
// Serial.print(uid[b], HEX);
// }
// Serial.print("\n Masuk: ");
// Serial.print(now.hour(), DEC);
// Serial.print(":");
// if(now.minute()<10){
// Serial.print("0");
// Serial.print(now.minute(), DEC);
// }else{Serial.print(now.minute(), DEC);}
// Serial.print(":");
// if(now.second()<10){
// Serial.print("0");
// Serial.print(now.second(), DEC);
// }else{Serial.print(now.second(), DEC);}
// Serial.print("---");
// Serial.print(dino[now.dayOfTheWeek()]);
// Serial.print(", ");
// Serial.print(now.day(), DEC);
// Serial.print("/");
// Serial.print(now.month(), DEC);
// Serial.print("/");
// Serial.print(now.year(), DEC);
// Serial.print("\n");
// delay(1000);
}else if(state%2 != 0 && nid != uid_now){
state++;
out_people();
// Serial.print("UID: ");
// for(b=0; b<uidLen; b++){
// Serial.print(uid[b], HEX);
// }
// Serial.print("\n Keluar: ");
// Serial.print(now.hour(), DEC);
// Serial.print(":");
// if(now.minute()<10){
// Serial.print("0");
// Serial.print(now.minute(), DEC);
// }else{Serial.print(now.minute(), DEC);}
// Serial.print(":");
// if(now.second()<10){
// Serial.print("0");
// Serial.print(now.second(), DEC);
// }else{Serial.print(now.second(), DEC);}
// Serial.print("---");
// Serial.print(dino[now.dayOfTheWeek()]);
// Serial.print(", ");
// Serial.print(now.day(), DEC);
// Serial.print("/");
// Serial.print(now.month(), DEC);
// Serial.print("/");
// Serial.print(now.year(), DEC);
// Serial.print("\n");
// delay(1000);
}
}else{
Serial.print("\nUnidentified card ?");
}
}