Ciao se vuoi usa questo sketch che ho creato basandomi anch'io sul tuo(la differenza è che ho integrato lcd 16x2 e rtc con blocco accessi a determinati orari) e ultimato con l'aiuto del forum..modificalo come meglio credi 
/* lettore tag nfc il quale abilita un rele' se il tag è corretto.
* funzione di auto-protect che inibisce la lettura in un determinato arco temporale
* pin rtc : 8-sclk,9-IO pin,10-CEpin(rst)
* pin lcd I2C : A4,A5
* pin MFRC522: 7-rst,6-sda,11-mosi,12-miso,13-sck
* pin rele: 2
* pin buzzer: 3
* pin led: 5
*/
#include <DS1302RTC.h> //includo libreria rtc
#include <Time.h> //includo libreria gestione time
#include <SPI.h> // includo libreria spi
#include <MFRC522.h> //includo libreria lettore rfid
#include <LiquidCrystal_I2C.h> //libreria lcd I2C
#include <Wire.h> //includo libreria wire
#define SS_PIN 6 //definisco i pin rfid
#define RST_PIN 7 // definisco pin reset rfid
LiquidCrystal_I2C mylcd(0x27, 20, 4); // setto il display
DS1302RTC RTC(10, 9, 8); // setto pin RTCD
MFRC522 mfrc522(SS_PIN, RST_PIN); // setto e creo l'istanza rfid
long previousMillis = 0; //variabili tempo rfid
long interval = 10;
bool bSystemLocked;
int rele = 2; //pin relè
int buzzer = 3; //pin buzzer
int hour() ; //variabile tempo
int ledG = 5;
String uidRFID[] = {"b34cdcc7", "codeRFID_B", "codeRFID_C", "codeRFID_D"}; // tag abilitati (da modificare con i tag di interesse)
byte locked[8] = {B00000, B01110, B10001, B10001, B11111, B11111, B11111, B00000}; // creo carattere speciale
byte Clock[8] = {B00000, B01110, B10011, B10101, B10001, B01110, B00000, B00000};
void setup() {
mylcd.begin(); //inizializzo lcd
mylcd.backlight(); //abilito retroilluminazione
mylcd.createChar(0, locked); //creo carattere speciale e imposto la sua assegnazione a 0
mylcd.createChar(1, Clock);
SPI.begin(); // Inizializzo SPI
mfrc522.PCD_Init(); // Inizializzo MFRC522
pinMode(rele, OUTPUT); //imposto il pin del rele come output
pinMode(ledG, OUTPUT);
mylcd.clear(); //pulisco display
if (RTC.haltRTC()) { //ciclo di controllo sul rtc se attivo
mylcd.print("Clock stopped!");
}
else {
mylcd.print("Clock working.");
}
mylcd.setCursor(0, 1);
if (RTC.writeEN()) { //controllo rom rtc
mylcd.print("Write allowed.");
}
else {
mylcd.print("Write protected.");
}
delay ( 2000 ); //attendo
// Setup Time libreria
mylcd.clear();
mylcd.print("RTC Sync");
setSyncProvider(RTC.get); // acquisisco i dati dal rtc e verifico
if (timeStatus() == timeSet) {
mylcd.print(" Ok!");
}
else {
mylcd.print(" FAIL!");
}
delay ( 2000 );
mylcd.clear();
}
void loop() {
mylcd.setCursor(2, 0); //setto cursore
mylcd.print("STUDIO GLOBAL"); //prima riga lcd in stampa fissa
if (timeStatus() != timeSet) {
mylcd.setCursor(0, 1);
mylcd.print(F("RTC ERROR")); //controlla che i time sia sincroni
}
int h = hour(); // a hour la variabile h
if ((h == 0) || (h >= 7)) // se,h = 0 oppure h maggiore o uguale a 7
{
openOffice(); //attivo funzione open office
}
else //oppure
{
closeOffice(); // attivo funzione close office
}
unsigned long currentMillis = millis(); // currentmillis uguale millis
if (currentMillis - previousMillis > interval) { //
previousMillis = currentMillis;
// gurda se c'è un tg vicino
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// e lo legge
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
String uid_s = ""; // il codice del tag è assegnato alla variabile
if (!mfrc522.PICC_IsNewCardPresent() && !mfrc522.PICC_ReadCardSerial()) {
for (byte i = 0; i < mfrc522.uid.size; i++) {
String uid_a = String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
String uid_b = String(mfrc522.uid.uidByte[i], HEX);
uid_s = uid_s + uid_a + uid_b;
}
}
boolean controllo = false; // controllo valore boleano logico 1
if (!bSystemLocked) { //se bSystem è falso
for (int i = 0; i < sizeof(uidRFID) / sizeof(String); i++) // attiva ciclo
if (uidRFID[i] == uid_s) { // se il tag letto corrisponde a un tag valido
mylcd.setCursor(3, 1);
mylcd.print("Consentito");
tone(buzzer, 800, 100);
ledgB();
openDoor(); //attiva
controllo = true;
break;
}
}
if (!controllo) { //se il controllo booleano è falso
mylcd.setCursor(0, 1);
mylcd.print("!Non Consentito!");
tone(buzzer, 800, 500);
displayBlink(3, 400);
delay(2000);
}
mylcd.clear();
}
}
void openDoor() { //funzione attivazione rele
digitalWrite(rele, HIGH);
delay(2000);
digitalWrite(rele, LOW);
}
void ledgB() {
digitalWrite(ledG, HIGH);
delay(500);
digitalWrite(ledG, LOW);
}
void print2digits(int number) { //funzione stampa corretta ora,minuti,secondi
// Output leading zero
if (number >= 0 && number < 10) {
mylcd.write('0');
}
mylcd.print(number);
}
void openOffice() { //funzione open office
mylcd.setCursor(0, 1);
mylcd.print(" ");
mylcd.setCursor(3, 1);
mylcd.write(1);
mylcd.setCursor(4, 1);
mylcd.print("");
print2digits(hour());
mylcd.print(":");
print2digits(minute());
mylcd.print(":");
mylcd.print(second());
mylcd.setCursor(12, 1);
mylcd.print(" ");
bSystemLocked = false; // booleano falso (1) presente nella funzione tag corretto
}
void closeOffice() { //funzione close office
mylcd.setCursor(1, 1);
mylcd.write(0);
mylcd.setCursor(2, 1);
mylcd.print("System Locked");
bSystemLocked = true; // booleano vero(0) presente nella funzione "non consentito" nella funzione read nfc deve essere falso per abilitarlo
}
void displayBlink(int blinks, int duration) // funzione lampeggio display quando "non consentito"
{
while (blinks--)
{
mylcd.noDisplay();
delay(duration);
mylcd.display();
delay(duration);
}
}