Lezione 19: Come far interagire Arduino con il lettore

Transcript

Lezione 19: Come far interagire Arduino con il lettore
Lezione 19: Come far interagire
Arduino con il lettore RFID e MySQL
Nella scorsa lezione su Arduino, abbiamo visto come far interagire Arduino,
keypad e un server MySQL. Lo scopo del programma era quello di verificare se
un codice che viene digitato dal keypad è presente nel database e in caso
affermato può essere fatta un’operazione, come ad esempio accendere un
semplice LED, aprire una porta etc…
In modo molto analogo, in questa lezione vedremo come far leggere ad un
Arduino un tessera magnetica attraverso un lettore RFID, fare un query ad un
database MySQL per verificare se la tessera è valida oppure no.
Come abbiamo visto nella lezione dedicata al lettore RFID, è possibile usare
il lettore RFID-RC522 per poter leggere delle tessere magnetiche con Arduino.
La libreria ufficiale del dispositivo, permette di leggere il codice che è
formato da 4 parti, che possono essere memorizzate in un unica variabile di
tipo String (anche se non è il massimo per Arduino Uno) per usarla facilmente
nel nostro semplice programma.
Funzionamento del programma
L’utente passa la tessera magnetica bianca, oppure il portachiavi blu e il
lettore RFID è in grado di rilevare tale operazione ed avviare in Arduino le
operazioni necessarie per poter leggere il codice. Tale codice, che è salvato
in modo hardware nella nostra tessera, verrà mostrato nella seriale di
Arduino e salvato nella variabile String codiceLetto.
Come per il programma della lezione 17, dobbiamo seguire le seguenti
operazioni.
Prima di tutto è necessario crearsi una Schema all’interno del DB MySQL. Nel
mio caso l’ho chiamato Auth.
C’è solamente una table di nome Codes, che ha come attributi un solo elemento
che è Code, un elemento di tipovarchar(10), che è chiave primaria e deve non
deve essere nulla.
Per fare queste operazioni si può usare tranquillamente il MySQL Workbench,
che è un programma davvero semplice da usare.
Per maggiori informazioni riguardo a MySQL, vi consiglio di leggere questo
articolo.
Ed ecco il codice del programma per Arduino Uno/Arduino Mega che permette di
verificare la presenza di un codice della tessera magnetica letta con il
lettore RFID-.RC522, relativamente a quelle presenti nel DB MySQL:
/*
Questo programma permette di collegarsi ad un DB MySQL per verificare se il
codice della tessera magnetica è corretto
PINOUT:
RC522 MODULE
Uno/Nano
SDA
D10
SCK
D13
MOSI
D11
MISO
D12
IRQ
N/A
GND
GND
RST
D9
3.3V
3.3V
Autore Giacomo Bellazzi
Versione 1.0
*/
#include "SPI.h"
#include "Ethernet.h"
#include "sha1.h"
#include "mysql.h"
#include "RFID.h"
/* Vengono definiti PIN del RFID reader*/
#define SDA_DIO 10 // 53 per Mega
#define RESET_DIO 9
#define delayRead 1000 // Time of delay
#define LEDGREEN 13
#define LEDRED 12
/* Viene creata una istanza della RFID libreria */
RFID RC522(SDA_DIO, RESET_DIO);
byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server_addr(192, 168, 0, 2);
Connector my_conn;
char user[] = "username";
char password[] = "password";
char QUERY_POP[50] = "Select * From Auth.Codes as AK Where AK.Code='%s'";
char query[65];
void setup() {
Ethernet.begin(mac_addr);
Serial.begin(9600);
/* Abilita SPI*/
SPI.begin();
/* Viene inizilizzato RFID reader */
RC522.init();
pinMode(13,OUTPUT);
while (!Serial);
delay(1000);
Serial.println("Connecting...");
if (my_conn.mysql_connect(server_addr, 3306, user, password)){
Serial.println("Connected!");
} else {
Serial.println("Connection failed.");
}
}
void loop() {
/* Temporary loop counter */
byte i;
// Se viene letta una tessera
if (RC522.isCard())
{
// Viene letto il suo codice
RC522.readCardSerial();
String codiceLetto ="";
Serial.println("Codice delle tessera letto:");
// Viene caricato il codice della tessera, all'interno di una Stringa
for(i = 0; i <= 4; i++)
{
codiceLetto+= String (RC522.serNum[i],HEX);
codiceLetto.toUpperCase();
}
char charBuf[12];
codiceLetto.toCharArray(charBuf, 12);
Serial.println(codiceLetto);
if(isAuthorized(charBuf)){
Serial.println("Tessera autorizzata");
accendiLed(LEDGREEN);
}else{
Serial.println("Tessera non autorizzata");
accendiLed(LEDRED);
}
delay(delayRead);
}
}
// Controlla se un codice è autorizzato
boolean isAuthorized(char code[]){
sprintf(query, QUERY_POP,code);
my_conn.cmd_query(query);
my_conn.get_columns();
row_values *row = NULL;
int number = 0;
while (row = my_conn.get_next_row()) {
number++;
my_conn.free_row_buffer();
}
my_conn.free_columns_buffer();
if(number==0){
return false;
}else{
return true;
}
}
// Questa funzione permette di accendere un LED per un determinato periodo
void accendiLed(int ledPin){
digitalWrite(ledPin,HIGH);
delay(delayRead);
digitalWrite(ledPin,LOW);
}
Per poter mandare il esecuzione il programma, è necessario inserire username
a password del vostro DB MySQL. Poi è necessario inserire i codici delle
tessere magnetiche che si voglio autorizzare. Per farlo si può usare questa
query:
1INSERT
INTO Codes(Code) VALUES ('EC17832AF')