allego il codice rifatto..in questo modo quando passa a System Locked il rfid è attivo ma non attiva la funzione Open Door e restituisce "non consentito" sia con NFC sconosciuta e conosciuta..devo capire bene come funzionano i booleani..ma comunque grazie Xilav!!
#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(0x38, 16, 2); // 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
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
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);
mylcd.print("STUDIO GLOBAL");
if (timeStatus() != timeSet) {
mylcd.setCursor(0, 1);
mylcd.print(F("RTC ERROR"));
}
int h = hour();
if ((h == 23) || (h >= 7))
{
openOffice();
}
else
{
closeOffice();
}
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}
// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) {
return;
}
String uid_s = "";
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;
if(!bSystemLocked){
for (int i = 0; i < sizeof(uidRFID) / sizeof(String); i++)
if (uidRFID[i] == uid_s) {
mylcd.setCursor(3, 1);
mylcd.print("Consentito");
tone(buzzer, 800, 100);
delay(500);
openDoor();
controllo = true;
bSystemLocked = false;
break;
}
}
if (!controllo) {
mylcd.setCursor(0, 1);
mylcd.print("!Non Consentito!");
tone(buzzer, 800, 500);
displayBlink(3, 400);
delay(2000);
}
mylcd.clear();
}
mylcd.clear();
}
void openDoor() {
digitalWrite(rele, HIGH);
delay(2000);
digitalWrite(rele, LOW);
}
void print2digits(int number) {
// Output leading zero
if (number >= 0 && number < 10) {
mylcd.write('0');
}
mylcd.print(number);
}
void openOffice() {
mylcd.setCursor(3, 1);
mylcd.write(1);
mylcd.setCursor(4, 1);
mylcd.print("");
print2digits(hour());
mylcd.print(":");
print2digits(minute());
mylcd.print(":");
mylcd.print(second());
bSystemLocked = false;
}
void closeOffice() {
mylcd.setCursor(1, 1);
mylcd.write(0);
mylcd.setCursor(2, 1);
mylcd.print("System Locked");
bSystemLocked = true;
}
void displayBlink(int blinks, int duration)
{
while (blinks--)
{
mylcd.noDisplay();
delay(duration);
mylcd.display();
delay(duration);
}
}