Codice: Seleziona tutto
#include <SPI.h>
#include "RFID.h" // #include "RFID.h" per me che ho aggiunto la libreriadirettamente al progetto
/* Vengono definiti PIN del RFID reader*/
#define SDA_DIO 10 // Pin 53 per Arduino Mega
#define RESET_DIO 9
#define delayRead 1000 // Tempo
#define delayLed 2000
#define ledVerde 3
#define ledRosso 4
#define rele 2
/* Viene creata una istanza della RFID libreria */
RFID RC522(SDA_DIO, RESET_DIO);
// inserire tutti i codici esadecimali delle schede magnetiche riconosciute
//String codiceAutorizzato1 = "AAC9411634";
//String codiceAutorizzato2 = "798D8C6E16";
//String codiceAutorizzato3 = "ESEMPIO480";
int stato = LOW;
void setup()
{
Serial.begin(9600);
/* Abilita SPI*/
SPI.begin();
/* Viene inizilizzato RFID reader */
RC522.init();
Serial.println("Setup");
pinMode(ledVerde, OUTPUT);
pinMode(ledRosso, OUTPUT);
pinMode(rele, OUTPUT);
digitalWrite(rele, LOW);
}
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();
}
Serial.println(codiceLetto);
// if (verificaCodice(codiceLetto, codiceAutorizzato1) || verificaCodice(codiceLetto, codiceAutorizzato2)
// || verificaCodice(codiceLetto, codiceAutorizzato3)) {
// Applichiamo un modesto cambiamento anche qui. Lasciamo che sia la funzione verificaCodice ad occuparsi della
// lista dei codici abilitati. In questo modo, se aggiungiamo o togliamo tessere dalla lista non dobbiamo mettere
// mano qui ma solo nella funzione dedicata.
if (verificaCodice(codiceLetto)) {
// Abbiamo riconosciuto la tessera, e' autorizzata!
Serial.println("Tessera autorizzata");
accendiLed(ledVerde);
// A questo punto invertiamo lo stato memorizzato.
// Ho commentato il codice preesistente per evidenziare i cambiamenti
stato = !(stato); // Devo invertire lo stato in ogni caso, tanto vale farlo subito
// a questo punto, la variabile "stato" dovrebbe rispecchiare lo stato desiderato del rele
// e quindi posso servirmene per assegnare al rele stesso il valore da assumere
digitalWrite (rele, stato);
// L'espressione che segue e' una "abbreviazione" molto usata dai programmatori in C per:
// if (stato == HIGH) {
// Serial.println("Acceso");
// } else {
// Serial.println("Spento");
// }
Serial.println((stato == HIGH) ? "Acceso" : "Spento");
delay(300);
// Abbiamo fatto tutto quello che volevamo fare nel caso di una tessera abilitata, ora
// passiamo a gestire il caso opposto
} else {
// NON tocchiamo assolutamente la variabile "stato" e il rele, dato che la tessera non e' abilitata
// ma limitiamoci a lampeggiare la luce rosso
accendiLed(ledRosso);
delay(2000);
} // Qui si chiude l'if (verificaCodice...)
} // Qui si chiude l'if (RC522.isCard())
} // e qui si chiude loop()
// Il codice "vecchio " segue
// if (rele == LOW) {
// stato = !stato;
// if (stato == LOW) {
// digitalWrite (rele, HIGH);
// Serial.println ("acceso");
// delay (300);
// } else {
// digitalWrite(rele, LOW);
// Serial.println("spento");
// delay(300);
// }
// }
// else {
// accendiLed(ledRosso);
// delay(2000);
// }
// }
// }
//}
// Questa funzione verifica se il codice Letto è autorizzato
boolean verificaCodice(String codiceLetto) {
// inserire tutti i codici esadecimali delle schede magnetiche riconosciute, in un vettore terminato da una stringa "*"
String codiciAutorizzati[] = { "AAC9411634", "798D8C6E16", "ESEMPIO480", "*" };
String terminatore = "*";
int indice = 0;
// Esaminiamo uno ad uno gli elementi dell'array di codici, fermandoci quando troviamo l'ultimo elemento, che e' "*"
while (!(terminatore.equalsIgnoreCase(codiciAutorizzati[indice]))) {
// Abbiamo riconosciuto il codice letto in uno di quelli autorizzati?
if (codiceLetto.equalsIgnoreCase(codiciAutorizzati[indice])) {
return true; // Si', possiamo restituire un valore affermativo
} else {
indice++; // No, incrementiamo indice per andare a guardare il prossimo elemento
} // Qui si chiude l'istruzione if (codiceLetto...)
} // Qui si chiude l'istruzione while()
return false; // Se siamo arrivati fin qui e' perche' NON abbiamo riconosciuto il codice letto in nessuno di quelli abilitati
}
// Questa funzione verifica se il codice Letto è autorizzato
//boolean verificaCodice(String codiceLetto, String codiceAutorizzato) {
// if (codiceLetto.equals(codiceAutorizzato)) {
// return true;
// } else {
// return false;
// }
//}
// Mi sono anche permesso di alterare la funzione accendiLed() per renderla piu' "simpatica"
// Primo cambiamento: il nome diventa lampeggiaLed() che riflette meglio quello che fa;
// Secondo cambiamento: ho aggiunto un parametro per la durata del lampeggio, per avere qualcosa
// di piu' "generale" e riutilizzabile;
// Ci starebbe bene anche una verifica che il pin sia effettivamente stato definito come uscita,
// ma e' laborioso e richiede di andare a "frugare" nei registri del processore, per cui per ora no.
void lampeggiaLed(int ledPin, unsigned long durata) {
// Diamoci un limite di 5 secondi alla durata del lampeggio per evitare di stare ad aspettare
// per sempre nel caso di un errore "di sbaglio" a selezionare il parametro, e ricordiamoci che
// la funzione delay() e' stata scritta dal Diavolo per farci ammattire!
const unsigned long DURATAMAX = 5000UL;
if (durata > DURATAMAX) {
durata = DURATAMAX;
}
digitalWrite(ledPin, HIGH);
delay(durata);
digitalWrite(ledPin, LOW);
}
// Questa funzione permette di accendere un LED per un determinato periodo
void accendiLed(int ledPin) {
digitalWrite(ledPin, HIGH);
delay(delayLed);
digitalWrite(ledPin, LOW);
}