pr- controllo accessi via rfid, password e registrazione...
TRANSCRIPT
//Arduino: controllo accessi via RFID, psw e registrazione su SD – Access control, via RFID, psw and datalog // mifare rc522, secure digital, password, keypad
pR- controllo accessi via RFID, password e registrazione su SD Access control via rfid, password and datalog (notes at section end)
Questo sistema consente di aprire una porta (o meglio di attivare un rele’ per 3 secondi, e quindi per il tempo sufficiente per sbloccare una serratura elettrica) tramite una tessera RFID ed una password di 4 cifre. Ogni evento viene registrato, insieme alla data ed all’ora, su di una scheda Secure Digital. Il sistema e’ composto da un’antenna che intercetta i codici della scheda RFID, un display lcd da due righe di 16 caratteri, un tastierino numerico per la digitazione della password e da un data logger dotato di un orologio in tempo reale del tipo DS3231. Nell’esempio al posto del rele’ e’ stato utilizzato un led verde che, in caso di tessera RFID valida e password corretta, si accende per tre secondi. Nulla osta ovviamente che al suo posto possa essere utilizzato un rele’ collegato alla serratura elettrica della porta che si vuole aprire. Maggiori dettagli sulle caratteristiche e sull’utilizzo di ogni singolo componente sono reperibili qui: lcd con I2C: http://giocarduino.altervista.org/e18bis-display-lcd-2-porte.pdf antenna rfid: http://giocarduino.altervista.org/e36-striscia-la-scheda-apri-la-porta-lettore-schede-rfid.pdf secure digital http://giocarduino.altervista.org/e43-securedigital-SD-Arduino.pdf orologio digitale http://giocarduino.altervista.org/e44-RTC-DS3231-orologio-digitale.pdf
Per il settaggio dell’orologio in tempo reale, da farsi una sola volta e poi solo se si scarica la pila di cui e’ dotato, bisogna utilizzare, con l’hardware di questo progetto, il programma e le librerie presenti nella scheda descrittiva del progetto 44, orologio digitale (linkata qua’ sopra).
//Arduino: controllo accessi via RFID, psw e registrazione su SD – Access control, via RFID, psw and datalog // mifare rc522, secure digital, password, keypad
Gli eventi registrati su Secure Digital possono essere scaricati su di un foglio excell per eventuali analisi del flusso degli accessi e dei tentativi di accesso non riusciti. Sotto il profilo tecnico la parte piu’ interessante sembra essere l’utilizzo del bus SPI da parte di due “utenti” e cioe’ dalla stazione di lettura/scrittura della scheda SD e dal lettore RFID. In questo caso sono stati messe in comune le connessioni SCK, MOSI e MISO mentre la connessioni CS (o SS) sono state dirottate su due differenti pin. Sempre sotto il profilo tecnico il programma ha quasi saturato la zona che Arduino Uno rende disponibile per la memorizzazione delle variabili, per cui, con alcuni artifizi, sono stati previsti “alloggiamenti” per sole 40 schede rfid. Qualora fosse necessario utilizzare un maggior numero di schede si dovra’ ricorrere ad Arduino mega 2560, che dispone di una capacita’ di memorizzazione
di gran lunga superiore (dovra’ pero’ variare sia il programma che lo schema della connessioni). La password di ogni scheda, sempre per ragioni di “risparmio” della memoria delle variabili, puo’ assumere un valore che va da 0 a 255 e deve essere sempre inserita su tre cifre (ad esempio la password “12” deve essere inserita nella forma “012”. Prima di procedere alla compilazione del programma devono essere installate, se non gia’ presenti, le seguenti librerie:
ds3232rtc.h reperibile qui.
time.h reperibile qui
LiquidCrystal_I2C.h reperibile qui
MFRC522.h reperibile qui Deve anche essere installata, se non gia’ fatto, anche la libreria keypad.h, presente nel repository librerie dell’IDE.
Per installare una libreria e’ necessario seguire la procedura illustrata nei precedenti progetti, e sintetizzabile in:
download della libreria in formato complesso
installare la nuova libreria andando in IDE-> sketch-> includes Library-> add .zip library
verificare l’avvenuta installazione (andando in IDE-> sketch-> includes Library-> Contributed library)
Al termine della compilazione dovrebbe apparire una segnalazione di questo genere:
Si tratta di un avvertimento che, in questo caso, sembra privo di impatti sul funzionamento del dispositivo
//Arduino: controllo accessi via RFID, psw e registrazione su SD – Access control, via RFID, psw and datalog // mifare rc522, secure digital, password, keypad
Nota: Questo esercizio e questa nota sono parte di una serie che vede protagonisti Arduino ed alcuni dei componenti ad esso collegabili. Per la maggior parte degli esercizi e’ anche disponibile un filmato su youtube.
Esercizi facenti parte della raccolta
Filmati presenti su youtube
Informazioni su arduino e sui componenti collegabili (PDF scaricato nell’area di download)
Breve manuale di programmazione (PDF scaricato nell’area di download) Per eventuali chiarimenti o suggerimenti sul contenuto di questa scheda scrivere a [email protected]
Here some notes about this project, translated by google translator This system allows you to open a door (or rather to activate a relay for 3 seconds, and therefore sufficient time to unlock an electrical lock) through an RFID card and a four digit password. Each event is recorded, along with the date and time, on a secure digital card. The system consists of an antenna that intercepts the card's codes, a 16-character on two rows lcd display, a numeric keypad, and a data logger with a real-time clock ( DS3231 type) . In the prototype, a green led is lit for three seconds if valid rfid card and correct password are found. Instead a led you can use a rele’ connected to door that you want to control.
Here more details about each component: lcd and I2C: http://giocarduino.altervista.org/e18bis-display-lcd-2-porte.pdf rfid antenna: http://giocarduino.altervista.org/e36-striscia-la-scheda-apri-la-porta-lettore-schede-rfid.pdf secure digital http://giocarduino.altervista.org/e43-securedigital-SD-Arduino.pdf digital clock: http://giocarduino.altervista.org/e44-RTC-DS3231-orologio-digitale.pdf
To set the digital clock (only once, at the first use or when if you download battery from datalogger), you can use the hardware of this project, to runs program and libraries of project e44-RTC-DS3231, linked above. Events recorded on Secure Digital can be downloaded on an excel sheet for any furter uses From a technical point of view, the most interesting part of this project seems to be the use of the SPI bus by two "users", namely the S.D. station and the RFID antenna. In this case, the SCK, MOSI and MISO connections were merged while the CS (or SS) connections were diverted to two different pins (see also the connections diagram). Always from a technical point of view, the program has almost saturated the area that Arduino Uno makes available for storing variables, so were provided "slots" for only 40 rfid cards. If you need to use more cards you must use an Arduino mega 2560, that has a much higher storage capacity. Password of each card can assume a value ranging from 0 to 255 and must always be entered in three digits (for example, 12 must be input as 012.
//Arduino: controllo accessi via RFID, psw e registrazione su SD – Access control, via RFID, psw and datalog // mifare rc522, secure digital, password, keypad
Before proceeding to program compilation must be installed, if not already done, the libraries:
ds3232rtc.h found here.
time.h found here
LiquidCrystal_I2C.h found here
MFRC522.h found here You must install also the keypad.h library, already in IDE "library manager" but not yet installed
For library installation, see process shown in previous projects, and summarized in:
library download in compressed form;
Installation via IDE-> sketch-> includes Library-> add .zip library
After installation please verify the library. It must be present in IDE-> sketch-> includes Library-> Contributed library
At compilation end, such a report should appear:
Is a warning that, in this case, seems have no impact on system Note: This project and this note is part of a series that sees, as main characters, Arduino and some of connectable components. For most projects there is also a video on youtube.
Projects collection
Movies on youtube
About Arduino and components (italian; pdf will be downloaded in your download area
Quick programming guide (almost english; pdf will be downloaded in your download area) For any questions or suggestions about this note (and on its english translation), please write to [email protected] (simple words and short sentences, please)
Materiali Un datalogger (un registratore di schede SD)
Un sistema RTC (real time clock), se non gia’ presente sul datalogger
Un’antenna RFID del tipo Mifare RC522
Una tastiera numerica da 12 tasti
Un display LCD 1602 con driver I2C
Un rele’
Due led (uno verde ed uno rosso)
Due resistenza da 220 ohm da associare ai led
//Arduino: controllo accessi via RFID, psw e registrazione su SD – Access control, via RFID, psw and datalog // mifare rc522, secure digital, password, keypad
Schema
Programma
/*
Attenzione: facendo il copia/incolla dal PDF all’IDE si perde la formattazione del testo. Per
rendere piu’ facilmente leggibile il programma e’ opportuno formattarlo subito dopo il
trasferimento nell’IDE, premendo CTRL+T.
Utilizzo di un lettore RFID, di un display 1602, di un datalogger e di un tastierino numerico
per un impianto di apertura porte, con password e registrazione accessi
Prima di compilare il programma scaricare ed installare, se non gia' fatto, le seguenti librerie:
- driver I2C del display: https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
- lettore di schede rfid: https://github.com/miguelbalboa/rfid
- libreria DS3232RTC: http://github.com/JChristensen/DS3232RTC
- timelib: http://playground.arduino.cc/Code/Time
- libreria keypad.h, presente nel "library manager" dell'IDE ma non ancora installata (da
installare tramite il library manager)
collegamento del lettore/registratore di Secure Digital dotato di RTC
..........arduino uno.....Arduino mega
GND ......non usato........non usato
MISO .........12 ...............50
SCK .........13 ...............52
MOSI .........11 ...............51
CS........... 10 ...............53
3.3v .....non usato ........non usato
GND ..........GND ..............GND
//Arduino: controllo accessi via RFID, psw e registrazione su SD – Access control, via RFID, psw and datalog // mifare rc522, secure digital, password, keypad
+5V ..........5v ...............5v
collegamento del display lcd con driver I2C
GND..........GND ..............GND
VCC .........5v ...............5v
SDA .........A4 ...............20
SCL .........A5 ...............21
collegamento della scheda RFID
pin Arduino Arduino Arduino Arduino Arduino
Segnale MFRC522 Uno Mega Nano v3 Leonardo/Micro Pro Micro
RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
SPI SS SDA(SS) 15* 53 D10 10 10
SPI MOSI MOSI 11 51 D11 ICSP-4 16
SPI MISO MISO 12 50 D12 ICSP-1 14
SPI SCK SCK 13 52 D13 ICSP-3 15
la porta digitale 15 di arduino corrisponde alla porta analogica A1
----------------------------------------------------------------------------------------
Warning: cut&paste from PDF to IDE loses formatting. to restore it press CTRL + T.
Use RFID station, a rele', a display 1602, a data logger a keypad and a password
for an access control system
before compile program you must download and istall the following libraries:
- driver I2C: https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
- rfid: https://github.com/miguelbalboa/rfid
- DS3232RTC: http://github.com/JChristensen/DS3232RTC
- timelib: http://playground.arduino.cc/Code/Time
- keypad.h; already in IDE's "library manager", but not yet installed
datalogger (with RTC)connection:
..........arduino uno.....Arduino mega
GND .......not used.........not used
MISO .........12 ...............51
SCK .........13 ................52
MOSI .........11 ...............50
CS........... 10 ...............53
3.3v .....not used .........not used
GND ..........GND ..............GND
+5V ..........5v ...............5v
Connection on display 1602 with I2C driver
GND..........GND ..............GND
VCC .........5v ...............5v
SDA .........A4 ...............20
SCL .........A5 ...............21
RFID connection
pin Arduino Arduino Arduino Arduino Arduino
MFRC522 Uno Mega Nano v3 Leonardo/Micro Pro Micro
RST/Reset RST 9 5 D9 RESET/ICSP-5 RST
SPI SS SDA(SS) 15* 53 D10 10 10
SPI MOSI MOSI 11 51 D11 ICSP-4 16
SPI MISO MISO 12 50 D12 ICSP-1 14
SPI SCK SCK 13 52 D13 ICSP-3 15
arduino digital pin 15 is also the analogic pin A1
------------------------------------------------------------------------------------
*/
#include <DS3232RTC.h> // http://github.com/JChristensen/DS3232RTC
#include <TimeLib.h> // http://playground.arduino.cc/Code/Time
#include <LiquidCrystal_I2C.h> // https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads
#include <SPI.h> // libreria spi, presente nell'IDE /spi library, found in IDE
#include <SD.h> // libreria SD, presente nell'IDE / SD library, found in IDE
#include <MFRC522.h> // https://github.com/miguelbalboa/rfid
#include <Keypad.h> // installare dal repository IDE / to intall form IDE repository
#include <Wire.h> // libreria wire presente, nell'IDE /wire library, found in IDE
File filesd;
// parametri per la gestione del display / lcd parameters:
// . . . . . . . . . addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
time_t t;
tmElements_t tm;
#define RST_PIN 9
//Arduino: controllo accessi via RFID, psw e registrazione su SD – Access control, via RFID, psw and datalog // mifare rc522, secure digital, password, keypad
#define SS_PIN 15 // pin sda della rfid, porta 15 (porta A1) /sda pin, to arduino pin 15 (A1)
#define rele 14 // rele', porta 14 (A0 di arduino) / relays to pin 14 (Arduino A0)
#define ledverde 16 // led verde, porta 16 (A2) / green led, to Arduino pin 16 (pin A2)
#define ledrosso 17 // led rosso, porta 17 (A3) / red led, to Arduino pin 7 (A3)
//
MFRC522 mfrc522(SS_PIN, RST_PIN); // Crea l'"oggetto" MFRC522 / create the MFRC522 object
//
const byte righe = 4; // numero di righe della tastiera (quattro) /row on keyboard (4)
const byte colonne = 3; // numero di colonne della tastiera (tre) / column on keyboard (3)
char chiave[righe][colonne] = { /* tabella di trascodifica dei tasti battuti.
la tabella riproduce, su quattro righe di tre colonne, la posizione dei tasti e assegna ad ogni
tasto il valore che gli compete. E'possibile assegnare valori diversi semplicemente modificando i
singoli valori in tabella / transcoding array. Ii reproduces, on four rows of three columns, the
position of keys on keyboard; program assign to each key the value that belongs to it. It is
possible to assign different values simply by changing the individual values in the array */
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'},
{'*', '0', '#'}
};
byte pinrighe[righe] = {8, 7, 6, 5}; /*porte cui sono connessi i pin delle righe della tastiera
(i primi quattro pin di sinistra del connettore) / ports to which the keyboard row pins are
oonnected (first four left pins on connector)*/
byte pincolonne[colonne] = {4, 3, 2}; /*porte cui devono essere connessi i pin delle colonne (gli
ultimi tre pin di destra) della tastiera / ports to which the keyboard columns pins are connected
(last three pins on connector)*/
/*prossima riga: assegnazione dei parametri alla libreria keypad.h / next line: assign parameters to
keypad library */
Keypad keypad = Keypad( makeKeymap(chiave), pinrighe, pincolonne, righe, colonne );
char tastobattuto; // carattere battuto / beaten key
byte codice [5]; // codice scheda RFID / code on rfid card
byte semaforo = 0; // 0=nessuna scheda, 1=scheda letta / 0 = no car readed; 1= card readed
byte semaforoval = 0; // gestione routine di lettura / reading routine management
byte valore = 0; // password battuta sulla tastiera / password beaten on keyboard
byte moltiplicatore = 0; // utilizzato nel calcolo del valore battuto /used in value computing
byte indice = 0; // utilizzato nel calcolo del valore battuto /used in value computing
byte tabnum [4]; // tabella dei singoli tasti battuti /beated keys storage
byte indtab = 0; // indice di scorrimento della tabella tabnum / tabnum index
byte indicetab = 0; // indice della tabella codici schede /card codes array index
byte digits = 0; // minuti e secondi da esporre sul display lcd /time to display on lcd
byte mese = 0; // zona di memorizzazione del mese corrente / current month
byte secondoprec = 0; // secondo evidenziato su display lcd /second on lcd
byte passwordok = 0; /* esito controllo password: 0 = password errata, accesso rifutato; 1 =
password accettata, accesso consentito / password check: 0= wrong password; 1 = right passo word */
byte i = 0; // indice utilizzato nei cicli di for / generic “for” index
byte passw = 0; // password della scheda appena letta / password of the readed card
byte semaforotab = 0; // usato nella routine di lettura scheda /used in card reading routine
char barra = '/'; // costante utilizzato in diverse punti del programma / constant
char duepunti = ':'; // costante utilizzato in diverse parti del programma / constant
char virgola = ','; // costante utilizzata in diverse parti del programma / constant
int tempolettura = 3000;// tempo di lettura del messaggio su lcd (3 sec.) /time to read lcd msg
/*
Le prossime due tabelle (tabellacodici e tabellapsw) sono tabelle parallele, utilizzano cioe' il
medesimo indice. La prima e' utilizzata per verificare la validita' o meno di una scheda mentre la
seconda, fornisce, a parita' di indice di tabellacodici, la password cui e' associata.
Se, ad esempio, i codici della scheda letta corrispondono ai codici del terzo elemento in
tabellacodici, la password inserita deve corrispondere alla pasword presente nel terzo elemento
della tabellapsw.
----------------------------------------------------------------------------------------------------
The next two array (tabellacodici and tabellapsw) are parallel tables, using the same index. The
first one is used to verify whether or not a card is valid, while the second one provides the
password to which it is associated. For example, if a RFID code match the codes of the third
element in tabellacodici, the password entered must match the value stored in the third element in
tabellapsw.
*/
byte tabellacodici [161] = /* tabella dei codici delle schede valide (valori ascii) - devono essere
esattamente 40 schede, 160 numeri; attenzione alle virgole / valid cards array (ascii values) - must
be exactly 40 rows, 160 numbers; attention to commas */
{
0, 0, 0, 0, // <-- inserire i codici della prima scheda valida / codes of first valid card 0, 0, 0, 0, // <-- inserire i codici della seconda scheda valida /codes of second valid card
0, 0, 0, 0, // <-- inserire i codici della terza scheda valida
0, 0, 0, 0, // <-- inserire i codici della quarta scheda valida
0, 0, 0, 0, // <-- inserire i codici della quinta scheda valida
0, 0, 0, 0, // 6
0, 0, 0, 0, // 7
//Arduino: controllo accessi via RFID, psw e registrazione su SD – Access control, via RFID, psw and datalog // mifare rc522, secure digital, password, keypad
0, 0, 0, 0, // 8
0, 0, 0, 0, // 9
0, 0, 0, 0, // 10
0, 0, 0, 0, // 11
0, 0, 0, 0, // 12
0, 0, 0, 0, // 13
0, 0, 0, 0, // 14
0, 0, 0, 0, // 15
0, 0, 0, 0, // 16
0, 0, 0, 0, // 17
0, 0, 0, 0, // 18
0, 0, 0, 0, // 19
0, 0, 0, 0, // 20
0, 0, 0, 0, // 21
0, 0, 0, 0, // 22
0, 0, 0, 0, // 23
0, 0, 0, 0, // 24
0, 0, 0, 0, // 25
0, 0, 0, 0, // 26
0, 0, 0, 0, // 27
0, 0, 0, 0, // 28
0, 0, 0, 0, // 29
0, 0, 0, 0, // 30
0, 0, 0, 0, // 31
0, 0, 0, 0, // 32
0, 0, 0, 0, // 33
0, 0, 0, 0, // 34
0, 0, 0, 0, // 35
0, 0, 0, 0, // 36
0, 0, 0, 0, // 37
235, 21, 13, 0, // <-- trentottesima scheda valida / thirty-eighth valid card
232, 118, 45, 0, // <-- trentanovesima scheda valida / thirty-nine valid card
193, 204, 154, 189,// <-- quarantesima scheda valida / fortieth valid card
};
byte tabellapsw [41] = /* tabella della password, sincrona con la tabella dei codici- esattamente
40 numeri di valore variabile da 0 a 255, attenzione alle virgole / password array, synchronous with
tabellacodici array - exactly 40 numbers ranging from 0 to 255, pay attention to commas. */
{
0, // <-- psw (da 0 a 255) della prima scheda in tabellacodici /psw first card in above array
0, // <-- psw (da 0 a 255) seconda scheda in tabellacodici / psw second card in above array
0, // <-- inserire la psw (valore fino a 255) della terza scheda in tabellacodici
0, // <-- inserire la psw (valore fino a 255) della quarta scheda in tabellacodici
0, // <-- inserire la psw (valore fino a 255) della quinta scheda in tabellacodici
0, // 6
0, // 7
0, // 8
0, // 9
0, // 10
0, // 11
0, // 12
0, // 13
0, // 14
0, // 15
0, // 16
0, // 17
0, // 18
0, // 19
0, // 20
0, // 21
0, // 22
0, // 23
0, // 24
0, // 25
0, // 26
0, // 27
0, // 28
0, // 29
0, // 30
0, // 31
0, // 32
0, // 33
0, // 34
0, // 35
0, // 36
0, // 37
123, // <-- psw della trentottesima scheda in tabella codici / psw for the thirty-eighth card
253, // <-- psw della trentanovesima sk in tabella codici / psw for the thirty-eighth card
162, // <-- psw della quarantesima scheda in tabella codici / psw for the fortieth card
//Arduino: controllo accessi via RFID, psw e registrazione su SD – Access control, via RFID, psw and datalog // mifare rc522, secure digital, password, keypad
};
//
//*****routine di ricezione dei caratteri da tastiera e loro trasformazione in valori ****
//*********** receives data from keypad and transforms them in a value ********************
//
void ricevivalore (void)
{
valore = 0;
semaforoval = 0;
for (indtab = 0; indtab < 4; indtab++) // azzera la tabella dei valori /clean tabnum
tabnum[indtab] = 0;
indtab = 0;
while (semaforoval == 0) // loop di ricezione dati / data receiving loop
{
tastobattuto = keypad.getKey(); /* acquisisce il valore del tasto battuto (gia' trascodificato
dalla tabella chiave) / acquire value of beaten key (already transcoded by the chiave array) */
if (tastobattuto) // se e' stato battuto un tasto / if a key was beated
{
delay (100); // attende 1/10 di sec. per evitare una doppia battuta /wait 1/10 sec.
lcd.print (F("*")); // visualizza un "*" sul display lcd / display an “*”
if ((tastobattuto >= '0') && (tastobattuto <= '9'))
{
tabnum [indtab] = tastobattuto - 48; /* memorizza il valore battuto, un numero da 0 a 9 /
memorize the beat value, transformed into a number from 0 to 9 (ascii code – 48) */
indtab++;
if (indtab == 3)
semaforoval = 1; // esce dal loop di ricezione dati /exit from data receiving loop
}
}
}
// ********* trasforma le singole cifre battute in un numero unico ******
// ******* transforms the single beaten numbers into a unique value *****
//
moltiplicatore = 1;
for (indice = indtab; indice > 1; indice--)
moltiplicatore = moltiplicatore * 10;
for (indice = 0; indice <= indtab; indice++)
{
valore = valore + tabnum[indice] * moltiplicatore;
moltiplicatore = moltiplicatore / 10;
}
}
//
// ******** routine di controllo validita scheda e password ********************
// ********** validity check (card & password) routine *************************
void controllapsw (void)
{
lcd.setCursor (0, 1);
lcd.print (F("password: "));
ricevivalore (); // lancia routine ricezione dei tasti battuti /launches data receiving routine
//
// *** verifica la validita' della scheda letta e, se valida, controlla la password ***
// ********************* check rfid code and password *********************************
//
passwordok = 0; // inserisce inizialmente zero in passwordok /clean passwordok
for (indicetab = 0; indicetab < 40; indicetab++) /* scorre la tabella delle schede valide /check
on valid card array */
{
semaforotab = 1; // pone preventivamente a 1 un semaforo
for (i = 0; i < 4; i++) /* verifica, carattere per carattere, se il codice letto
corrisponde al codice valido memorizzato nell'elemento in esame della tabellacodici / verifies,
character by character, if the readed code corresponds to the code in the element under examination
*/
{
if (! (codice [i] == tabellacodici [indicetab * 4 + i])) /* se il carattere letto non e' in
tabella codici / if the readed character don’t match in tabella codici */
semaforotab = 0; /* la scheda non e' in tabella codici / the readed card is not
present in tabella codici */
}
if (semaforotab == 1) // se il semaforo vale 1 (se la scheda e' in taballecodici) / if card is
// in tabellacodici
{
passw = tabellapsw [indicetab]; // memorizza la password corrispondente alla scheda letta /
// store the card password
if ((valore == passw) && (semaforotab == 1)) //se la scheda e la password sono validi / if
// card and password are valid
passwordok = 1; // setto il semaforo di scheda e password ok / set 1 to card ok
}
//Arduino: controllo accessi via RFID, psw e registrazione su SD – Access control, via RFID, psw and datalog // mifare rc522, secure digital, password, keypad
}
}
//
//********* routine di esposizione di data, ora sul display lcd ****
// ********************** show time on lcd ***********************
//
void esponidata()
{
// esposizione dei dati provenienti dal timer di arduino /shows data from arduino timer
lcd.clear();
lcd.setCursor(3, 0);
lcd.print(day());
lcd.print (barra);
lcd.print(month());
lcd.print(barra);
lcd.print(year());
}
//
// ************ routine di esposizione dell'ora ************
// ************** hour exposition routine **************
//
void esponiora ()
{
if (!((second ()) == secondoprec));
{
secondoprec = (second ());
lcd.setCursor(3, 1);
lcd.print(hour());
lcd.print(duepunti);
digits = (minute());
printDigits(); // routine esposizione zeri non significativi / non significant zeroes
lcd.print(duepunti);
digits = (second());
printDigits();
lcd.print(F(" "));
}
}
//
//****routine visualizzazione minuti e secondi comprensivi di zeri non significativi********
// ***** minutes and seconds, with non significant zeros treatment *************************
//
void printDigits()
{
if (digits < 10)
lcd.print('0');
lcd.print(digits);
}
//
//********************** routine di scrittura su secure digital **************************
// ************************* record on secure digital *****************************
//
void scrivi ()
{
filesd = SD.open("accessi.txt", FILE_WRITE); //File in scrittura / open writing mode
if (filesd) // Se il file è stato aperto correttamente / if sd ok
{
filesd.print(year()); //write year on sd
filesd.print(barra); // write “/” on sd
filesd.print(month()); //write month on sd….
filesd.print(barra);
filesd.print(day());
filesd.print(virgola);
filesd.print(hour());
filesd.print(duepunti);
filesd.print(minute());
filesd.print(duepunti);
filesd.print(second());
filesd.print(virgola);
for (i = 0; i < 4; i++)
{
filesd.print (codice [i]);
filesd.print (" ");
}
filesd.print (virgola);
filesd.print (passwordok);
filesd.println (virgola);
filesd.close(); // Chiude il file su sd / close file on sd
//Arduino: controllo accessi via RFID, psw e registrazione su SD – Access control, via RFID, psw and datalog // mifare rc522, secure digital, password, keypad
lcd.clear ();
lcd.print (F("registrato")); // “written on sd”
delay (tempolettura);
lcd.clear ();
}
else
{
lcd.clear ();
lcd.print (F("errore SD")); // “sd error”
delay (tempolettura);
lcd.clear ();
}
}
//
// routine di lettura della scheda SD
// ********* open sd card ***********
//
void leggischeda ()
{
codice [0] = 0; /* azzera il primo codice della zona di memorizzazione della scheda rfid /clean
the first code in codice array */
if ( ! mfrc522.PICC_IsNewCardPresent()) // verifica se c’e’una scheda vicina al lettore /
// verifies if there is a card near the antenna
{
return; // ricomincia il loop se non c'e' una scheda / restart loop is there is not a card
}
if ( ! mfrc522.PICC_ReadCardSerial()) // se intercetta una scheda, verifica che sia una RC522 if
// there is a card, check if is a RC522 card
{
return; // ricomincia il loop se non e' una RC522 / restart loop if is not a RC522 card
}
lcd.clear ();
for (i = 0; i < 4; i++) // loop di acquisizione dei codici scheda / card code acquiring loop
{
lcd.print (mfrc522.uid.uidByte[i]); /* visualizza il codice della scheda letta (valore ascii
dei quattro caratteri identificativi della scheda) / display card code (four Ascii characters) */
lcd.print (" ");
codice [i] = mfrc522.uid.uidByte[i]; // memorizza il codice appena letto / store readed code
semaforo = 1; // segnala che e' stata letta una scheda / 1 in switch “card readed”
}
}
//
//
void setup()
{
Serial.begin (9600); // inizializza la comunicazione seriale /start serial communication
lcd.begin(16, 2); // inizializza il display (16 caratteri per 2 righe) / start display
SPI.begin(); // Inizializza il bus SPI / start spi bus
mfrc522.PCD_Init(); // Inizializza il lettore MFRC522 / start MFRC522 reader
lcd.backlight(); // illumina lo sfondo del display /back light on lcd
lcd.setCursor(0, 0); // posiziona il cursore all'inizio della prima riga
lcd.print (F("buongiorno")); // good day
delay (tempolettura / 2);
lcd.clear ();
lcd.setCursor(0, 0); // posiziona il cursore all'inizio della prima riga
setSyncProvider(RTC.get); // sincronizza il timer di Arduino con i dati presenti
//sul modulo RTC (prende da RTC data ed ora correnti) / syncronizes Arduino with RTC data
lcd. clear ();
lcd.print (F("orologio "));
if (timeStatus() != timeSet) // verifica se la sincronizzazione e' andata a buon fine /
// verifies if time sync is ok
lcd.print (F("non")); // clock not
lcd.setCursor (0, 1);
lcd.print (F("sincronizzato")); // syncronized
delay (tempolettura);
esponidata ();
esponiora ();
delay (tempolettura);
lcd.clear ();
pinMode (10, OUTPUT); // il pin CS dell'antenna alla porta 10 / Antenna CS pin to port 10
pinMode (rele, OUTPUT); // il pin 14 (rele) e' definito output / pin 14 relays as output
pinMode (ledverde, OUTPUT); // pin 16 /green led
pinMode (ledrosso, OUTPUT); // pin 17 red led
lcd.clear ();
lcd.print (F("apertura SD")); // SD opening
if (!SD.begin(10)) // verifica presenza secure digital / check if there is a sd station
{
lcd.print (F (" KO"));
//Arduino: controllo accessi via RFID, psw e registrazione su SD – Access control, via RFID, psw and datalog // mifare rc522, secure digital, password, keypad
}
else
{
lcd.print (F(" OK"));
}
delay (tempolettura);
lcd.clear ();
}
//
//
void loop()
{
lcd.print (F("striscia scheda")); // “approach card to antenna”
semaforo = 0; // si pone in attesa di una nuova scheda / looking for a new card
esponiora ();
leggischeda (); // legge una scheda - reads an RFID card
if (semaforo == 1) // se e' stata letta una scheda - if a rfid card was found
{
controllapsw (); // lancia la routine di controllo della password - check password
lcd.clear ();
if (passwordok == 1)
{
digitalWrite (rele, HIGH); // attiva il rele - rele' turn on
digitalWrite (ledverde, HIGH);
lcd.print (F("apertura porta")); // door opening
}
else
{
lcd.print (F("errore rfid/psw")); // rfid/password error
digitalWrite (ledrosso, HIGH);
}
delay (tempolettura);
lcd.clear();
digitalWrite (rele, LOW); // disattiva il rele' - rele' turn off
digitalWrite (ledverde, LOW);
digitalWrite (ledrosso, LOW);
scrivi (); // salva i dati su secure digital - save card code on sd, along with date and time,
}
}