sketch rfid
sketch rfid
Salve, un saluto a tutti e grazie per avermi accettato nel forum, volevo un aiuto in merito ad uno sketch che sto facendo, non voglio lo sketch pronto ma capire come fare, semplicemente vorrei accendere e spegnere un led con la tessera rfid corretta,si accende al primo passaggio e si spegne al secondo, ora la mia domanda é questa... Se con un semplice pulsante leggo lo stato del pulsante con digitalRead, nel mio caso dovrei cambiare lo stato del led solo se il codice é autorizzato,quindi al posto di if (digitalRead,led.... Cosa uso? Grazie in anticipo se poi devo postare lo sketch come faccio?
Re: sketch rfid
Buona sera,
direi che dipende un pochino dal lettore RFID e dalla specifica libreria, comunque le carte RFID (e le "medagliette RFID...) hanno un identificatore UID che permette di riconoscerle l'una dall'altra (altrimenti bel lavoro, ne basterebbe una qualsiasi per aprire qualsiasi porta). Occorrera' quindi un lavoro iniziale per determinare la o le UID della/e carta/e RFID a cui si vuole consentire di accendere il LED, dopo di che bastera' da programma aspettare che il lettore "veda" una carta RFID e ne legga l'identificatore UID e poi confrontarlo con quello (o quelli) ammessi all'operazione del LED.
In caso affermativo, si legge lo stato del LED da una variabile "memoria", lo si inverte e si applica il nuovo stato al LED per poi tornare in attesa di un nuovo passaggio di carta RFID; in caso negativo, si ignora accuratamente la "strisciata" e si continua ad aspettare. Qualcosa tipo (tenendo conto che non so quale lettore e quindi quale libreria RFID stia utilizzando):
direi che dipende un pochino dal lettore RFID e dalla specifica libreria, comunque le carte RFID (e le "medagliette RFID...) hanno un identificatore UID che permette di riconoscerle l'una dall'altra (altrimenti bel lavoro, ne basterebbe una qualsiasi per aprire qualsiasi porta). Occorrera' quindi un lavoro iniziale per determinare la o le UID della/e carta/e RFID a cui si vuole consentire di accendere il LED, dopo di che bastera' da programma aspettare che il lettore "veda" una carta RFID e ne legga l'identificatore UID e poi confrontarlo con quello (o quelli) ammessi all'operazione del LED.
In caso affermativo, si legge lo stato del LED da una variabile "memoria", lo si inverte e si applica il nuovo stato al LED per poi tornare in attesa di un nuovo passaggio di carta RFID; in caso negativo, si ignora accuratamente la "strisciata" e si continua ad aspettare. Qualcosa tipo (tenendo conto che non so quale lettore e quindi quale libreria RFID stia utilizzando):
Codice: Seleziona tutto
... <omissis>...
// ammesso che la funzione di libreria si chiami ho_letto_una_carta_RFID(), che restituisce True se c'e' stata una strisciata
bool strisciata;
unsigned long identificatore; // Suppongo che l'identificatore sia un unsigned long ma dipende dal sistema lettore/carte
unsigned long autorizzato = 123456; // E questo e' l'identificatore "autorizzato"
// Continua ad aspettare fino a che non avviene una strisciata
do {
strisciata = ho_letto_una_carta_RFID();
} while (strisciata == false);
// Se siamo arrivati qui, e' perche' qualcuno ha passato una carta RFID sul lettore
// In questo caso, recuperiamo l'identificatore con l'apposita funzione di libreria che chiamero' recupera_identificatore_della_carta()
identificatore = recupera_identificatore_della_carta();
// A questo punto si controlla se la carta e' nella lista degli abilitati, per esempi
if (identificatore == autorizzato ) {
cambia_stato_del_LED();
}
// Dopo di che si ricomincia da capo...
Re: sketch rfid
Buonasera la ringrazio molto per la risposta, ho appena iniziato con arduino quindi non sono molto esperto,(per niente) La libreria mfrc522, ho preso spunto da uno sketch scaricato in rete, però era di un apriporta quindi non mi andava bene perche accendeva il relé e lo spegneva io dovevo appunto spegnere e accendere, é da un po che provo ma fin ora passo la tag giusta, si accende ma non si spegne... Eppure sembra tutto giusto
Re: sketch rfid
Però con questo esempio mi ha gia dato un aiuto
Ultima modifica di sandro.s il mar 6 apr 2021, 21:25, modificato 1 volta in totale.
Re: sketch rfid
Magari potrebbe postare lo sketch "incriminato"...
Re: sketch rfid
Mi puo indicare gentilmente come fare, allego il file .ino?
Re: sketch rfid
Secondo me il sistema piu' semplice e' il seguente:
Dentro la IDE di Arduino:
Edit->Select All (abbreviazione "Control+A");
Edit->Copy for forum (abbreviazione "Control+Shift+C");
Dentro il forum, editando la risposta, nel punto scelto per il codice:
"Control+V") (oppurt Right-Click e poi selezionare "Paste").
In realta' dato che i file .ino sono puri e semplici file di testo uno potrebbe anche aprirli con un editore qualsiasi, ma insomma...
Dentro la IDE di Arduino:
Edit->Select All (abbreviazione "Control+A");
Edit->Copy for forum (abbreviazione "Control+Shift+C");
Dentro il forum, editando la risposta, nel punto scelto per il codice:
"Control+V") (oppurt Right-Click e poi selezionare "Paste").
In realta' dato che i file .ino sono puri e semplici file di testo uno potrebbe anche aprirli con un editore qualsiasi, ma insomma...
Re: sketch rfid
Codice: Seleziona tutto
#include <SPI.h>
#include <RFID.h>
/* 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 {
Serial.println("Tessera non autorizzata");
accendiLed(ledRosso);
}
delay(delayRead);
}
}
// 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);
}
Re: sketch rfid
Vediamo un pochino che cosa fa il codice... Limitiamoci alla funzione loop(), visto che il problema e' che il LED si accende ma non si spenge e' meno probabile che sia un problema di inizializzazione.
Fino a qui, si tratta semplicemente di aspettare che qualcuno strisci una tessera e di leggere il codice. Ora vengono le cose interessanti.
OCCHIO! All'inizio del programma c'e' una istruzione
e quindi la condizione
si traduce in , ossia questo NON E' un confronto del livello del pin 2 con il livello LOW, ma del numero "2" sempre con LOW! La variabile c'e' e si chiama "stato", ma non viene utilizzata in questo confronto! Invece, viene utilizzata subito dopo. Ma ricordiamoci che la condizione qui sopra e' sbagliata.
Questa istruzione fa quello che deve fare ma puo' confondere, dato che "LOW" e "HIGH" non sono valori booleani ma i numeri "0" e "1". Comunque, funziona.
Questo copre il caso in cui il rele era spento (stato iniziale), e provvede ad accenderlo.
Qui pero', o mancano delle righe di codice, oppure c'e' una mancanza di gestione del caso che il rele fosse acceso. L'struzione defe riferirsi per forza al caso opposto di pero' le azioni che la seguono si riferiscono ad un molto, ma molto piu' in alto. Temo che ci sia stato un errore di copia-incolla.
Ci vorrebbe invece
Tra l'altro adesso all'interno della funzione loop() compaiono delle definizioni di funzioni, quindi suggerirei di ricontrollare il codice sorgente originale, secondo me manca un pezzetto.
Codice: Seleziona tutto
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);
Codice: Seleziona tutto
if (verificaCodice(codiceLetto, codiceAutorizzato1) || verificaCodice(codiceLetto, codiceAutorizzato2)
|| verificaCodice(codiceLetto, codiceAutorizzato3)) {
Serial.println("Tessera autorizzata");
accendiLed(ledVerde);
if (rele == LOW) {
Codice: Seleziona tutto
#define rele 2
Codice: Seleziona tutto
if (rele == LOW)
Codice: Seleziona tutto
if (2 == LOW)
Codice: Seleziona tutto
stato = !stato;
Codice: Seleziona tutto
if (stato == LOW) {
digitalWrite (rele, HIGH);
Serial.println ("acceso");
delay (300);
Codice: Seleziona tutto
} else {
Serial.println("Tessera non autorizzata");
accendiLed(ledRosso);
}
delay(delayRead);
}
}
Codice: Seleziona tutto
} else {
Codice: Seleziona tutto
if (stato == LOW)
Codice: Seleziona tutto
if (verificaCodice(codiceLetto, codiceAutorizzato1) ||...
Ci vorrebbe invece
Codice: Seleziona tutto
} else { // se (stato == HIGH)
digitalWrite (rele, LOW);
Serial.println ("spento");
delay (300);
}
// E adesso gestiamo il caso in cui non abbiamo riconosciuto l'identificatore della tesserina...
Re: sketch rfid
Buonasera, grazie ancora per l'aiuto che mi sta dando, comunque nel codice originale nell' } else { non c'era nulla poiché si commutava il rele e si spegneva
digitalWrite(rele,HIGH);
Delay(1000)
DigitalWrite(rele,LOW)
A me serve di inserire quella parte di codice che mi ha indicato, avevo comunque provato ma in quel caso se non ricordo male non accendeva il led, stasera riprovo a modificare il codice e provo, grazie ancora
digitalWrite(rele,HIGH);
Delay(1000)
DigitalWrite(rele,LOW)
A me serve di inserire quella parte di codice che mi ha indicato, avevo comunque provato ma in quel caso se non ricordo male non accendeva il led, stasera riprovo a modificare il codice e provo, grazie ancora