sketch rfid

Progetti Arduino
sandro.s
Messaggi: 15
Iscritto il: lun 5 apr 2021, 22:53

sketch rfid

Messaggio da sandro.s »

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?
Avatar utente
pgv
Messaggi: 484
Iscritto il: gio 17 set 2020, 13:16
Località: Ginevra

Re: sketch rfid

Messaggio da pgv »

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):

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

sandro.s
Messaggi: 15
Iscritto il: lun 5 apr 2021, 22:53

Re: sketch rfid

Messaggio da sandro.s »

Buonasera la ringrazio molto per la risposta, ho appena iniziato con arduino quindi non sono molto esperto,(per niente) :lol: 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
sandro.s
Messaggi: 15
Iscritto il: lun 5 apr 2021, 22:53

Re: sketch rfid

Messaggio da sandro.s »

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.
Avatar utente
pgv
Messaggi: 484
Iscritto il: gio 17 set 2020, 13:16
Località: Ginevra

Re: sketch rfid

Messaggio da pgv »

Magari potrebbe postare lo sketch "incriminato"...
sandro.s
Messaggi: 15
Iscritto il: lun 5 apr 2021, 22:53

Re: sketch rfid

Messaggio da sandro.s »

Mi puo indicare gentilmente come fare, allego il file .ino?
Avatar utente
pgv
Messaggi: 484
Iscritto il: gio 17 set 2020, 13:16
Località: Ginevra

Re: sketch rfid

Messaggio da pgv »

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...
sandro.s
Messaggi: 15
Iscritto il: lun 5 apr 2021, 22:53

Re: sketch rfid

Messaggio da sandro.s »

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);
    }
Avatar utente
pgv
Messaggi: 484
Iscritto il: gio 17 set 2020, 13:16
Località: Ginevra

Re: sketch rfid

Messaggio da pgv »

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.

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);
Fino a qui, si tratta semplicemente di aspettare che qualcuno strisci una tessera e di leggere il codice. Ora vengono le cose interessanti.

Codice: Seleziona tutto

    if (verificaCodice(codiceLetto, codiceAutorizzato1) || verificaCodice(codiceLetto, codiceAutorizzato2)
        || verificaCodice(codiceLetto, codiceAutorizzato3)) {
      Serial.println("Tessera autorizzata");
      accendiLed(ledVerde);
      if (rele ==  LOW) {
OCCHIO! All'inizio del programma c'e' una istruzione

Codice: Seleziona tutto

#define rele 2
e quindi la condizione

Codice: Seleziona tutto

if (rele == LOW) 
si traduce in

Codice: Seleziona tutto

if (2 == LOW)
, 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.

Codice: Seleziona tutto

        stato = !stato;
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.

Codice: Seleziona tutto

        if (stato == LOW) {
          digitalWrite (rele, HIGH);
          Serial.println ("acceso");
          delay (300);
Questo copre il caso in cui il rele era spento (stato iniziale), e provvede ad accenderlo.

Codice: Seleziona tutto

        } else {
          Serial.println("Tessera non autorizzata");
          accendiLed(ledRosso);
        }
        delay(delayRead);
      }
    }
Qui pero', o mancano delle righe di codice, oppure c'e' una mancanza di gestione del caso che il rele fosse acceso. L'struzione

Codice: Seleziona tutto

} else {
defe riferirsi per forza al caso opposto di

Codice: Seleziona tutto

if (stato == LOW)
pero' le azioni che la seguono si riferiscono ad un

Codice: Seleziona tutto

if (verificaCodice(codiceLetto, codiceAutorizzato1) ||...
molto, ma molto piu' in alto. Temo che ci sia stato un errore di copia-incolla.
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...
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.
sandro.s
Messaggi: 15
Iscritto il: lun 5 apr 2021, 22:53

Re: sketch rfid

Messaggio da sandro.s »

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
Rispondi