sketch rfid

Progetti Arduino
Avatar utente
pgv
Messaggi: 483
Iscritto il: gio 17 set 2020, 13:16
Località: Ginevra

Re: sketch rfid

Messaggio da pgv »

Premetto che non ho un lettore RFID (e qui nemmeno un Arduino) e quindi non posso effettuare i test, ma il codice che segue per lo meno compila, ha un po' di commenti per seguire il filo logico, e potrebbe funzionare:

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);
}
A parte un paio di cambiamenti estetici a due funzioni di supporto - verificaCodice() e accendiLed() - che mi sono permesso di modificare a mio gusto (e forse per renderle piu' facili da mantenere e da riutilizzare), mi sono limitato ad aggiungere dei commenti in chiusura delle parentesi { } per meglio seguire il filo logico, e successivamente a spostare le istruzioni laddove mi sembrava stessero meglio. Non garantisco nulla.
sandro.s
Messaggi: 15
Iscritto il: lun 5 apr 2021, 22:53

Re: sketch rfid

Messaggio da sandro.s »

Salve, ancora non so come ringraziarla per il tempo che mi sta dedicando, lo provo prima possibile, apprezzo molto i cambiamenti e grazie dei commenti, si capisce bene cosa fa lo sketch, non potevo chiedere di meglio,
sandro.s
Messaggi: 15
Iscritto il: lun 5 apr 2021, 22:53

Re: sketch rfid

Messaggio da sandro.s »

Buongiorno, lo sketch funziona perfettamente, le sono infinitamente grato, peró la sua modifica di lampeggiaLed non la fa, infatti nell'else{ if (verificacodice) c'e
accendiLed(ledRosso);
Delay(2000);
}
dovrei sostituirlo con il
LampeggiaLed fatto da lei?
Avatar utente
pgv
Messaggi: 483
Iscritto il: gio 17 set 2020, 13:16
Località: Ginevra

Re: sketch rfid

Messaggio da pgv »

Si tratta di un istinto che viene dopo qualche annetto di programmazione... Scrivere il codice in modo da poterlo mantenere e riciclare in futuro.
Non ho modificato la chiamata perche' anche cosi' va benissimo, pero' per il futuro una funzione un pelo piu' "generale" puo' fare comodo, magari per poter cambiare la dirata del lampeggio a seconda delle situazioni. Si serva pure dell'una o dell'altra funzione come preferisce, ribadisco che non ci sono differenze pratiche di funzionamento, solo nella manutenibilita' e riusabilita' del codice in futuro.
sandro.s
Messaggi: 15
Iscritto il: lun 5 apr 2021, 22:53

Re: sketch rfid

Messaggio da sandro.s »

;) la ringrazio ancora
Guido
Messaggi: 1443
Iscritto il: dom 18 mar 2018, 20:21

Re: sketch rfid

Messaggio da Guido »

pgv ha scritto: dom 11 apr 2021, 12:35 Si tratta di un istinto che viene dopo qualche annetto di programmazione... Scrivere il codice in modo da poterlo mantenere e riciclare in futuro.
Comportamento sacrosanto valido anche in altri linguaggi .
Rispondi