pr- controllo accessi via rfid, password e registrazione...

12
//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 del la 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).

Upload: vokien

Post on 23-Feb-2019

221 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: pR- controllo accessi via RFID, password e registrazione ...giocarduino.altervista.org/pR-apertura-porta-via-rfid-con... · Schema Programma /* ... Utilizzo di un lettore RFID, di

//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).

Page 2: pR- controllo accessi via RFID, password e registrazione ...giocarduino.altervista.org/pR-apertura-porta-via-rfid-con... · Schema Programma /* ... Utilizzo di un lettore RFID, di

//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

Page 3: pR- controllo accessi via RFID, password e registrazione ...giocarduino.altervista.org/pR-apertura-porta-via-rfid-con... · Schema Programma /* ... Utilizzo di un lettore RFID, di

//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.

Page 4: pR- controllo accessi via RFID, password e registrazione ...giocarduino.altervista.org/pR-apertura-porta-via-rfid-con... · Schema Programma /* ... Utilizzo di un lettore RFID, di

//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

Page 5: pR- controllo accessi via RFID, password e registrazione ...giocarduino.altervista.org/pR-apertura-porta-via-rfid-con... · Schema Programma /* ... Utilizzo di un lettore RFID, di

//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

Page 6: pR- controllo accessi via RFID, password e registrazione ...giocarduino.altervista.org/pR-apertura-porta-via-rfid-con... · Schema Programma /* ... Utilizzo di un lettore RFID, di

//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

Page 7: pR- controllo accessi via RFID, password e registrazione ...giocarduino.altervista.org/pR-apertura-porta-via-rfid-con... · Schema Programma /* ... Utilizzo di un lettore RFID, di

//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

Page 8: pR- controllo accessi via RFID, password e registrazione ...giocarduino.altervista.org/pR-apertura-porta-via-rfid-con... · Schema Programma /* ... Utilizzo di un lettore RFID, di

//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

Page 9: pR- controllo accessi via RFID, password e registrazione ...giocarduino.altervista.org/pR-apertura-porta-via-rfid-con... · Schema Programma /* ... Utilizzo di un lettore RFID, di

//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

}

Page 10: pR- controllo accessi via RFID, password e registrazione ...giocarduino.altervista.org/pR-apertura-porta-via-rfid-con... · Schema Programma /* ... Utilizzo di un lettore RFID, di

//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

Page 11: pR- controllo accessi via RFID, password e registrazione ...giocarduino.altervista.org/pR-apertura-porta-via-rfid-con... · Schema Programma /* ... Utilizzo di un lettore RFID, di

//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"));

Page 12: pR- controllo accessi via RFID, password e registrazione ...giocarduino.altervista.org/pR-apertura-porta-via-rfid-con... · Schema Programma /* ... Utilizzo di un lettore RFID, di

//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,

}

}