Premesso che non so esattamente quale libreria RFID stia utilizzando (e quindi esattamente che file RFID.h includa), ne ho trovata una che somiglia alla seguente URL:
https://community.particle.io/t/getting ... ved/3571/3
Rimossi i problemi legati all'inclusione di RFID.h, ottengo un messaggio di errore che allude ad una funzione
verificaCodice() che non sarebbe dichiarata nell'ambito della visibilita' (scope) di
loop(). Siccome a riga 78 trovo quello che sembrerebbe essere la funzione mancante, vado a contare le parentesi { } aperte e chiuse... In realta' sfrutto la IDE di Arduino e cliccando appena dopo la parentesi } che viene subito prima della dichiarazione della nostra funzione errante scopro (perche' me lo visualizza la IDE) che non corrisponde a quella di
loop() { ma bensi' a quella di
if (RC522.isCard()) {. Aggiungiamo una parentesi } chiusa subito prima della dichiarazione di
verificaCodice() e stiamo a vedere...
Un passo avanti lo si e' fatto, ora si lamenta che manca un ; nella parte di codice seguente:
Codice: Seleziona tutto
} else {
(stato == HIGH)
digitalWrite(rele, LOW);
Serial.println("spento");
e in effetti, dopo
(stato == HIGH) manca il punto e virgola di fine istruzione. PERO'... l'istruzione in questione non mi sembra corretta. L'operatore "==" realizza un CONFRONTO e non un'assegnazione. L'istruzione desiderata e' probabilmente
Quasi ci siamo. In realta' a pensarci bene abbiamo gia' cambiato il valore contenuto nella variabile
stato qualche riga prima, con la
stato = !stato; e quindi, secondo me, possiamo rimuovere completamente la riga incriminata
(stato == HIGH).
A questo punto c'e' un problema con la chiamata di
accendiLed(ledrosso); che sostiene di non conoscere questo fantomatico
ledrosso. A una prima occhiata ci sarebbe la riga 10 che dice
ma uno sguardo piu' attento evidenzia la lieve, ma significativa, differenza fra la dichiarazione di
ledRosso con la "R" maiuscola e l'utilizzo di
ledrosso con la "r" minuscopa. Mal di poco, cambiamo la chiamata in
accendiLed(ledRosso); con la maiuscola. E gia' che ci siamo, aggiungiamo un bel punto e virgola a terminare l'istruzione successiva che diventa
delay(2000);. E finalmente compila...
Sono a casa e la mia Signora non apprezza la presenza di Arduino sotto il tetto domestico per cui non posso mettere alla prova il programma, ma almeno adesso compila. Sperando di esserLe stato utile, mi sono accorto che forse e' meglio includere tutto il listato:
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)) {
Serial.println("Tessera autorizzata");
accendiLed(ledVerde);
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, String codiceAutorizzato) {
if (codiceLetto.equals(codiceAutorizzato)) {
return true;
} else {
return false;
}
}
// Questa funzione permette di accendere un LED per un determinato periodo
void accendiLed(int ledPin) {
digitalWrite(ledPin, HIGH);
delay(delayLed);
digitalWrite(ledPin, LOW);
}