#include <Keypad.h>
#include <Servo.h>
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
const byte RIGHE = 4;
const byte COLONNE = 4;
char hexaKeys[RIGHE][COLONNE] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte pinRighe[RIGHE] = {9, 8, 7, 6};
byte pinColonne[COLONNE] = {5, 4, 3, 2};
Keypad tastiera = Keypad(makeKeymap(hexaKeys), pinRighe, pinColonne, RIGHE, COLONNE);
Servo mioServo;
#define PIN_RST 49
#define PIN_SS 53
MFRC522 mfrc522(PIN_SS, PIN_RST);
MFRC522::MIFARE_Key chiave;
byte uidObiettivo[] = {0x4F, 0xC8, 0xB8, 0x1E};
byte sakObiettivo = 0x08;
const int rs2 = 30, en2 = 31, d42 = 32, d52 = 33, d62 = 34, d72 = 35;
LiquidCrystal lcd2(rs2, en2, d42, d52, d62, d72);
const int rs1 = 36, en1 = 37, d41 = 38, d51 = 39, d61 = 40, d71 = 41;
LiquidCrystal lcd(rs1, en1, d41, d51, d61, d71);
bool mostraMessaggioCiao = true;
bool mostraMessaggio = false;
bool mostraMessaggioRFID = false;
bool mostraMessaggioIniziale = true;
void setup() {
lcd.begin(16, 2);
lcd2.begin(16, 2);
pinMode(14, OUTPUT);
pinMode(15, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
mioServo.attach(10);
Serial.begin(9600);
digitalWrite(12, HIGH);
while (!Serial);
SPI.begin();
mfrc522.PCD_Init();
Serial.println(F("Avviso: questo esempio sovrascrive l'UID della tua carta UID modificabile, usa con attenzione!"));
mioServo.write(0);
lcd2.setCursor(0,0);
lcd2.print("MANCATA ENERGIA");
lcd.setCursor(0,0);
lcd.print("RIPRISTINO");
lcd.setCursor(0,1);
lcd.print("IN CORSO...");
delay(5000);
lcd.clear();
lcd2.clear();
lcd2.setCursor(0,0);
lcd2.print("TUTTI");
lcd2.setCursor(0,1);
lcd2.print("I SISTEMI");
lcd.setCursor(0,0);
lcd.print("SONO");
lcd.setCursor(0,1);
lcd.print("OPERATIVI");
delay(2000);
lcd.clear();
lcd2.clear();
lcd2.setCursor(0,0);
lcd2.print("RIAVVIO");
lcd2.setCursor(0,1);
lcd2.print("IN CORSO");
delay(1000);
lcd2.setCursor(0,1);
lcd2.print("IN CORSO.");
delay(1000);
lcd2.setCursor(0,1);
lcd2.print("IN CORSO..");
delay(2000);
lcd2.setCursor(0,1);
lcd2.print("IN CORSO...");
delay(500);
lcd2.setCursor(0,1);
lcd2.print("IN CORSO....");
delay(2000);
lcd2.setCursor(0,1);
lcd2.print("IN CORSO.....");
delay(3000);
lcd.clear();
lcd2.clear();
delay(2000);
delay(300);
digitalWrite(14, HIGH);
digitalWrite(11, HIGH);
digitalWrite(12, HIGH);
delay(500);
digitalWrite(14, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
for (byte i = 0; i < 6; i++) {
chiave.keyByte[i] = 0xFF;
}
digitalWrite(12, HIGH);
}
void loop() {
if (mostraMessaggioIniziale) {
lcd2.setCursor(0, 0);
lcd2.print("AVVICINA UN TAG");
lcd2.setCursor(0, 1);
lcd2.print("RFID");
lcd.setCursor(0, 0);
lcd.print("O INSERISCI");
lcd.setCursor(0, 1);
lcd.print("IL CODICE");
mostraMessaggioIniziale = false;
}
char tastoPersonalizzato = tastiera.getKey();
if (tastoPersonalizzato) {
if (!mostraMessaggio) {
lcd2.clear();
lcd2.setCursor(0, 0);
lcd2.print("Inserisci codice:");
lcd.clear();
lcd.setCursor(0,0);
lcd.print("IN ATTESA...");
mostraMessaggio = true;
}
static char codiceInserito[9];
static byte indiceCodice = 0;
if (indiceCodice < 8) {
codiceInserito[indiceCodice] = tastoPersonalizzato;
indiceCodice++;
lcd2.setCursor(indiceCodice - 1, 1);
lcd2.print('*');
digitalWrite(14, HIGH);
delay(100);
digitalWrite(14, LOW);
if (indiceCodice == 8) {
codiceInserito[8] = '\0';
if (strcmp(codiceInserito, "20052008") == 0) {
lcd.clear();
lcd2.clear();
lcd2.setCursor(0, 0);
lcd2.print("CODICE CORRETTO");
lcd.setCursor(0, 0);
lcd.print("ACCESSO");
lcd.setCursor(0, 1);
lcd.print("CONSENTITO");
tone(15, 500, 500);
tone(15, 600, 500);
delay(300);
tone(15, 850, 500);
mioServo.write(180);
digitalWrite(12, LOW);
digitalWrite(11, HIGH);
delay(5000);
mioServo.write(0);
tone(15, 850, 500);
delay(300);
tone(15, 600, 500);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
mostraMessaggioCiao = true;
} else {
lcd.clear();
lcd2.clear();
lcd2.setCursor(0, 0);
lcd2.print("CODICE ERRATO");
lcd.setCursor(0, 0);
lcd.print("ACCESSO");
lcd.setCursor(0, 1);
lcd.print("NEGATO");
digitalWrite(14, LOW);
digitalWrite(12, LOW);
delay(250);
digitalWrite(14, HIGH);
digitalWrite(12, HIGH);
delay(250);
digitalWrite(14, LOW);
digitalWrite(12, LOW);
delay(250);
digitalWrite(14, HIGH);
digitalWrite(12, HIGH);
delay(250);
digitalWrite(14, LOW);
}
memset(codiceInserito, 0, sizeof(codiceInserito));
indiceCodice = 0;
mostraMessaggio = false;
lcd2.clear();
lcd.clear();
}
}
}
char risp = Serial.read();
if (risp == 'a') {
if (!mostraMessaggioRFID) {
lcd2.clear();
lcd2.setCursor(0, 0);
lcd2.print("TAG RFID");
lcd2.setCursor(0, 1);
lcd2.print("RILEVATO");
lcd.setCursor(0,0);
lcd.print("LETTURA TAG RFID");
lcd.setCursor(0,1);
lcd.print("IN CORSO...");
mostraMessaggioRFID = true;
}
delay(2000);
if (memcmp(mfrc522.uid.uidByte, uidObiettivo, 4) == 0 && mfrc522.uid.sak == sakObiettivo) {
lcd2.clear();
lcd2.setCursor(0, 0);
lcd2.print("TAG RFID");
lcd2.setCursor(0, 1);
lcd2.print("RICONOSCUTO");
delay(1000);
tone(15, 600, 500);
delay(300);
tone(15, 850, 500);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ACCESSO");
lcd.setCursor(0, 1);
lcd.print("CONSENTITO");
mioServo.write(180);
digitalWrite(12, LOW);
digitalWrite(11, HIGH);
delay(5000);
mioServo.write(0);
tone(15, 850, 500);
delay(300);
tone(15, 600, 500);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
lcd2.clear();
lcd.clear();
lcd2.clear();
mostraMessaggioCiao = true;
} else {
digitalWrite(14, LOW);
digitalWrite(12, LOW);
delay(250);
digitalWrite(14, HIGH);
digitalWrite(12, HIGH);
delay(250);
digitalWrite(14, LOW);
digitalWrite(12, LOW);
delay(250);
digitalWrite(14, HIGH);
digitalWrite(12, HIGH);
delay(250);
digitalWrite(14, LOW);
lcd2.clear();
lcd.clear();
}
mfrc522.PICC_HaltA();
if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
mostraMessaggioRFID = false;
mostraMessaggioIniziale = true;
return;
}
mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
}
if (!mostraMessaggio && !mostraMessaggioRFID) {
mostraMessaggioIniziale = true;
}
}